事情的初衷是这样的:线上有一个小的zk集群,三台机器。其中有一台机器过了保期,需要置换。所以需要用一台新的机器来替换掉其中的一个zk节点,但是为了不影响
线上的服务,所以不能停zk集群。
这里不将具体的hostname和ip写出来,姑且将原来的三台机器定义为 a、b和c, 现在b过保,用新机器d来替换掉b,zk集群由abc变成acd,下面将整个过程记录如下:
先说明一下原来的zk的配置是怎样的(只贴出需要改动的地方):
server.1=a:2182:2183
server.2=b:2182:2183 ###这个过保啦,需要替换成d服务器
server.3=c:2182:2183
1. 先停止b机器上面的zk服务:zkServer.sh stop, 因为现在zk的集群还有过半节点是正常的,所以zk可以正常对外提供服务;
2. 从b机器上上拷贝zk的安装包到d机器的 /opt/zk 目录下(我这里是直接将b服务器上的zk环境拷贝到了d机器对应的文件夹下面), 然后修改d服务器上面上面zk的配置文
件zoo.cfg, 将:
server.1=a:2182:2183
server.2=b:2182:2183
server.3=c:2182:2183
修改为:
server.1=a:2182:2183
server.3=c:2182:2183
server.4=d:2182:2183
保存退出;
3. 在d上创建zk的数据保存目录, /data1/zookeeper/data/ 和 /data2/zookeeper/log/, 在/data1/zookeeper/data/ 中创建一个myid文件,里面内容是server.4中的4: echo "4" > myid,
然后启动zk服务: zkServer.sh start
4. 等待生成了1到2次快照之后继续进行下面的操作(查看快照的方式: 去 /data1/zookeeper/data/ 目录下查看生成的快照的日期即可. 具体存放数据的目录可能不相同, 要根据具体的
配置文件来,这些配置在这里不做说明)
5. 查看ac两台zk中,哪一台是follower,这个步骤会操作是follower的那台机器,这里假设a是follower,对a进行如下操作:修改zk的zoo.conf, 将原来的
server.1=a:2182:2183
server.2=b:2182:2183
server.3=c:2182:2183
修改为:
server.1=a:2182:2183
server.3=c:2182:2183
server.4=d:2182:2183
保存退出,然后重启a上面的zk服务;
6. 现在开始操作c,步骤同上面的步骤5. 操作完成之后,可以观察到d上的zk会变成leader.(myid最大的会成为leader)
7. 检查每台机器上zk的status是否正常: zkServer.sh status
步骤完毕。按理说严格按照上面的步骤来操作是不会影响zk对外提供服务的。而且我们也这样正常的置换掉了机器~~~~~。
下面是几点注意事项:
1. 操作是要使用对应的账号,不要稀里糊涂搞错了账号
2. 要注意目录的权限
3. leader放在最后操作