zookeeper动态配置应用
文章目录
更多精彩内容,请关注微信公众号:后端技术小屋
〇、背景
在zookeeper 3.5.0版本之前,其配置不支持动态加载,只能通过重启加载新配置。因此在老版本中如果要对zk集群进行扩缩容,需要滚动重启集群中所有节点,以使新的配置生效。而在zookeeper 3.5.0版本之后(包含3.5.0),引入了动态配置的特性,即zk节点运行时可动态加载zk成员配置,这样可在保持数据一致性的同时不会中断业务。
总结起来,zk动态配置可解决之前zk集群日常扩缩容过程中的如下痛点:
- zk集群短时间内不可用:zk节点滚动重启导致重新选举,选举周期内zk集群对外不可用;
- 依赖zk client端重连:zk节点滚动重启导致已建立的客户端连接被断开,客户端需主动重连其他节点;
- 扩缩容过程繁琐易出错:在静态配置版本下,扩容操作包括:配置新节点、启动新节点、配置老节点、滚动重启老节点。操作繁琐,步骤冗长,依赖人工容易出错。
下面介绍如何启动zk动态配置,以及利用该特性扩容和缩容。
一、操作步骤
1.1 配置zk集群
1.1.1 配置静态文件:zoo.cfg
autopurge.purgeInterval=1
initLimit=30000
syncLimit=10
autopurge.snapRetainCount=10
skipACL=yes
maxClientCnxns=2000
4lw.commands.whitelist=*
maxSessionTimeout=60000000
tickTime=2000
dataDir=/data/
reconfigEnabled=true
dataLogDir=/data/logs
preAllocSize=131072
dynamicConfigFile=/conf/zoo.cfg.dynamic
一些值得注意的参数(必选):
- reconfigEnabled: 使能动态配置
- dynamicConfigFile:加载dynamic配置文件的路径
- skipACL=yes:跳过acl检查。如果不设置成yes,则需要superuser权限才能执行reconfig.
1.1.2 配置动态文件:zoo.cfg.dynamic
server.2=zoo2:2888:3888;2181
server.3=zoo3:2888:3888;2181
server.5=zoo5:2888:3888;2181
1.2 部署zk集群
为了方便快速验证,使用docker-compose部署以上三个zk实例
docker-compose.yml
version: '3.1'
services:
zoo2:
image: zookeeper:3.5.6
restart: always
hostname: zoo1
container_name: zookeeper_1
ports:
- 2181:2181
volumes:
- ./data1:/data
- ./datalog1:/datalog
- ./conf1:/conf
environment:
ZOO_MY_ID: 1
zoo3: 略
zoo5: 略
启动集群并查看状态
# 启动集群
sudo docker-compose up -d
# 进入zoo2容器
sudo docker exec -it zookeeper_2 /bin/bash
# 查看状态
echo stat | nc localhost 2181
# 进入zk客户端命令行
./bin/zkCli.sh
> config
server.2=zoo2:2888:3888:participant;0.0.0.0:2181
server.3=zoo3:2888:3888:participant;0.0.0.0:2181
server.5=zoo5:2888:3888:participant;0.0.0.0:2181
version=1600000002
1.3 扩容:加入zoo1节点
1.3.1 配置并启动zoo1节点
# 修改zoo.cfg.dynamic,server列表包含老节点(zoo2, zoo3, zoo5)和本节点(zoo1)
server.1=zoo1:2888:3888;2181
server.2=zoo2:2888:3888;2181
server.3=zoo3:2888:3888;2181
server.5=zoo5:2888:3888;2181
# 首先启动zoo1
sudo docker-compose up -d zoo1
1.3.2 执行reconfig -add
./bin/zkCli.sh
# 动态添加zoo1节点
> reconfig -add 1=zoo1:2888:3888;2181
可以看到,执行完reconfig命令之后,所有节点都生成了一份新的配置文件 zoo.cfg.dynamic.160000000b (后缀表示当前动态配置的版本号)
并且由zoo.cfg指向该dynamic文件
1.4 缩容:删除zoo5节点
1.4.1 执行reconfig -remove
./bin/zkCli.sh
# 动态添加zoo1节点
> reconfig -remove 5
同1.3.2,也可看到每个实例的配置文件更新
1.4.2 停止zoo5
sudo docker-compose stop zoo5
二、注意事项
执行reconfig命令后,需确认扩容/缩容是否成功:执行reconfig命令只意味着激活新配置的请求已发出,至于新配置有没有在所有节点上生效需要用户自行确认。
为了避免zk集群短时不可用,应当尽量避免执行reconfig -remove leader节点
zk客户端可通过监听zk路径:/zookeeper/config实时监听zk节点列表的变化(前提是:客户端配置的zk节点列表中至少一个可用)。得到完整的zk节点列表之后,zk客户端可平衡每个zk节点的请求数,客户端也无需重新配置zk节点列表甚至重启。
三、参考
https://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperReconfig.html#sc_reconfig_file
推荐阅读
更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
文章作者 后端侠
上次更新 2021-03-17