浅谈HAProxy配置参数及算法
1️⃣ HAProxy程序环境
- 程序:/usr/sbin/haproxy
- 主配置文件:/etc/haproxy/haproxy.cfg
- Unit file:/usr/lib/systemd/system/haprox
2️⃣ HAProxy配置文件结构
🅿 global:全局配置段
- 进程及安全配置相关的参数
- 性能调整相关参数
- Debug参数
- 官方文档:https://cbonte.github.io/haproxy-dconv/2.0/intro.html
- 配置参数如下
chroot #锁定运行目录
deamon #以守护进程运行
stats socket /var/lib/haproxy/haproxy.sock mode 600 level admin #socket文件
user, group, uid, gid #运行haproxy的用户身份
nbproc #开启的haproxy进程数,与CPU保持一致
nbthread #指定每个haproxy进程开启的线程数,默认为每个进程一个线程
cpu-map 1 0 #绑定haproxy 进程至指定CPU
maxconn #每个haproxy进程的大并发连接数
maxsslconn #每个haproxy进程ssl大连接数,用于haproxy配置了证书的场景下
maxconnrate #每个进程每秒创建的大连接数量
spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5(20%-50%)之间
pidfile #指定pid文件路径
log 127.0.0.1 local3 info #定义全局的syslog服务器;多可以定义两个
🅿 proxies: 代理配置段
官方文档:https://cbonte.github.io/haproxy-dconv/2.0/intro.html
- defaults:为frontend, listen, backend提供默认配置
- fronted:前端,相当于nginx, server {}
- backend:后端,相当于nginx, upstream {}
- listen:同时拥前端和后端
注:name字段只能使用”-”、”_”、”.”、和”:”,并且严格区分大小写,例如:Web和web是完全不同的两组服务器。
▶ 1.Proxies配置-defaults
defaults默认配置参数:
option redispatch #当server Id对应的服务器挂掉后,强制定向到其他健康的服务器
option abortonclose #当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接
option http-keep-alive #开启与客户端的会话保持
option forwardfor #透传客户端真实IP至后端web服务器
mode http #默认工作类型
timeout connect 120s #客户端请求到后端server的长连接等待时间(TCP之前)
timeout server 600s #客户端请求到后端服务端的超时超时时长(TCP之后)
timeout client 600s #与客户端的长非活动时间
timeout http-keep-alive 120s #session 会话保持超时时间,范围内会转发到相同的后端服务器
timeout check 5s #对后端服务器的检测超时时间
▶ 2.Proxies配置-frontend
frontend配置参数:
bind:指定HAProxy的监听地址,可以是IPV4或IPV6,可以同时监听多个IP或端口,可同时用于listen字段中
bind [<address>]:<port_range> [, ...] [param*]
listen http_proxy #监听http的多个IP的多个端口和sock文件
bind :80,:443,:8801-8810
bind 10.0.0.1:10080,10.0.0.1:10443
bind /var/run/ssl-frontend.sock user root mode 600 accept-proxy
listen http_https_proxy #https监听
bind :80
bind :443 ssl crt /etc/haproxy/site.pem
listen http_https_proxy_explicit #监听ipv6、ipv4和unix sock文件
bind ipv6@:80
bind ipv4@public_ssl:443 ssl crt /etc/haproxy/site.pem
bind unix@ssl-frontend.sock user root mode 600 accept-proxy
listen external_bind_app1 # 监听file descriptor
bind "fd@${FD_APP1}"
生产示例:
frontend WEB_PORT
bind :80,:8080
bind 192.168.7.102:10080,:8801-8810,192.168.7.101:9001-9010
mode http/tcp #指定负载协议类型
use_backend backend_name #调用的后端服务器组名称
▶ 3.Proxies配置-backend
- 定义一组后端服务器,backend服务器将被frontend进行调用
mode http/tcp #指定负载协议类型
option #配置选项
server #定义后端real server
注意:
- option后面加httpchk,smtpchk,mysql-check,pgsql-check,ssl-hello-chk方法
- 可用于实现更多应用层 检测功能
check #对指定real进行健康状态检查,默认不开启
addr IP #可指定的健康状态监测IP
port num #指定的健康状态监测端口
inter num # 健康状态检查间隔时间,默认2000 ms
fall num # 在连续的几次健康检查中失败,则视为dead(当机),默认为3次
rise num # 在连续的几次健康检查中成功,则视为operational(可操作的),默认为2次。
weight # 权重默认为1,大值为256,0表示不参与负载均衡
backup # 标记为backup的主机,不负载均衡,在服务器全挂了的时候才会调用,一般用来做sorry Server
disabled # 将后端服务器标记为不可用状态
redirect prefix http://www.studylinux.xyz/ #将请求临时重定向至其它URL,只适用于http模式
maxconn <maxconn>: # 当前后端server的大并发连接数
backlog <backlog>: # 当server的连接数达到上限后的后援队列长度
cookie <value>: # 为当前server指定cookie值,实现基于cookie的会话黏性
▶ 4.frontend+backend配置实例
#官网业务访问入口======================================
frontend WEB_PORT_80
bind 192.168.7.248:80
mode http
use_backend web_prot_http_nodes
backend web_prot_http_nodes
mode http
option forwardfor # 启用向发送到服务器的请求插入X-Forwarded-For标头
server 192.168.7.101 192.168.7.101:8080 check inter 3000 fall 3 rise 5
server 192.168.7.102 192.168.7.102:8080 check inter 3000 fall 3 rise 5
▶ 5.Proxies配置-listen
使用listen替换frontend和backend的配置方式:
#官网业务访问入口=====================================
listen WEB_PORT_80
bind 192.168.7.102:80
mode http
option forwardfor
server web1 192.168.7.101:80 check inter 3000 fall 3 rise 5
server web2 192.168.7.101:80 check inter 3000 fall 3 rise 5
3️⃣ HAProxy调度算法
- HAProxy通过固定参数balance指明对后端服务器的调度算法,该参数可以配置在listen或backend选项中。
- HAProxy的调度算法分为静态和动态调度算法,但是有些算法可以根据参数在静态和动态算法中相互转换。
- 官方文档:https://cbonte.github.io/haproxy-dconv/2.0/configuration.html#4
静态算法:按照事先定义好的规则轮询公平调度,不关心后端服务器的当前负载、链接数和相应速度等,且无法实 时修改权重,只能靠重启HAProxy生效。
- static-rr:基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量没有限制
- first:根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数达到上限,新请求才 会分配给下一台服务,因此会忽略服务器的权重设置
动态算法:基于后端服务器 状态进行调度适当调整,比如优先调度至当前负载较低的服务器,且权重可以在 haproxy运行时动态调整无需重启。
- roundrobin:基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs中的rr轮训模式,HAProxy 中的roundrobin支持慢启动(新加的服务器会逐渐增加转发数),其每个后端backend中多支持4095个real server,roundrobin为默认调度算法,且支持对real server权重动态调整。
- leastconn:加权的少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接少的优先调度(新客 户端连接),比较适合长连接的场景使用,比如MySQL等场景。
其他部分算法即可作为静态算法,又可以通过选项成为动态算法
-
source:
- 源地址hash,基于用户源地址hash并将请求转发到后端服务器,默认为静态即取模方式
- 但是可以通过hash-type 支持的选项更改,后续同一个源地址请求将被转发至同一个后端web服务器
- 比较适用于session保持/缓存业务等 场景。
- 源地址有两种转发客户端请求到后端服务器的服务器选取计算方式,分别是取模法和一致性hash
-
map-based:取模法
- 基于服务器总权重的hash数组取模,该hash是静态的即不支持在线调整权重,不支持慢 启动
- 其对后端服务器调度均衡
- 缺点是当服务器的总权重发生变化时,即有服务器上线或下线,都会因权重发生变 化而导致调度结果整体改变。
- 所谓取模运算,就是计算两个数相除之后的余数,10%7=3, 7%4=3,(2^32-1)%(1+1+2)
-
consistent:一致性hash
- 一致性哈希,该hash是动态的,支持在线调整权重,支持慢启动
- 优点在于当服务器的总权重发生变化时,对调度 结果影响是局部的,不会引起大的变动,hash(o)mod n
-
uri
- 基于对用户请求的uri做hash并将请求转发到后端指定服务器
- 也可以通过map-based和consistent定义使用取模 法还是一致性hash
- 对URI的左半部分或整个uri做hash计算,并除以服务器总权重取模,然后往后派发至某挑出的服务器
- 适用于后端缓存服务器
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag> 左半部分:/<path>;<params> 整个uri:/<path>;<params>?<query>#<frag>
-
url_param
- 对用户请求的url中的 params 部分中的参数name作hash计算
- 并由服务器总权重相除以后派发至某挑 出的服务器;
- 通常用于追踪用户,以确保来自同一个用户的请求始终发往同一个real server
# url_param取模法配置示例 listen web_host bind 192.168.7.101:80,:8801-8810,192.168.7.101:9001-9010 mode http log global balance url_param name,age #支持对单个及多个url_param 值hash server web1 192.168.7.103:80 weight 1 check inter 3000 fall 2 rise 5 server web2 192.168.7.104:80 weight 1 check inter 3000 fall 2 rise 5 # url_param一致性hash配置示例 listen web_host bind 192.168.7.101:80,:8801-8810,192.168.7.101:9001-9010 mode http log global balance url_param name,age #支持对单个及多个url_param 值hash hash-type consistent server web1 192.168.7.103:80 weight 1 check inter 3000 fall 2 rise 5 server web2 192.168.7.104:80 weight 1 check inter 3000 fall 2 rise 5
-
hdr(<name>)
- 针对用户每个http头部(header)请求中的指定信息做hash
- 此处由 name 指定的http首部将会被取出并做hash计算
- 然后由服务器总权重相除以后派发至某挑出的服务器,假如无有效的值,则会使用默认的轮询调度roundrobin。