背景
在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节点列表甚至重启。