zookeeper集群在线迁移

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=/opt/zookeeper-3.4.8/data
dataLogDir=/opt/zookeeper-3.4.8/logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.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

4.启动节点4和节点5的zk服务,并在leader节点查看数据是否同步
5.依次修改配置,并重启节点1、节点2、节点3

1
2
3
4
5
server.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服务原则:

  1. 我们应该保证,集群中最低有3台ZooKeeper是正常启动的。
  2. 重启时应保证先重启myid最小的机器,由小向大进行重启。
  3. Leader无论其myid大小,都放到最后重启。ZooKeeper的机制中,myid大的会向小的发起连接,而小的不会向大的发起连接。因此如果最后重启myid最小的机器,则其可能无法加入集群
  4. 重启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
3
server.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