本篇博客将详细介绍使用socat对haproxy配置进行热更新(不中断服务更新haproxy的配置),通过本篇博客你可以学会使用socat修改haproxy的配置。
一、简介
1.1 为什么需要热更新
haproxy服务用来分发访问到后台各个服务器,如果采用常规方式,修改配置文件并且重启服务生效,在重启的过程中会造成业务的突然中断,这显然不合适,因此需要进行热更新来修改haproxy的配置,使之不用重启服务也可以直接生效,避免业务的中断。
1.2 socat简介

对服务器动态权重和其它状态可以利用 socat工具进行调整,Socat 是 Linux 下的一个多功能的网络工 具,名字来由是Socket CAT,相当于netCAT的增强版.Socat 的主要特点就是在两个数据流之间建立双向 通道,且支持众多协议和链接方式。如 IP、TCP、 UDP、IPv6、Socket文件等
二、使用socat热更新haproxy权重配置
2.1 安装socat
bash
[root@HA ~]# dnf install socat -y
2.2 利用socat查看haproxy信息
bash
[root@HA ~]# echo "show servers state" | socat stdio /var/lib/haproxy/stats
1
# be_id be_name srv_id srv_name srv_addr srv_op_state srv_admin_state srv_uweight srv_iweight srv_time_since_last_change srv_check_status srv_check_result srv_check_health srv_check_state srv_agent_state bk_f_forced_id srv_f_forced_id srv_fqdn srv_port srvrecord srv_use_ssl srv_check_port srv_check_addr srv_agent_addr srv_agent_port
2 webcluster-http 1 webserver1 192.168.0.10 0 0 1 1 149 7 0 0 7 0 0 0 - 80 - 0 0 - - 0
2 webcluster-http 2 webserver2 192.168.0.20 0 0 1 1 148 7 0 0 7 0 0 0 - 80 - 0 0 - - 0
注:该表头部注释与下方数据一一对应。
2.3 通过socat修改haproxy的权重配置
1、首先需要对socket进行授权
打开haproxy的配置文件并在global模块中添加以下内容
bash
stats socket /var/lib/haproxy/stats mode 600 level admin
2、修改权重
查看服务器权重(后台webserver1和webserver2)
bash
[root@HA ~]# echo "get weight webcluster-http/webserver1" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
[root@HA ~]# echo "get weight webcluster-http/webserver2" | socat stdio /var/lib/haproxy/stats
1 (initial 1)
可以看见后台两台服务器的权重默认配置均为1,当前配置也为1。
进行访问查看当前负载均衡效果

可见当前请求分发是两台服务器轮流处理
接下来修改webserver1的权重
bash
[root@HA ~]# echo "set weight webcluster-http/webserver1 4 " | socat stdio /var/lib/haproxy/stats
[root@HA ~]# echo "get weight webcluster-http/webserver1" | socat stdio /var/lib/haproxy/stats
4 (initial 1)
可以看见使用命令修改了webserver1的权重为4,然后查看可知默认设定(配置文件中的设定)的权重还是为1,但是当前生效的权重为4。
接下来进行访问测试

可以看见访问请求分发变成了webserver1处理4个后webserver2处理1个,配置生效,并且haproxy服务也没有重启,热更新生效。不过需要注意的是,使用socat热更新是临时生效的,当haproxy服务重启后,socat做的更新就会失效。
重启haproxy服务并再次重新使用socat查看权重
bash
[root@HA ~]# systemctl restart haproxy
[root@HA ~]# echo "get weight webcluster-http/webserver1 " | socat stdio /var/lib/haproxy/stats
1 (initial 1)
[root@HA ~]# echo "get weight webcluster-http/webserver2 " | socat stdio /var/lib/haproxy/stats
1 (initial 1)
可以看见权重又重新恢复到和配置文件中指定的一样了。