ZooKeeper动态调整集群成员
2020-03-03 本文已影响0人
金果儿
手动集群成员调整
- 停止整个ZooKeeper现有集群
- 更改配置文件zoo.cfg的server.n项
- 启动新集群的ZooKeeper节点
问题1:需要停止ZooKeeper服务。
问题2:已经提交的数据可能会被覆盖,如下:
在quorum模式下,有三个节点,节点2是leader,节点3数据比较旧。由于这三个节点性能比较低,计划加入节点4和节点5

把节点1、2、3停掉之后,设置4、5节点。先启动4、5,再启动节点3。然后再启2、1这两个节点。
先启动的3、4、5节点会先形成一个quorum,选举3为leader,开始进行事务的提交,产生事务<2,1>。

当节点1、2加入新的quorum的时候,由于1、2节点的事务<1,3>和节点3(leader)的事务不一样,会被<2,1>覆盖,而造成数据丢失。

动态配置
解决上面的问题就可以使用动态配置。
要使用动态配置,必须启用ZooKeeper的Authentication(认证)
- 调用类DigestAuthencatinProvider的generateDigest函数生成digest(密钥),输入参数比如:“super:jingguo”
-
配置产生的密钥
-
编辑动态配置的配置文件zoo.reconf.cfg
dyn.cfg文件内的内容

最好不要省略配置文件内的ali-1这样的host name,ZooKeeper会读取这些信息。如果不配置host name的话,ZooKeeper会使用默认名字。对客户端来说,不知道这些默认名字是什么。
-
启动节点
- 启动cli,由于只在ali-1启用了super机制,只能连ali-1节点,才能算是经过认证。
zkCli.sh -server ali-1:2181
// 添加digest
addauth digest super:jingguo
查看配置config
配置集群成员reconfig
, 比如移除3号节点reconfig -remove 3