浅谈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,大值为2560表示不参与负载均衡 
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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值