haproxy无缝热加载的配置和操作[上]

1. 引言

  从haproxy1.8开始,haproxy内置提供了无缝热加载的能力。具体可以参见文档:
Hitless Reloads With HAProxy (How-To Configuration Guide)中的描述。

  本文在实际对haproxy无缝热加载功能进行验证的基础上,从非systemd和systemd两种运行模式说明了配置的方法。

2. 实现原理

  要实现无缝热加载,最关键的是两点: 1.需要能够实现老的进程中的listen监听的端口和新进程中的listen端口能够并行监听一段时间,这样子在新的haproxy在启动完成前老的进程依然能够正常提供服务,实现无缝衔接;2. 老的进程正在提供服务的连接能够在完成服务后,老进程再推出,实现优雅关闭,而不是粗鲁地断开连接,影响用户体验。

  对于第1点,haproxy通过管理端口unix socket可以向reload进程(新的haproxy进程)开放传输老进程目前正在监听的socket列表,这样子新进程能够在接收到socket句柄列表,相当于继承了老进程的监听状态,从而能够无缝衔接新进来的用户连接请求。

  对于第2点,haproxy实现了在收到SIGUSR1的消耗后,进行优雅关闭的功能。在haproxy的官方文档的Stopping and restarting HAProxy节中有下面的描述:

HAProxy supports a graceful and a hard stop. The hard stop is simple, when the
SIGTERM signal is sent to the haproxy process, it immediately quits and all
established connections are closed. The graceful stop is triggered when the
SIGUSR1 signal is sent to the haproxy process. It consists in only unbinding
from listening ports, but continue to process existing connections until they
close. Once the last connection is closed, the process leaves.

  意思是haproxy支持两种关闭模式,一种是优雅关闭,另外一种是硬关闭。硬关闭比较简单,在受到SIGTERM信号后,haproxy会立即退出并关闭所有的连接;而优雅关闭则不同,在受到SIGUSR1信号后,haproxy首先只是取消监听端口,然后继续运行直到所有的连接断开以后才从容地退出进程。

  所以,通过以上两个功能,haproxy 1.8版本以上已经能够实现无缝热加载了。
  那么,如何来配置haproxy实现无缝热加载呢,下面从两个运行模式来进行说明。

3. 配置

  haproxy支持以非systemd方式的daemon形式启动来提供代理服务,也支持以systemd中的service方式启动来提供代理服务,下面分别来说明配置方法:

3.1 非systemd启动方式

  1. haproxy配置文件stats指令添加 expose-fd listeners
global
......
    stats socket /var/lib/haproxy/stats/haproxy.sock mode 600 level admin process 2 **expose-fd listeners**
......

  通过这个指令配置,开启向其他进程发送监听端口的socket句柄。

  1. 在配置文件的global节中增加master-worker, 使得haproxy能够以主进程+worker进程的模式运行:
global
    ......
    
    daemon
    master-worker
    
    ......

如果不在配置文件中添加本指令,也可以在命令行中添加"-W" 参数来实现。

  1. 命令行启动haproxy:
 对于没有在配置文件中设置master-worker的情况:
 ./haproxy -f haproxy.cfg -W

 对于在配置文件中设置了master-worker的情况:
 ./haproxy -f haproxy.cfg

  1. reload命令:
      接下去就可以进行reload了,命令如下:
  /haproxy -f haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid) -x /var/lib/haproxy/stats/haproxy.sock

  这里需要说明一下:-sf 命令行选项就是指定了当前进程是进行reload操作,$(cat /var/run/haproxy.pid) 用来读取老的haproxy主进程的pid,-x 命令行选项指定了老的haproxy进程unix socket管理接口的文件路径,用来从这个接口获取监听socket句柄列表。

  这个命令执行后,老的进程将在连接处理完毕后退出,而新的进程开始正式提供服务,热加载操作完毕。

关于以systemd方式配置haproxy来实现无缝热加载,请看haproxy无缝热加载[下]

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农心语

您的鼓励是我写作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值