负载均衡集群HAProxy讲解篇

一、HAProxy组成部分

Haproxy配置中分成五部分内容,当然这些组件不是必选的,可以根据需要选择作为配置。

1.global:参数是进程级的,通常和操作系统(OS)相关。这些参数一般只设置一次,如果配置无误,就不需要再次配置进行修改;

2.default:配置默认参数的,这些参数可以被利用配置到frontendbackendlisten组件;

3.frontend:接收请求的前端虚拟节点,Frontend可以根据规则直接指定具体使用后端的backend(可动态选择)

4.backend:后端服务集群的配置,是真实的服务器,一个Backend对应一个或者多个实体服务器;

5.listenFrontendBackend的组合体。

二、Global部分讲解

1log 127.0.0.1 local0 info#log表示日志配置,local0表示日志设备,info表示日志级别。

2maxconn 4096#haproxy进程可接受的最大并发连接说,等同于ulimit n

3uid 99#HAProxy运行的用户uid

4gid 99#HAProxy运行的组uid

5daemon#后台形式运行haproxy

6nbproc 1 #开启的进程数

7pidfile /usr/local/haproxy/haproxy.pid#指定haproxy进程文件。

三、defaults部分讲解

         1log global #应用全局的日志配置。

         2mode http#所处理的类别,默认采用http模式,可配置成tcp4层消息转发。

         3option httplog#日志类别。

         4retries 3#连接后端服务器失败重试次数,连接失败3次,认为后端服务器不可用。

         5option redispatch#当后端对应的服务器挂掉后,强制定向到其他健康的服务器。

         6option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

         7option dontlognull #保证HAProxy不记录上级负载均衡发送过来的用于检测状态没有数据的心跳包。

         8maxconn 2000#默认的最大连接数。

         9timeout connect 5000 #连接超时,根据情况设定,时间太短,可能会有408错误。

         10timeout client 50000#客户端连接超时。

11timeout server 50000#服务器回应超时。

12timeout check 30s #心跳检测超时。

13timeout http-keep-alive10s #存活请求时间为超时时间。

14timeout http-request 30s #请求超时时间。

15timeout queue 1m #队列超时间。

16contimeout 5000 # 设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容。

17clitimeout 50000 #设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容。

18 srvtimeout 50000 #设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容。

四、frontend部分讲解

         1bind *:8080 #监听端口。

         2mode http #http7层模式。

         3option httplog #启用http日志格式。

         4option http-server-close #对于某些server端不支持http长连接的情况,利用这个参数可以使用客户端到haproxy是长连接,而haproxyserver端是短连接。

         5option forwardfor except 127.0.0.0/24 header X-Forwarded-For #后端服务器需要获得客户端的真实IP,将从Http Header中获得客户端IP.

         6option dontlognull #来防止记录 Alteo(4层负载均衡)发出的健康检测,如果一个 session 交互没有数据,这个 session就不会被记录。

         7option httpclose #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现。

         8default_backend htmpool #后端服务器池,真实服务器必须在backend中去定义。

五、backend部分讲解

         1mode http#所处理的类别,默认采用http模式,可配置成tcp4层消息转发。

         2option redispatch#当后端对应的服务器挂掉后,强制定向到其他健康的服务器。

         3option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接

         4balance leastconn#负载均衡算法。

         5cookie SERVERID#允许向cookie插入serverid,每台服务器的serverid可在下面server关键字中使用cookie

         6option httpchk HEAD /index.htm HTTP/1.0 #健康检查。

         7server#定义多个后端真实服务器。

                   例如:server web1 192.168.100.50:8085 cookie 1 weight 5 check inter 2000 rise 2 fall 3

                   7.1web1为后端真实服务器内部名称,随便定义。

                   7.2192.168.100.50为后端真实服务器ip地址。

                   7.38085为后端真实服务器连接的端口。

                   7.4cookie为后端服务器设定cookie值,实现持久性连接功能。cookie 1表示serverid1

                   7.5weight为服务器的权重。

                   7.6check为健康状态检查

                   7.7inter 2000为健康检查时间间隔。

                   7.8ruse 2为故障转换正常成功检查次数。

                   7.9fall 3为正常状态转换为故障需要检查的次数。

六、listen部分讲解

         1listen admi_statsd定义一个haproxy监控页面。

         2bind *:9188 #监听端口。

         3stats refresh 10s #统计页面自动刷新时间。

         4stats uri /haproxy-stats #统计页面url

         5stats realm Statistics\ Report #统计页面密码框上提示文本。

         6stats auth admin:123456 #统计页面用户名和密码设置。

         7stats hide-version #隐藏统计页面上HAProxy的版本信息。

         8stats admin if TRUE #手工启用/禁用,后端服务器(haproxy-1.4.9以后版本)

七、haproxy相关命令参数介绍

         haproxy  -f  <配置文件>  [-n 最大并发连接总数] [-N 每个侦听的最大并发数] [-d] [-D] [-q] [-V] [-c] [-p] [-s] [-l] [-dk] [-ds] [-de] [-dp] [-db] [-m <内存限制M>] [{-sf|-st} pidlist...]

        -d     前台,debug模式

        -D     daemon模式启动

        -q     安静模式,不输出信息

        -V     详细模式

        -c     对配置文件进行语法检查

        -s     显示统计数据

        -l     显示详细统计数据

        -dk    不使用kqueue

        -ds    不使用speculative epoll

        -de    不使用epoll

        -dp    不使用poll

        -db    禁用后台模式,程序跑在前台

        -sf    程序启动后向pidlist里的进程发送FINISH信号,这个参数放在命令行的最后

        -st    程序启动后向pidlist里的进程发送TERMINATE信号,这个参数放在命令行的最后