Zookeeper 学习-高可用测试
zookeeper在实际环境中,需要考虑节点高可用。当某个节点因维护、不可抗因导致停止,不可访问或使用时,成员中其他节点能接管职责,在很短时间中断时间内或无缝,继续为前端提供服务。
从模拟环境测试结果来看,建议采用5节点zookeeper环境,保证某个leader及follow节点挂起后,zookeeper依然能正常被访问及操作,少量数据同步没丢失。
模拟场景及初步结果:
1. 单台机器zookeeper 3节点
1.1. follow node crash -停止follow后,其他节点角色没有变化。zkcli及应用能连接,能查询及修改节点数据。连接到此节点应用报错大概一秒后恢复。日志显示判断加切换大概一秒。
1.2. leader node crash -停止leader后,另一个原follow节点角色变更为leader。zkcli能连接,无法查询及修改节点数据。应用直接报错并无法恢复。日志显示节点角色切换大概一秒。数据同步没丢失。
1.3. 两个 node crash-停止两个后,无法获取任何zookeeper状态。zkcli及应用都无法直接报错并无法恢复。
2. 单台机器zookeeper 5节点
2.1. 一个follow node crash -停止follow后,其他节点角色没有变化。zkcli及应用能连接,能查询及修改节点数据。连接到此节点应用报错大概一秒后恢复。日志显示判断加切换大概一秒。
2.2. 一个leader node crash -停止leader后,另一个原follow节点角色变更为leader。zkcli及应用能连接,能查询及修改节点数据。应用报错大概一秒后恢复。日志显示节点角色切换大概一秒。数据同步没丢失。
2.3. 两个 node crash - 同时停止任意两个节点后,另一个原follow节点角色变更为leader。zkcli及应用能连接,能查询及修改节点数据。应用报错大概一秒后恢复。日志显示节点角色切换大概一秒。数据同步没丢失。
2.4. 三个 node crash - 同时停止任意三个节点后,另一个原follow节点角色变更为leader。zkcli能连接,无法查询及修改节点数据。应用直接报错并无法恢复。日志显示节点角色切换大概一秒。
3.跨云zookeeper 5节点(aliyun,huaweicloud,ctyun)
测试结果与单台机器zookeeper 5节点测试一样
3.1. 一个follow node crash
3.2. 一个leader node crash
3.3. 两个 node crash
3.4. 三个 node crash
测试大致步骤
1.zookeeper所有节点正常启动
2.启动五个应用(watch)代码,模拟应用连接zookeeper,每隔五秒轮询及修改节点数据
连接字符串包括所有zookeeper节点地址
3.另开zkCli手动查询及修改节点数据
连接字符串包括所有zookeeper节点地址
4.强制停止zookeeper进程,使用kill -9 <zookeeper_pid>命令
5.使用stat指令检查zookeeper模式角色
6.检查五个应用日志,是否正常连接,轮询及修改节点数据
7.zkCli手动查询及修改节点数据
连接字符串包括所有zookeeper节点地址
8.重复以上步骤
注意:
1.模拟过程并没有考虑leader节点恢复。如果原leader节点恢复,希望能以follow方式加入,避免新一轮选举。
2.模拟过程并没有考虑大并发连接,数据量仅20KB左右。下一步尝试模拟400MB左右,大概500个应用连接,数据同步10MB左右。
3.模拟过程并没有考虑脑裂场景。下一步尝试模拟脑裂场景。
单台服务器模拟5节点脚本
zoo1.cfg
dataDir=/oss/scripts/zk-cluster/data1
clientPort=12181
server.1=localhost:13888:13999
server.2=localhost:23888:23999
server.3=localhost:33888:33999
server.4=localhost:43888:43999
server.5=localhost:53888:53999
4lw.commands.whitelist=*
zoo2.cfg
dataDir=/oss/scripts/zk-cluster/data2
clientPort=22181
server.1=localhost:13888:13999
server.2=localhost:23888:23999
server.3=localhost:33888:33999
server.4=localhost:43888:43999
server.5=localhost:53888:53999
4lw.commands.whitelist=*
zoo3.cfg
dataDir=/oss/scripts/zk-cluster/data3
clientPort=32181
server.1=localhost:13888:13999
server.2=localhost:23888:23999
server.3=localhost:33888:33999
server.4=localhost:43888:43999
server.5=localhost:53888:53999
4lw.commands.whitelist=*
zoo4.cfg
dataDir=/oss/scripts/zk-cluster/data4
clientPort=42181
server.1=localhost:13888:13999
server.2=localhost:23888:23999
server.3=localhost:33888:33999
server.4=localhost:43888:43999
server.5=localhost:53888:53999
4lw.commands.whitelist=*
zoo5.cfg
dataDir=/oss/scripts/zk-cluster/data5
clientPort=52181
server.1=localhost:13888:13999
server.2=localhost:23888:23999
server.3=localhost:33888:33999
server.4=localhost:43888:43999
server.5=localhost:53888:53999
4lw.commands.whitelist=*