当 HAProxy 后端 real server 缩扩容时,需要修改 HAProxy 配置文件,我们希望 HAProxy 既能够加载到最新配置,又能够:
解决方法:
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
测试案例如下:
配置项 proxy_tw 下,tw_proxy_1 / tw_proxy_2 各自对应一个 Twemproxy 服,而每个 Twemproxy 服提供相同的功能,即为两个主备 Redis 集群提供分片和代理功能。
现在,我们暂时注释 tw_proxy_2,然后重启 HAProxy 服务。
脚本功能:事先通过 HAProxy 创建一个到后端 Redis 的连接(HAProxy -> tw_proxy_1 -> Redis),然后在一个无限循环中,每隔一秒钟,尝试获取键 area 的值。
#coding:utf -8
import redis
import time
import datetime
if __name__ == "__main__":
r=redis.Redis(host='192.168.177.222',password='www.wave.com',db=0,port=16001)
value_pre = None
value_cur = None
while(1):
now_int = datetime.datetime.now()
now_str = now_int.strftime("%Y-%m-%d %H:%M:%S")
value_cur = r.get('area')
print now_str + ' ' + value_cur
value_pre = value_cur
time.sleep(1)
运行 python 脚本:
python redis_test.py
脚本运行结果:
访问 HAProxy 管理平台,可以看到当前 tw_proxy_1 上存在一个会话:
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
查看进程:
我们可以看到,进程 ID 未发生变更,说明 HAProxy 尚未重启,但比之前多了一个进程(27084),这个就是刚刚为了重新加载配置文件而执行的命令。
可以看到,配置文件更新前后 ,脚本一直在源源不断地输出正确结果,说明配置文件更新没有影响现有客户端到 HAProxy 的连接。
可以看到,proxy_tw 下目前有 tw_proxy_1 和 tw_proxy_2 两个实体,且当前会话个数为 0(实际为 1)。
另开一个控制台,运行脚本:redis_test.py。脚本输出结果:
访问 HAProxy 管理平台,可以看到当前 tw_proxy_1 上存在一个会话(实际上有2个:旧 / 新客户端):
现在我们尝试下架 tw_proxy_1 所在的服务器。
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
查看进程:
我们可以看到,比之前又多了一个进程(30581),27084 和 30581 都是为了重新加载配置文件而执行的命令。
同时可以看到,proxy_tw 下目前只有 tw_proxy_2 一个实体,且当前会话数为 0(实际上有三个)。
现在,我们把去要下架的服务器上,把 tw_proxy_2 对应的 Twemproxy 服务杀死。
可以看到,tw_proxy_2 当前有两个会话(实际上应该有三个)。
观察前面三个运行 python 测试脚本的控制台,可以看到三个控制台均在源源不断地输出正确值。
可以看到,相比前面第 4 小节,HAProxy 进程 ID 已变更。
另开一个控制台,运行脚本:redis_test.py。脚本输出结果:
反复刷新 HAProxy 管理平台,查看 tw_proxy_1 当前会话情况,可以看到两种结果:一种是,当前会话数为 2,最近会话创建时间是在 13 分36秒之前;另一种是,当前会话数为 1,最近会话创建时间是在 3分钟11秒之前。
反复刷新 HAProxy 管理平台,查看 tw_proxy_1 当前会话情况,可以看到两种结果:一种是,当前会话数为 1,最近会话创建时间是在 9 分21秒之前;另一种是,当前会话数为 3,最近会话创建时间是在 2分钟33秒之前。
除了第三个,即将 tw_proxy_1 设置为 DRAIN 模式后运行的测试脚本,关闭其他 4 个,都会使 HAProxy 管理平台中 tw_proxy_2 的当前会话数 - 1。