ZooKeeper 3.5 之后可以在不重启全集群的情况下增删成员(reconfig)。这篇开启动态配置,实际执行 config、reconfig -add、reconfig -remove,看版本号、新节点同步和被移除节点的状态。
reconfig -remove 3 → KeeperErrorCode = Reconfig is disabled
server.1=127.0.0.1:7400:7500:participant;127.0.0.1:7300 server.2=127.0.0.1:7401:7501:participant;127.0.0.1:7301 server.3=127.0.0.1:7402:7502:participant;127.0.0.1:7302 version=100000000
动态配置要求把 clientPort 从静态配置里移到成员行里(;127.0.0.1:7300),并且静态配置里不能再有 clientPortAddress(我一开始漏了这个,节点直接报「Invalid config」退出)。我还用 -Dzookeeper.skipACL=yes 跳过了 reconfig 的权限检查,生产环境应当用超级用户或 ACL(第 71 篇)。
reconfig -add → Committed new configuration: server.1=127.0.0.1:7400:7500:participant;127.0.0.1:7300 server.2=127.0.0.1:7401:7501:participant;127.0.0.1:7301 server.3=127.0.0.1:7402:7502:participant;127.0.0.1:7302 server.4=127.0.0.1:7403:7503:participant;127.0.0.1:7303 version=100000036 新节点 z50-4 Mode = follower(615 ms 后);znode 数 = 55 | 其它节点 znode 数 = 55 现在的成员(config): 100000036 127.0.0.1:7301,127.0.0.1:7300,127.0.0.1:7303,127.0.0.1:7302
reconfig -remove 1 →
Committed new configuration:
server.2=127.0.0.1:7401:7501:participant;127.0.0.1:7301
server.3=127.0.0.1:7402:7502:participant;127.0.0.1:7302
server.4=127.0.0.1:7403:7503:participant;127.0.0.1:7303
version=10000003a
被移除的 1 号节点 Mode = follower | 进程还在: True
其它节点: {'z50-2': 'leader', 'z50-3': 'follower', 'z50-4': 'follower'}
leader 的 zk_synced_followers = 3 | 被移除节点自己看到的 config: server.2=127.0.0.1:7401:7501:participant;127.0.0.1:7301 | server.3=127.0.0.1:7402:7502:participant;127.0.0.1:7302 | server.4=127.0.0.1:7403:7503:participant;127.0.0.1:7303 | version=10000003a