haproxy


1. 简介

haproxy是一个代理服务器,提供高可用性和负载均衡,以及对基于TCP和HTTP的应用的代理。非常适合高负载的和需要在七层进行处理的场景。它实现了一种单进程、事件驱动的模型。可以支持数万的并发连接。之所以说它在性能上表现优越主要是因为它采用了当下比较先进的技术,例如:epoll、splice、Single-buffering 、MRU、弹性二叉树等。


2. Harpoxy所支持的代理模型:

● TCP

● HTTP

● Health

3. 所支持的负载均衡算法:

   roundrobin:

       即动态轮询,所谓轮询,即所定义的服务器根据权重轮流进行派发请求;所谓动态,即服务器的权重可以在运行的时候进行调整,无需重启服务,以支持服务器的慢启动功能。

   

   static-rr:

       静态轮询,不支持在运行中调整权重。

   

   leastconn:

       动态算法,表示哪个后端服务器接收的连接少就使用哪个服务器。这种算法非常适合长会话的服务,比LDAP、SQL等。而HTTP协议使用的是短会话,因此不适合使用此算法。

   

   source:

       默认为静态方法,可以通过修改hash-type的值将其改为动态方法。表示同一个客户端的请求发往同一个后端服务器,这种算法通常用于无cookie功能的TCP的代理模型中。它的哈希表是以客户端IP地址为键的。

   

   hash-type即哈希类型分两种:

       map-based :是静态哈希,也就是说当服务器组中的服务器数量发生改变的时候,所有之前哈希表中,客户端与服务器的一一对应的映射关系都会失效。

       consistent: 是动态哈希,也就是说当服务器组中的服务器数量发生变化的时候,之前所建立的哈希表中,客户端与服务器的一一对应的映射关系失效的只是一部分。

   

   uri:

       默认为静态方法,可以通过修改hash-type的值将其改为动态方法。哈希表以URI为键,比如,/serv/login.php?lang=en&profile=2,哈希的键即为/serv/login.php(问号左边的部分)。如果带上参数“whole”,则哈希的键即为整个URI。适合用于后端为代理缓存服务器的场景。此算法还有两个选项参数:len和depth。len表示从"/"开始的几个字符作为哈希键。depth表示从"/"开始往后几个最多几级目录的深度作为哈希的键。

   

   

   url_param:

       默认为静态方法,可以通过修改hash-type的值将其改为动态方法。所哈希的键为URI中问号右边的部分。它通过<argument>为URL指定的参数在每个HTTP GET请求中将会被检索;如果找到了指定的参数且其通过等于号“=”被赋予了一个值,那么此值将被执行hash运算并被服务器的总权重相除后派发至某匹配的服务器;此算法可以通过追踪请求中的用户标识进而确保同一个用户ID的请求将被送往同一个特定的服务器,除非服务器的总权重发生了变化;如果某请求中没有出现指定的参数或其没有有效值,则使用轮叫算法对相应请求进行调度。

   

   

   hdr(<name>):

       默认为静态方法,可以通过修改hash-type的值将其改为动态方法。对于每个HTTP请求,通过<name>指定的HTTP首部将会被检索;如果相应的首部没有出现或其没有有效值,则使用轮叫算法对相应请求进行调度;其有一个可选选项“use_domain_only”,可在指定检索类似Host类的首部时仅计算域名部分。比如"haproxy.1wt.eu",仅计算1wt。


   rdp-cookie:

   rdp-cookie(name):

   

   

   

   

4. 环境介绍:

   OS:CentOS6.5

   前端haproxy服务器:

   eth0:172.16.0.11

   eth1: 192.168.0.11

   后端web服务器:

   eth0: 192.168.0.12

   eth0: 192.168.0.13

   软件包:

   为CentOS自带的rpm包:

   haproxy-1.4.24-2.el6.x86_64


5. 配置文件介绍

主配置文件:

/etc/haproxy/haproxy.cfg

配置文件组成:

全局段global常用参数:

   log    127.0.0.1     local2

   #记录日志,不过要在要在/etc/rsyslog.conf中打开对UDP的支持。然后在定义local2的日志存放路径。

   chroot     /var/lib/haproxy

   #虚拟根目录,为了增强安全性

   pidfile    /var/run/haproxy.pid  

   maxconn    4000

   user    haproxy

   group    haproxy

   daemon #以后台守护进程的方式启动haproxy

   stats socket /var/lib/haproxy/stats

   #开启这些功能,可以在命令行下,来查询前端和后端服务器的状态信息。例如:echo "show info" | socat unix-connect:/var/lib/haproxy/stats stdio 还可以使用show stats、show sess、show errors等

代理段:

1、 defaults:

常用参数:

mode                    http

#表示代理模式为http

log                     global

#表示会记录每个事件和流量

option                  httplog

#表示记录的是http的请求,会话和时钟。若代理模式是tcp的则为option tcplog。

option                  dontlognull

#表示不记录空连接

option http-server-close

#表示支持面向客户端的keep-alive,而对于面向后端服务器的keep-alive的支持,在1.5的发行版中或许会出现。虽然客户端到haproxy服务器的请求在keep-alive超时之前使用的都是同一个连接,但是负载均衡到后端的每个请求还是要进行检查并记录日志的。否则只会记录第一个请求信息。

option forwardfor       except 127.0.0.0/8

#表示在发往后端服务器的请求上添加一个名为"X-Forwarded-For" 的头部信息,用于记录客户端IP。except表示由本机发往后端服务器的请求中不用添加此首部。

option                  redispatch

#表示当连接后端失败的时候,重新分配请求道其他的服务器。

retries                 3

#表示连接失败后,需要重新连接其他后端服务器几次。

timeout http-request    10s

#表示一个完整的http请求的超时时间,也就是说当请求的头部的第一个字节被接收后到头部信息全部接收完所经过的时长。这个时间仅用于请求的首部,也就是说只要首部信息接收后,这个时间就没用了。不会管请求之后的数据(即body部分)是否被接收。

timeout queue           1m

#表示当连接的数量超过maxconn的设置数值后,就会对多出的请求进行排队等候,如果等待的时间超过此参数设置的值,那么就认为请求无法得到响应了。

timeout connect         10s

#表示haproxy服务器与后端服务器建立连接的超时时间。

timeout client          1m

#表示定义客户端发出请求到接收到haproxy服务器响应之间的最大时长。它的值一般与timeout server的值相同。

timeout server          1m

#表示定义haproxy服务器从发送请求的头部开始到后端服务器响应到达期间的最大时长。

timeout http-keep-alive 10s

#用来定义当一个响应发出之后,要等待下一个新请求的到来的时长。

timeout check           10s

#用来定义对后端进行做健康监测的超时时间。

maxconn                 3000

#最大可以接收的连接数。

2、listen

3、frontend

4、backend


6. 功能配置

1、负载均衡

frontend webs

bind *:80

default_backend webserver

backend webserver

balance roundrobin

server web1 192.168.0.12 check weight 1 maxconn 2000

server web2 192.168.0.13 check weight 1 maxconn 2000

2、动静分离

frontend  webs

bind *:80

acl     static   path_beg       -i /static /p_w_picpaths /javascript

acl     static  path_end        -i .html .jpg .png .gif .ico .css .js

use_backend     web1    if static

default_backend   web2

backend web1

cookie SERVERID insert indirect #用来确定哪个后端服务器进行了响应。

server      web1 192.168.0.12:80 cookie A check weight 1 maxconn 5000

backend web2

cookie SERVERID insert indirect

server      web2 192.168.0.13:80 cookie B check weight 1 maxconn 2000

3、状态输出

listen stats

mode    http

bind    *:1080

stats    enable

stats    hide-version

stats    uri/stats

stats    realmHaproxy\ Statistics

stats    authadmin:admin

stats    adminif TRUE

4、会话保持

● 基于IP的会话持久

balance source

● 基于cookie的会话持久

cookie SERVERID insert indirect nocache

server      web1 192.168.0.12:80 cookie A

● 基于session的会话持久

apsession session_name len 64 timeout 5h request-learn