nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)

当 HAProxy 后端 real server 缩扩容时,需要修改 HAProxy 配置文件,我们希望 HAProxy 既能够加载到最新配置,又能够:

  • 不重启 HAProxy;
  • 不影响之前现有客户端到 HAProxy 的连接。

解决方法:

/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)

测试案例如下:

一、修改 HAProxy 配置文件

nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第1张图片
配置项 proxy_tw 下,tw_proxy_1 / tw_proxy_2 各自对应一个 Twemproxy 服,而每个 Twemproxy 服提供相同的功能,即为两个主备 Redis 集群提供分片和代理功能。
现在,我们暂时注释 tw_proxy_2,然后重启 HAProxy 服务。
在这里插入图片描述

二、编写 python 测试脚本:redis_test.py

脚本功能:事先通过 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

脚本运行结果:
nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第2张图片
访问 HAProxy 管理平台,可以看到当前 tw_proxy_1 上存在一个会话:
nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第3张图片

四、模拟新增服务器

1、修改 HAProxy 配置文件,取消注释 tw_proxy_2

nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第4张图片

2、重新加载配置

/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)

查看进程:
在这里插入图片描述
我们可以看到,进程 ID 未发生变更,说明 HAProxy 尚未重启,但比之前多了一个进程(27084),这个就是刚刚为了重新加载配置文件而执行的命令。

3、继续观察第三章节执行的 python 测试脚本

可以看到,配置文件更新前后 ,脚本一直在源源不断地输出正确结果,说明配置文件更新没有影响现有客户端到 HAProxy 的连接
nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第5张图片

4、HAProxy 管理平台

在这里插入图片描述
可以看到,proxy_tw 下目前有 tw_proxy_1 和 tw_proxy_2 两个实体,且当前会话个数为 0(实际为 1)。

五、模拟更新后的客户端连接

另开一个控制台,运行脚本:redis_test.py。脚本输出结果:
nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第6张图片
访问 HAProxy 管理平台,可以看到当前 tw_proxy_1 上存在一个会话(实际上有2个:旧 / 新客户端):
在这里插入图片描述

六、模拟下架服务器

现在我们尝试下架 tw_proxy_1 所在的服务器。

1、HAProxy 管理平台中,设置 tw_proxy_1 进入 DRAIN (排干)模式,即新的请求不再接收,旧的请求继续等待执行完毕。

nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第7张图片
执行结果:
在这里插入图片描述

2、另开一个控制台,运行脚本:redis_test.py。测试 DRAIN 模式。

在这里插入图片描述
可以看到,tw_proxy_2 当前有一个会话。

3、修改 HAProxy 配置文件,取消注释 tw_proxy_1

nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第8张图片

4、重新加载配置

/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(实际上有三个)。
在这里插入图片描述

5、杀死 tw_proxy_1 进程

现在,我们把去要下架的服务器上,把 tw_proxy_2 对应的 Twemproxy 服务杀死。
在这里插入图片描述

6、观察 HAProxy 管理平台

可以看到,tw_proxy_2 当前有两个会话(实际上应该有三个)。
在这里插入图片描述

7、观察 python 脚本控制台

观察前面三个运行 python 测试脚本的控制台,可以看到三个控制台均在源源不断地输出正确值。

8、再次观察进程

可以看到,相比前面第 4 小节,HAProxy 进程 ID 已变更。
在这里插入图片描述

9、模拟下架后的新的客户端连接

另开一个控制台,运行脚本:redis_test.py。脚本输出结果:
nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第9张图片
反复刷新 HAProxy 管理平台,查看 tw_proxy_1 当前会话情况,可以看到两种结果:一种是,当前会话数为 2,最近会话创建时间是在 13 分36秒之前;另一种是,当前会话数为 1,最近会话创建时间是在 3分钟11秒之前。
在这里插入图片描述
在这里插入图片描述

10、再次模拟下架后的新的客户端连接

nginx web工具/Redis + Twemproxy + HAProxy + Keepalived 测试 之 后台服务动态扩容(一)_第10张图片
反复刷新 HAProxy 管理平台,查看 tw_proxy_1 当前会话情况,可以看到两种结果:一种是,当前会话数为 1,最近会话创建时间是在 9 分21秒之前;另一种是,当前会话数为 3,最近会话创建时间是在 2分钟33秒之前。
在这里插入图片描述
在这里插入图片描述

11、按开启顺序,依次终止各 python 测试脚本

除了第三个,即将 tw_proxy_1 设置为 DRAIN 模式后运行的测试脚本,关闭其他 4 个,都会使 HAProxy 管理平台中 tw_proxy_2 的当前会话数 - 1。

查看进程,可以看到,进程:27084(即第一次为了重新加载配置文件而执行的命令) 已经消失。
在这里插入图片描述

你可能感兴趣的:(HAProxy)