Haproxy -- 动/静/混合态算法实验

目录

[一. Haproxy的算法](#一. Haproxy的算法)

[1.1 静态算法](#1.1 静态算法)

[1.2 动态算法](#1.2 动态算法)

[1.3 混合算法](#1.3 混合算法)

[1.4 三类算法对比](#1.4 三类算法对比)

[二. 实验环境](#二. 实验环境)

[2.1 环境流程图](#2.1 环境流程图)

[2.2 实验环境](#2.2 实验环境)

[2.3 环境配置](#2.3 环境配置)

[三. 部署 socat 热更新工具](#三. 部署 socat 热更新工具)

[3.1 socat简介](#3.1 socat简介)

[3.2 部署 socat](#3.2 部署 socat)

[四. 算法实验](#四. 算法实验)

[4.1 静态算法实验](#4.1 静态算法实验)

[4.1.1 static-rr 算法](#4.1.1 static-rr 算法)

[4.1.2 first 算法](#4.1.2 first 算法)

[4.2 动态算法实验](#4.2 动态算法实验)

[4.2.1 roundrobin](#4.2.1 roundrobin)

[4.2.2 leastconn](#4.2.2 leastconn)

[4.3 混合算法实验](#4.3 混合算法实验)

[4.3.1 source 算法](#4.3.1 source 算法)

[4.3.2 uri 算法](#4.3.2 uri 算法)

[4.3.3 url_param 算法](#4.3.3 url_param 算法)

[4.3.4 hdr 算法](#4.3.4 hdr 算法)

[五. 常见问题](#五. 常见问题)

[六. 结论](#六. 结论)


一. Haproxy的算法

HAProxy通过固定参数 balance 指明对后端服务器的调度算法

balance参数可以配置在listen或backend选项中。

HAProxy的调度算法分为静态和动态调度算法

有些算法可以根据参数在静态和动态算法中相互转换。

1.1 静态算法

静态算法是按预定义规则轮询公平调度,不关注后端服务器负载等实时状态,权重仅能设 0 和 1 且无法实时修改,需重启 HAProxy 生效。

  • 静态算法核心特征是调度规则固定、权重不可实时调整,需重启生效。
  • static-rr 侧重权重轮询但功能受限,first 侧重列表顺序调度且无视权重。
  • 慢启动是服务器上线时的流量控制机制,static-rr 不支持该特性。

1.2 动态算法

动态算法基于后端服务器实时状态调度,新请求优先分配给负载较低的服务器,权重可在 HAProxy 运行时动态调整。

  • 动态算法核心特征是基于服务器实时状态调度、权重可运行时动态调整,适配性更强。
  • roundrobin 侧重权重轮询且功能完善,是默认算法;leastconn 侧重最少连接数调度,适配长连接场景。
  • 动态权重调整可通过特定命令实现,无需重启 HAProxy 即可生效。

1.3 混合算法

HAProxy 的混合算法可作为静态算法使用,也能通过相关选项配置为动态算法。

  • 这类算法核心是基于 hash 计算分配请求,兼具静态 / 动态特性,可通过 hash-type 指定取模或一致性 hash。
  • source/uri/url_param/hdr 分别基于源地址、URI、URL 参数、HTTP 头部做 hash,适配不同的会话保持 / 缓存场景。
  • 所有这类算法均依赖 hash 计算分配请求,无有效 hash 值时会降级使用轮询类算法(如 roundrobin)。

1.4 三类算法对比

  • 相同点:均用于请求分发,部分支持权重配置,tcp/http 模式有重叠适配。
  • 核心差异:静态算法规则固定、权重不可动态调整;动态算法基于实时状态、权重可动态改;混合算法基于 hash,可静态 / 动态切换。
  • 场景差异:静态适配简单轮询,动态适配负载敏感场景,混合适配会话保持 / 缓存场景。

二. 实验环境

2.1 环境流程图

2.2 实验环境

2.3 环境配置

具体环境配置已整理并发布到以下CSDN链接中,按需自行查看

https://blog.csdn.net/2401_84184229/article/details/157808422https://blog.csdn.net/2401_84184229/article/details/157808422?sharetype=blogdetail&sharerId=157808422&sharerefer=PC&sharesource=2401_84184229&sharefrom=mp_from_link

三. 部署 socat 热更新工具

3.1 socat简介

socat 是多功能网络工具,可实现各类套接字数据转发交互;在 HAProxy 场景中,部署该工具即安装 socat 并通过其与 HAProxy 的 UNIX 域套接字通信,无需停服即可完成权重调整、状态变更、配置热更新等操作,核心实现 HAProxy 热更新 / 热配置能力。

  • socat 是实现 HAProxy 权重动态调整的核心工具,适配动态 / 混合算法的实验需求。
  • 热更新特性避免重启 HAProxy,保证服务不中断、实验环境不重置,结果更准确。
  • 即时生效的调整方式提升算法参数调试效率,便于快速验证不同算法的效果。

3.2 部署 socat

1.安装socat

在haproxy上

复制代码
[root@haproxy ~]# dnf install socat -y #安装

[root@haproxy ~]# socat -h   #查看socat帮助手册(能查看到即安装成功)

2.利用socat查看haproxy信息

复制代码
[root@haproxy ~]# echo "show servers state"  | socat stdio /var/lib/haproxy/stats
#该命令通过 socat 工具将show servers state指令发送至 HAProxy 的 UNIX 域套接字,无需停服即可查询所有后端服务器的完整状态信息(包含 ID、IP、权重、健康检查状态等)

[root@haproxy ~]# systemctl restart haproxy.service #重启
[root@haproxy ~]# echo "get  weight webcluster/haha" | socat  stdio /var/lib/haproxy/stats
1 (initial 1)

[root@haproxy ~]# echo "get  weight webcluster/hehe" | socat  stdio /var/lib/haproxy/stats
将get weight 集群名/服务器名指令发送至 HAProxy 的 UNIX 域套接字,精准查询webcluster集群中hehe服务器的当前权重值

3.利用socat更改haproxy信息

1)对socket进行授权

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

 stats socket /var/lib/haproxy/stats mode 600 level admin   
#设置其权限为 600 并赋予管理员操作级别,为 socat 交互提供基础

[root@haproxy ~]# rm -rf /var/lib/haproxy/*   
#强制删除/var/lib/haproxy/目录下的所有文件,清理旧的套接字文件等数据,避免配置冲突

[root@haproxy ~]# systemctl restart haproxy.service
[root@haproxy ~]# echo "set  weight  webcluster/haha 2 " | socat stdio /var/lib/haproxy/stats
#通过 socat 工具将webcluster集群中haha服务器的权重设置为 2
[root@haproxy ~]#  ll /var/lib/haproxy/  #验证套接字文件是否正常生成

2)执行权重更改

复制代码
[root@haproxy ~]# echo "get  weight webcluster/hehe" | socat  stdio /var/lib/haproxy/stats
1 (initial 1)
#获取webcluster集群中hehe服务器的当前权重(返回结果显示当前权重为 1,初始权重为 1)
[root@haproxy ~]# echo "set  weight  webcluster/hehe 4 " | socat stdio /var/lib/haproxy/stats
#将webcluster集群中hehe服务器的权重设置为 4

[root@haproxy ~]# echo "get  weight webcluster/hehe" | socat  stdio /var/lib/haproxy/stats
4 (initial 1)
#查询webcluster集群中hehe服务器的权重,验证修改结果(返回结果显示当前权重已改为 4,初始权重仍为 1)

3)测试

新开一个shell测试,由于hehe的权重高于haha,所以webserver2的访问次数比webserver1多

复制代码
for i in {1..7};do curl 192.168.35.100; done

四. 算法实验

4.1 静态算法实验

4.1.1 static-rr 算法

static-rr 算法是基于权重的轮询调度,不支持运行时动态调整权重、不支持后端服务器慢启动,后端主机数量无限制,等效于 LVS 中的 wrr。

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
    bind            *:80
    balance         static-rr    #指定该集群的调度算法为static-rr(静态权重轮询)
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1

[root@haproxy ~]# systemctl restart haproxy.service

测试

复制代码
for i in {1..7};do curl 192.168.35.100; done

检测是否支持热更新

复制代码
[root@haproxy ~]# echo "get  weight webcluster/haha" | socat  stdio /var/lib/haproxy/stats
2 (initial 2)
#查询到webcluster集群中haha服务器当前权重为 2
[root@haproxy ~]# echo "set  weight  webcluster/haha 1  " | socat stdio /var/lib/haproxy/stats
Backend is using a static LB algorithm and only accepts weights '0%' and '100%'.
#尝试将webcluster集群中haha服务器的权重修改为 1,但因该集群使用 static-rr 静态调度算法(仅支持 0%/100% 权重),修改操作被拒绝并返回对应的错误提示

4.1.2 first 算法

first 算法是按服务器在列表中的自上而下位置调度,仅当第一台服务器连接数达上限时才将请求分配给下一台,且会忽略服务器权重设置。

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

listen webcluster
    bind            *:80
    balance         first
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service

测试:在一个shell中执行持续访问

复制代码
 while true; do curl 192.168.35.100; done

在其他设立了中建立持续访问并观察

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

listen webcluster
    bind            *:80
    balance         first
    server haha 192.168.221.20:80 maxconn 1 check inter 3s fall 3 rise 5 weight 1
    server hehe 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
[root@haproxy ~]# systemctl restart haproxy.service

4.2 动态算法实验

4.2.1 roundrobin

roundrobin是基于权重的轮询动态调度算法,支持权重运行时调整和慢启动,每个后端 backend 最多支持 4095 个 real server,是 HAProxy 默认且使用广泛的调度算法。

可通过echo "set weight 服务组/服务器 权重值" | socat stdio /var/lib/haproxy/haproxy.sock命令在 HAProxy 运行时动态调整服务器权重。

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

listen webcluster
    bind            *:80
    balance         roundrobin
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
for i in {1..7};do curl 192.168.35.100; done

动态权重更新

复制代码
[root@haproxy ~]# echo "get  weight webcluster/haha" | socat  stdio /var/lib/haproxy/stats
2 (initial 2)

[root@haproxy ~]# echo "set  weight  webcluster/haha 1  " | socat stdio /var/lib/haproxy/stats

[root@haproxy ~]# echo "get  weight webcluster/haha" | socat  stdio /var/lib/haproxy/stats
1 (initial 2)

效果

复制代码
for i in {1..7};do curl 192.168.35.100; done

4.2.2 leastconn

leastconn是加权的最少连接动态调度算法,支持权重运行时调整和慢启动,会将请求分配给当前连接数最少的后端服务器,适合 MySQL 等长连接场景使用。

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

listen webcluster
    bind            *:80
    balance         leastconn
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service

测试

复制代码
for i in {1..7};do curl 192.168.35.100; done

4.3 混合算法实验

4.3.1 source 算法

source 算法基于用户源地址 hash 分配请求,同一源地址请求固定发往同一后端服务器,默认静态可配置为动态,适用于 session 会话保持但不支持 cookie 和缓存的场景,服务器选取有取模法和一致性 hash 两种方式。

默认静态算法

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
    bind            *:80
    balance         source
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
 for i in {1..7};do curl 192.168.35.100; done

source动态算法

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
    bind            *:80
    balance         source
    hash-type       consistent
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1

[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
for i in {1..7};do curl 192.168.35.100; done

4.3.2 uri 算法

uri 算法基于用户请求 URI 的左半部分或整个 URI 做 hash,结合总权重取模分配请求,默认静态可通过 hash-type 指定取模法 / 一致性 hash,仅支持 http 模式,适用于后端缓存服务器场景。

1.主备实验环境

复制代码
在webserver1+2中
[root@webserver1 ~]# echo RS1 -192.168.221.10 > /var/www/html/index1.html
[root@webserver1 ~]# echo RS1 -192.168.221.10 > /var/www/html/index2.html

[root@webserver2 ~]# echo RS2 - 192.168.221.20 > /var/www/html/index1.html
[root@webserver2 ~]# echo RS2 - 192.168.221.20 > /var/www/html/index2.html

2.设定uri算法

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

listen webcluster
    bind            *:80
    balance         uri
    hash-type       consistent
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
for i in {1..10}; do curl 172.25.254.100/index.html; done
for i in {1..10}; do curl 172.25.254.100/index1.html; done

4.3.3 url_param 算法

url_param 算法对用户请求 URL 中 params 部分指定参数 key 的 value 做 hash,结合总权重取模分配请求,无指定 key 时按 roundrobin 算法调度,常用于电商等追踪用户、确保同一用户请求发往同一服务器的场景,支持取模法和一致性 hash 配置。

1.主备实验环境

复制代码
在webserver1+2中
[root@webserver1 ~]# echo RS1 -192.168.221.10 > /var/www/html/index1.html
[root@webserver1 ~]# echo RS1 -192.168.221.10 > /var/www/html/index2.html

[root@webserver2 ~]# echo RS2 - 192.168.221.20 > /var/www/html/index1.html
[root@webserver2 ~]# echo RS2 - 192.168.221.20 > /var/www/html/index2.html

2.设定url_param算法

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg
listen webcluster
    bind            *:80
    balance         url_param name
    hash-type       consistent
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1

[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
for i in {1..7};do curl 192.168.35.100/index.html?name=lee; done
for i in {1..7};do curl 192.168.35.100/index.html?name=redhat; done

4.3.4 hdr 算法

hdr 算法针对用户 HTTP 请求头部指定信息(如 User-Agent)做 hash,结合总权重取模分配请求,无有效值时使用默认轮询调度,支持取模法和一致性 hash 两种配置方式,仅适用于 http 模式。

在haproxy中

复制代码
[root@haproxy ~]# vim /etc/haproxy/haproxy.cfg

listen webcluster
    bind            *:80
    balance         hdr(user-Agent)
    hash-type       consistent
    server haha 192.168.221.10:80 check inter 3s fall 3 rise 5 weight 2
    server hehe 192.168.221.20:80 check inter 3s fall 3 rise 5 weight 1
[root@haproxy ~]# systemctl restart haproxy.service

测试:

复制代码
curl -A "lee" 192.168.35.100
curl -A "lee" 192.168.35.100
curl -A "timinglee" 192.168.35.100
curl -A "timing" 192.168.35.100

五. 常见问题

Q1:利用socat更改haproxy信息时出现"Permission denied"报错

解决方法:默认状态下,socat对套接字没有更改的权限,需要先对socat进行授权。

六. 结论

HAProxy 的静态、动态、混合三类调度算法核心差异在于调度依据与灵活性。相同点是均用于后端服务器请求分发,部分算法(如 static-rr/roundrobin)均支持权重配置,且 tcp/http 模式适配性有重叠。不同点:静态算法(static-rr/first)按预定义规则调度,权重仅 0/1 且需重启生效,无视服务器实时状态;动态算法(roundrobin/leastconn)基于服务器实时负载调度,权重可动态调整,支持慢启动;混合算法(source/uri 等)基于 hash 计算分发请求,默认静态,可通过 hash-type 配置为动态,适配会话保持、缓存等场景,且仅部分支持 tcp 模式(如 source),uri/url_param/hdr 仅支持 http 模式。

相关推荐
政安晨2 小时前
政安晨【人工智能项目随笔】OpenClaw(AI人工智能助手)集成SMB服务器实现自动化音效素材处理实战
运维·自动化·自动化运维·samba·ai-agent·openclaw·音频素材openclaw处理
huohaiyu2 小时前
数据链路层与网络协议全解析
服务器·网络·数据链路层
乾元2 小时前
合规自动化:AI 在资产发现与数据合规治理中的“上帝之眼”
运维·网络·人工智能·安全·web安全·机器学习·安全架构
落羽的落羽3 小时前
【C++】深入浅出“图”——最短路径算法
java·服务器·开发语言·c++·人工智能·算法·机器学习
之歆3 小时前
Linux系统管理与运维基础
linux·运维·服务器
Maynor9963 小时前
OpenClaw 第2章:环境搭建
运维·人工智能·飞书
人间打气筒(Ada)3 小时前
SQL Server 之创建和管理数据表
运维·服务器·数据库·windows·sql语句·sql server·windows server
China_Yanhy3 小时前
入职 Web3 运维日记 · 第 13 日:洗钱风云 —— 链上合规 (KYT) 与多签钱包的权力游戏
运维·web3
网云工程师手记3 小时前
防火墙安全区域划分规范与接口配置实操指南
运维·服务器·网络·安全·网络安全