负载均HAProxy和Varnish

简介:

一、HAProxy (反向代理)

1、名词解释:

提供高可用性、负载均衡以及基于TCP/HTTP(反向代理mysql等所有支持tcp的应用)应用的代理,支持虚拟主机,免费可靠的解决方案。可操作性优于nginx,但是消耗了更多的资源。是工作在七层上的基于事件驱动的单一进程来响应众多请求的负载均衡服务器,并且有web管理界面便于监督。功能上更专注于反向代理,比nginx有更丰富和简单的反向代理功能,但是相对内存消耗也更大一些。

反向代理的基本工作模式,首先接受用户请求,然后自身通过负载均衡算法计算发往后端主机的ip地址,然后进行类似NAT的地址转换发送到后端服务器,后端服务器接收并处理完毕后发送给反向代理服务器,并由反向代理服务器重新封装发送给客户端。

lvs和nginx、haproxy等七层负载均衡服务器之间的区别就是lvs工作在四层,有有着更高的性能优势,但是管理功能上不如nginx、haproxy。所以lvs的优势就是转发的高性能,以及对socket的无限制使用,也就是说对于并发连接请求没有限制,而nginx、haproxy对于并发连接是由最高要求的,就是65535个,这个是死的,不可改变的。

nginx的反向代理基本配置,首先创建upstream模块,并在里面指定负载均衡算法,后端服务器等,然后在server或者local中通过proxy_pass来和upstream创建关系。

816567.tmp

2、特点:

各个版本有不同的特性,倾向于1.4及其后的版本

centos6.4以后整合在系统中,不需要安装

使用弹性二叉树的数据结构

可以通过URL进行负载均衡,提高缓存命中率。(重要特性)

若要获得最佳性能,需要使用linux2.6内核或者打了epoll补丁的linux2.4的版本,此时使用的是epoll。haproxy1.1默认使用的polling系统为select(),其处理文件数达到数千个时性能会急剧下降。

haproxy借助以下几个常见的技术实现性能的最大化

1、单进程事件驱动显著降低了上下文切换的开销和内存占用

2、bigo(1)事件检查器准许其在高并发连接中对任何的任何事件实时即时探测

3、单缓冲机制可以在不复制任何数据的情况下完成读写操作,节省cpu时钟周期

4、借助linux2.6的splice()系统调用,实现零复制转发,及零复制启动

5、MRU内存分配器在在固定大小的内存池中实现即时内存分配

6、优化的HTTP首部分析,避免了HTTP首部分析过程中重读问题

3、haproxy工作位置:

web服务器前面

应用服务器前

数据库服务器前

179280.tmp


二、配置详解


1、haproxy的配置处理顺序:

1、命令行参数

2、global(全局)配置段:定义进程工作特性、日志文件及其他全局配置特性

3、proxy(代理)相关配置段:包括

default

listen(可以直接将前后端定义在此位置)

frontend(定义面向前端)

use-backend(粘合前后端)

default-backend(粘合前后端)

backend(定义面向后端)

160702.tmp

2、全局段


2.1、haproxy进程管理及安全相关的参数:

1、chroot,修改haproxy的工作目录到指定目录,提高安全性

2、daemon,以守护进程的方式工作于后台

3、nbproc,启动进程格式,默认1个,建议也是1个

4、ulimit-n,每个进程最大打开的文件描述符个数,通常会自动计算,这个也不用动

5、node,用于定义当前工作节点的名称

6、pidfile

2.2、性能调整的相关参数:(基本保持参数默认值即可)

1、maxconn,进程接受的最大并发连接数

2、maxpipes,haproxy使用pipe完成基于内核的tcp报文重组,用于设定每个进程允许的最大pipe个数,通常不用调整

3、nosplice,禁止linux套接字上使用内核tcp重组,不禁用

4、spread-checks,设置检查后端服务器的时间间隔

5、tune.chksize,设置缓冲区大小,单位是字节

3、代理段属性http://cbonte.github.io/haproxy-dconv/1.7/configuration.html#4.1

default:用于定义所有其他配置段提供默认参数

frontend:用于定义一系列监听的套接字,可接受客户端请求并与之建立联系

backend:用于定义一系列“后端”服务器,代理会将前端客户端的请求发送到后端服务器上。

listen:通过关联“前端”和“后端”定义了一个完整的代理,通常只对tcp流量有用,通常定义了listen不用再定义frontend和backend。

3.1常见参数:

balance 负载均衡

负载均衡算法

roundrobin:基于权重进行轮叫,在服务器处理时间均衡的情况下,这种是最平衡,公平的算法。权重会系统动态调整,每个后端服务器最大接受4128个连接。

static-rr:基于权重的轮叫和roundrobin类似,对后端服务器没有连接限制。

leastconn:新的连接发送到具有最少连接数目的后端服务器,适用于长连接。不适用于http。

source:将请求的源地址进行hash计算,并由后端服务器的权重总数相除后发送到匹配的服务器,优点是同一个ip地址的客户端请求发送到同一个后端服务器上。

uri:对uri的左半部分(问号之前)或者整个uri进行hash运算,并由服务器的权重总数相除后派发到后端匹配的服务器,可以对同一个uri的请求总是派发到某一个特定的服务器,此算法常用于代理缓存,反病毒代理。仅适用于http后端服务器场景。

uri-param:通过<argusent>为uri指定的参数在每个http get请求中将会被检索,如果找到了指定的参数并通过等于号被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发到指定的服务器,此算法可以通过跟踪请求中的用户标识进而确定同一个用户ID的请求被送往同一个特定的服务器。

hdr:对于每个http请求,通过<name>指定的http首部将会被检索,如果相应的首部没有出现或者没有有效值,则使用轮叫算法处理请求。

bind <address>:<port_range>:指定监听的端口和ip地址

address可以是主机名,IP地址,使用*或者0.0.0.0表示监听当前系统的所有IP地址

mode {tcp|http|health}

设定实例运行的协议或模式,当实现内容交换时,前端和后端必须工作在同一种模式,否则无法启动实例。

tcp:运行于纯tcp模式,在客户端和服务器之间建立一个全双工的链接,且不会对7层报文做任何类型的检查,默认模式,常用于SSL、SSH、SMTP中。

http:运行于http模式,客户端请求在转发到后端服务器之前被深度分析,所有不与RFC格式兼容的请求都被拒绝

health:运行于health模式,其对入站请求仅仅响应“ok”信息,并关闭连接,且不会记录任何日志信息,此模式将用于响应外部组件的健康状态检查请求,就目前讲,此模式已经作废

hash-type

用于将hash码映射到后端服务器的方法,其不能用于frontend区段,可用方法有mapbased和consistent,大多数推荐使用map-based方法。consistent适用于后端是缓存服务器的情况。

log global

log <address> <facility>[ <level> <minlevel> ]

为每个实例启动事件和流量日志,适用于全部区段,每个实例最多指定两个log参数

global:当前实例的日志系统参数同“global”段中的定义时,每个实例仅能定义一次“log global”语句,且其没有任何额外参数。

address:定义日志发往的位置,格式可以使ip:port的形式,其中port为UDP协议端口,默认是514

facility:可以为syslog系统标准的facility之一

level:定义日志等级,默认是所有信息,指定级别时,所有等于和高于此级别的日志被记录并发送

maxconn

设定一个前端的最大并发连接数,因此,其不能用于backend区段,此值不能超过“global”端的定义值,需要注意的是,haproxy为每个连接维持两个缓冲,每个缓冲大约8kB,再加上其他数据,每个连接大约占17KB的RAM空间,这就意味着经过适当优化后,有这1GB的可用RAM空间时将能够维持40000-50000的并发数。默认是2000

default_backend <backend>

在没有匹配的“use_backend”规则时为实例指定默认后端,因此不适用于backend区段,在“frontend”和“backend”之间进行内容交换时,通常使用“use_backend”定义其匹配规则,而没有被规则匹配的请求将由此参数指定的后端接收。

server <name> <address>[<:port> param]

为后端声明一个server,因此,不能用于defaults和frontend区段。

name:为服务器指定一个内部的名称,其将出现杂日志和警告信息中

address:此服务器的IP地址

port:指定将连接请求发往的此服务器时的目标端口

param:可以使用的参数

backup:设定为备用服务器,仅仅在负载均衡场景中的其他server均不可用时启动此server

check:启动对此server执行健康状态检查,其可以借助于额外的其他参数完成更细致的设定,如:

inter <delay>:设定健康状态检查时的时间间隔,单位为毫秒,默认2000,可以使用fastinter和downinter来根据服务器端状态优化此时间延迟。

rise<count>:设定健康状态检查时,其离线的server从离线状态到正常状态需要成功检查的次数

fall<count>:确认server从正常状态到不可用状态需要检查的次数

cookie <value>:为指定server设定cookie值,此值将在请求入站时被检查,第一次为此值挑选的server将在后续的请求中被选中,其目的是实现持久链接的功能。

maxconn<maxconn>:指定此服务器接受的最大并发连接数,如果发往此服务器的连接数高于此设定的值,将放置到请求队列,等待其他连接被释放。

maxqueue<maxqueue>:设定请求队列的最大长度

observe<mode>:通过观察服务器的通信状态来判断健康状态,默认禁用,使用的参数包括“layer4”和“layer7”,http使用“layer7”

redir <prefix>:启用重定向功能,将发往此服务器的GET和HEAD请求均以302状态码响应

weight<weight>:权重,默认是1,最大256,0表示不参与负载均衡

http状态检查方法:

option httpchk

option httpchk <uri>

option httpchk <method><uri>

option httpchk <method><uri><version>

capture request header <name> len <length>

捕获并记录指定的请求手表最近一次出现时的第一个值,仅仅用于“frontend”和“listen”区段,捕获的首部值使用花括号{}括起来后添加进日志中,如果需要捕获多个首部值,他们将以指定的次序出现在日志中,并以“|”作为分隔符,不存在的首部记录为空字符串,最常需要捕获的首部信息包括在虚拟主机环境中使用的“host”,上传请求首部中的“content-length”,快速区分真实用户和网络机器人的“user-agent”,以及代理环境中记录真实请求来源的“x-forword-for”。

name:要捕获的首部的名称,此名称不区分大小写

length:指定首部值时锁记录的精确长度,超出部分被忽略丢弃。

可以捕获的请求首部没有个数限制,但每个捕获的记录最大64个字符,为保证同一个frontend中日志格式的统一,首部捕获只能在frontend中定义。

capture response header

捕获并记录响应首部,格式和要点同请求首部

stats enable

用于基于程序编译时默认设置的统计报告,不能用于“frontend”区段,以下是默认配置:

stats uri:/haproxy?stats

stats realm:”HAProxy statistics"

stats auth: no authentication

stats scope: no restriction

建议设置参数而不是使用默认值

stats hide-version

启用统计报告并隐藏haproxy版本信息,不能用于“frontend”区段。

stats realm <realm>

启动统计报告并高精度认证领域,实现http基本认证时显示在浏览器中的领域名称,用于提示用户输入一个用户名和密码

stats scope <name>

启动统计报告并限制报告的区段,仅显示其列出的区段的报告信息

stats auth <user>:<passwd>

启动带认证的统计报告功能并授权一个用户账户。

stats admin {if|unless} <cond>

指定的条件满足时启动统计报告页面的管理级别功能,它允许通过web接口启动和禁用服务器。

样例:

backend stats——localhost

stats enable

stats admin if localhost

option httplog [clf]

启动记录http请求,会话状态和计时器的功能

clf:使用clf格式来替代http格式,通常不用。

optin logasap

启用或者禁用提前将http请求计入日志,不能用于“backend”区段

option forwardfor 

允许在发往后端服务器的请求首部插入“x-forwarded-for”首部(真实客户机地址信息)

三、安装和部署

centos6.5及以上版本系统可以通过yum方式直接安装haproxy,可也从官网下载最新版本进行安装。

我这里就是yum安装并进行演示。

环境说明:

haproxy服务器:

前端ip:192.168.4.206

后端ip:10.40.0.226

后端httpd服务器:

ip地址:10.40.0.228

后端httpd服务器:

IP地址:10.40.0.229

1、haproxy基本安装文件信息

[root@node6.dtedu.com ~]# rpm -ql haproxy

/etc/haproxy

/etc/haproxy/haproxy.cfg 配置文件

/etc/logrotate.d/haproxy 日志轮转

/etc/rc.d/init.d/haproxy 启动脚本

/etc/sysconfig/haproxy

/usr/bin/halog 日志分析工具

/usr/bin/iprange

/usr/sbin/haproxy





本文转自 blackstome 51CTO博客,原文链接:http://blog.51cto.com/137783/1968803,如需转载请自行联系原作者

相关实践学习
部署高可用架构
本场景主要介绍如何使用云服务器ECS、负载均衡SLB、云数据库RDS和数据传输服务产品来部署多可用区高可用架构。
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
27天前
|
缓存 运维 前端开发
LNMP详解(十)——Nginx负载分担实战
LNMP详解(十)——Nginx负载分担实战
14 1
|
11天前
|
负载均衡 算法 网络协议
LVS、Nginx和HAProxy负载均衡器对比总结
LVS、Nginx和HAProxy负载均衡器对比总结
|
2月前
|
缓存 负载均衡 网络协议
代理服务器之squid、lvs、nginx、haproxy之间的区别
根据不同的需求和场景,选择适合的代理服务器可以提升应用性能和可用性。
48 4
|
10月前
|
缓存 负载均衡 前端开发
Nginx+HAproxy+Keepaliaved缓存搭建
前端服务有大量的数据需要从后端获取,造成网络带宽的压力,同时也降低了服务性能。为了解决类似的问题, 可以在访问前端时,使用nginx缓存多次需要访问的数据
|
缓存 监控 算法
nginx并发怎么看?负载怎么看?
还在等什么,快来一起讨论关注吧,公众号【八点半技术站】,欢迎加入社群
nginx并发怎么看?负载怎么看?
|
缓存 应用服务中间件 nginx
LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
LVS、Nginx、HAproxy有什么区别?工作中你怎么选择?
394 0
|
前端开发 JavaScript Unix
haproxy 动静分离实例
code from www.361way.com global log 127.0.0.1 local2 chroot /var/lib/haproxy pidfile /var/run/haproxy.
802 0
|
Web App开发 应用服务中间件 Linux
|
负载均衡 关系型数据库 MySQL