线上环境需要做迁移,所以就需要动手了。
环境说明
需要将以下zk迁移至新的机器上
1 | server.1=172.31.0.4:2888:3888 |
新机器上面的zk先不要启动
1 | server.6=172.31.0.5:2888:3888 |
手工操作
1 | start) /opt/zookeeper/zookeeperServer0/bin/zkServer.sh start /opt/zookeeper/zk1/conf/zoo.cfg |
总体原则
详细步骤
zk集群中有半数以上节点存活即可提供服务,使用这个特性可以把3个节点的集群扩容到5个节点的集群,然后在依次缩容,减少的3个节点的集群。通过这个过程达到迁移的目的。
准备集群环境:
| Myid | IP | 端口 |
|---|---|---|
| 1 | 172.31.0.4 | 2181 |
| 2 | 172.31.0.4 | 2182 |
| 3 | 172.31.0.4 | 2183 |
| 6 | 172.31.0.5 | 2181 |
| 7 | 172.31.0.5 | 2182 |
| 8 | 172.31.0.5 | 2183 |
旧集群是172.31.0.4,新集群是172.31.0.5。新集群的myid必须要比旧集群的大,不然服务启动不了。
扩容
修改myid为 6 7的配置,启动这2个进程:
1
2
3
4
5server.1=172.31.0.4:2888:3888
server.2=172.31.0.4:2889:3889
server.3=172.31.0.4:2890:3890
server.6=172.31.0.5:2888:3888
server.7=172.31.0.5:2889:3889使用
/opt/zookeeper/zookeeperServer0/bin/zkServer.sh status /opt/zookeeper/zk1/conf/zoo.cfg这个命令来查看状态,如果是follower即可。启动节点4和节点5的zk服务,并在leader节点查看数据是否同步。在leader上面查询followers数:
1
2
3[root@gl7wid90gwcewn ~]# echo mntr|nc 172.31.0.5 2182 |grep followers
zk_followers 4
zk_synced_followers 4这时可以看到zk_followers为4,zk_synced_followers表示已经同步的follower。
依次修改配置
myid 1 2 3这三个进程的配置,并重启服务。配置的话,将server.6 server.7这两个配置添加到原有的旧zk配置里面。然后按以下规则进行重启:重启时应保证先重启myid最小的机器,由小向大进行重启。Leader无论其myid大小,都放到最后重启。ZooKeeper的机制中,myid大的会向小的发起连接,而小的不会向大的发起连接。因此如果最后重启myid最小的机器,则其可能无法加入集群- 重启follower节点无影响,当重启leader节点时会触发leader选举,zxid最新的默认优先当选新的leader,当zxid相同,myid最大的优先当选新的leader
- 重启完成之后,需要确认这5个zk进程的状态是否是正常的。
缩容
将5节点缩容为3节点,将myid 1 2停止zk服务下线,假设这两个节点为follower,修改myid 3 6 7配置,按照重启原则重启这个3个节点的zk服务:
直接将myid 1 2的zk服务停止
按照重启原则对
myid 3 6 7的服务进行重启:由于现在leader是在
myid 7上面,这时就放最后面重启先修改
myid 3的zoo.cfg的配置,将server修改为如下,然后重启zk
1
2
3server.3=172.31.0.4:2890:3890
server.6=172.31.0.5:2888:3888
server.7=172.31.0.5:2889:3889- 再修改
myid 6的zoo.cfg的配置,重启ZK - 最后面修改
myid 7的zoo.cfg的配置,重启ZK - 再次查看状态,可以看到leader已经是在
myid 6上面了。
最后一台迁移
按上面的方式,先扩容,再缩容即可。一定要按照重启原则进行重启。注意,最后迁移时,只用4个进程,不会受影响。
https://nurhier.github.io/2017/07/19/migrate-zookeeper/index.html