更多精彩内容,请关注微信公众号:后端技术小屋

〇、背景

在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文件

zoo.cfg文件内容

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

推荐阅读

更多精彩内容,请扫码关注微信公众号:后端技术小屋。如果觉得文章对你有帮助的话,请多多分享、转发、在看。
二维码