1 zookeeper介绍
zookeeper作为一种分布式服务框架,为分布式应用提供一致性服务,它是开源的Hadoop项目中的一个子项目。在部署模式中,zookeeper支持单机模式和集群模式,生产环境中采用集群模式部署。
应用系统在使用zookeeper集群时最好采用域名方式,尽量避免直接使用IP地址。
2 集群迁移背景
目前线上zookeeper集群有3个节点,由于机器下线需要把3个节点迁移到其他机器上,迁移过程zookeeper不能停止服务,并保证数据正常,尽量少的重启应用服务。
3 迁移方案
迁移方案有如下两种:
(1) 搭建新的zookeeper集群,通过脚本将原有zk数据备份,并导入到新的zk集群,然后重启应用服务,使用新集群。这种方案操作简单,但是缺点较多,稳定性差,使用范围小(适用于只读zk的应用场景)。不作详细介
(2) 先扩容后缩容
zk集群中有半数以上节点存活即可提供服务,使用这个特性可以把3个节点的集群扩容到5个节点的集群,然后在依次缩容,减少的3个节点的集群。通过这个过程达到迁移的目的。具体步骤如下:
1.准备集群环境
Index | IP | Hostname |
---|---|---|
1 | 10.10.0.110 | zk-00 |
2 | 10.10.0.111 | zk-01 |
3 | 10.10.0.112 | zk-02 |
4 | 10.10.0.113 | zk-03 |
5 | 10.10.0.114 | zk-04 |
6 | 10.10.0.115 | zk-05 |
2.扩容。查看当前3节点集群状态,以及各个节点的角色
可使用zookeeper查看工具
3.修改节点4和节点5的配置conf/zoo.conf文件
1 | # The number of milliseconds of each tick |
4.启动节点4和节点5的zk服务,并在leader节点查看数据是否同步
5.依次修改配置,并重启节点1、节点2、节点31
2
3
4
5server.1=10.10.0.110:2888:3888
server.2=10.10.0.111:2888:3888
server.3=10.10.0.112:2888:3888
server.4=10.10.0.113:2888:3888
server.5=10.10.0.115:2888:3888
重启zk服务原则:
- 我们应该保证,集群中最低有3台ZooKeeper是正常启动的。
- 重启时应保证先重启myid最小的机器,由小向大进行重启。
- Leader无论其myid大小,都放到最后重启。ZooKeeper的机制中,myid大的会向小的发起连接,而小的不会向大的发起连接。因此如果最后重启myid最小的机器,则其可能无法加入集群
- 重启follower节点无影响,当重启leader节点时会触发leader选举,zxid最新的默认优先当选新的leader,当zxid相同,myid最大的优先当选新的leader
6.此时zk集群为5节点集群,查看集群状态
7.缩容,将5节点缩容为3节点
8.将节点1和节点2停止zk服务下线,假设这两个节点为follower
9.修改节点3,4,5配置,按照重启原则重启这个3个节点的zk服务1
2
3server.3=10.10.0.112:2888:3888
server.4=10.10.0.113:2888:3888
server.5=10.10.0.115:2888:3888
10.另一个节点的迁移按照以上步骤完成
4 注意事项
迁移过程中扩容到5节点,然后缩容到3节点,这个过程中会有一个原有集群的节点存在,zk集群仍然可以通过服务。
(1)如果应用服务中使用IP+port访问zk集群,此时应该修改应用程序中的zk集群IP地址为:10.10.0.113:2888 10.10.0.114:2888 10.10.0.115:2888
,然后重启应用服务程序。
(2)如果应用中使用域名访问zk集群,那么可以将节点1,2使用的域名映射到节点4,5的IP