Fork me on GitHub

ZooKeeper动态扩容、缩容

Zookeeper是大数据领域中常用的分布式协调工具,如何不中断服务动态的扩充、缩减、迁移node?

环境说明

先有一个3台机器的zk集群,需要先对这个集群进行扩容增加节点,随后进行缩容;最终达到节点迁移的目的

ps:zookeeper相关概念、配置、环境搭建不在赘述

mid node
1 node1
2 node2
3 node3
4 node4
5 node5
6 node6

ZooKeeper监控工具推荐用: zkui

ZooKeeper监控命令推荐(必须提前安装nc):

1
2
// 查看zk状态
echo stat | nc 127.0.0.1 2181
Command Desc
conf 输出相关服务配置的详细信息
cons 列出所有连接到服务器的客户端的完全的连接/会话的详细信息,包括 接受 or 发送的包数量、会话 id 、操作延迟、最后的操作执行等等信息
dump 列出未经处理的会话和临时节点
envi 输出关于服务环境的详细信息(区别于 conf 命令)
reqs 列出未经处理的请求
ruok 测试服务是否处于正确状态;如果确实如此,那么服务返回 imok ,否则不做任何相应
stat 输出关于性能和连接的客户端的列表
wchs 列出服务器 watch 的详细信息
wchc 通过 session 列出服务器 watch 的详细信息,它的输出是一个与watch 相关的会话的列表
wchp 通过路径列出服务器 watch 的详细信息;它输出一个与 session相关的路径

扩容 & 缩容

  • 思路

原本有node1、2、3 的zk集群,现在要将node4、5、6的节点加入,扩充3个节点

zk节点数应为3、5、7这样的奇数个,否则无法选举出leader,因此想要添加node4、5、6节点,则:

  1. 添加node4、5,使得总节点数从3个扩充到5
  2. (n-1)/2,5节点zk允许挂掉2个节点,则先下线node1、再上线node6
  3. 此时在线节点有node2、3、4、5、6
  4. 最后再下线node2、3节点
  5. 此时zk节点从node1、2、3切换到了node4、5、6

操作步骤

查看node1、2、3状态

node1(follower):

1
2
3
4
5
6
7
8
9
Received: 247
Sent: 246
Connections: 2
Outstanding: 0
Zxid: 0x5500000012
Mode: follower
Node count: 37658
Environment:
zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT

node2(leader)

1
2
3
4
5
6
7
8
9
Received: 19
Sent: 18
Connections: 1
Outstanding: 0
Zxid: 0x5500000012
Mode: leader
Node count: 37658
Environment:
zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT

node3(follower)

1
2
3
4
5
6
7
8
9
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x5500000012
Mode: follower
Node count: 37658
Environment:
zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT

增加node4、5节点

1
2
3
4
5
6
7
// 修改zoo.cfg

server.1=node1:2888:3888
server.2=node2:2888:3888
server.3=node3:2888:3888
server.4=node4:2888:3888
server.5=node5:2888:3888

node4(follower)

1
2
3
4
5
6
7
8
9
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x5500000015
Mode: follower
Node count: 37658
Environment:
zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT

node5(follower)

1
2
3
4
5
6
7
8
9
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x5500000016
Mode: follower
Node count: 37658
Environment:
zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT

修改node1、2、3配置,重启

ps: 最后在重启leader节点,会触发选举,默认会选择myid最大的为新leader,即node5

轮序重启后,原来node2:Mode: leader——>Mode: follower;最后添加的node5:Mode: follower——>Mode: leader

至此新增2个节点完成,现在集群一共5个节点

下线node1、上线node6

  • 下线node1

关闭node1,修改node2、3、4,去除node1配置后重启

最后修改node5,新增node6配置重启,此时node5任然是leader

至此node1下线,5个节点的zk允许挂掉2个节点

  • 上线node6

修改node2、3、4节点,添加node6配置后重启

上线node6节点,配置与node2、3、4相同

node6(follower)

1
2
3
4
5
6
7
8
9
Received: 1
Sent: 0
Connections: 1
Outstanding: 0
Zxid: 0x5900000002
Mode: follower
Node count: 37658
Environment:
zookeeper.version=3.4.8--1, built on 02/06/2016 03:18 GMT

重启node5,此时会触发选举,选择node6为新leader

至此5个节点配置完全相同,node6加入集群且为新leader

下线node2、3

关闭node2、3,修改node4、5,去除node2、3配置后重启

修改node6,去除node2、3配置重启,此时会选取myid最大的node5为leader

至此node1、2、3全部下线完成,zookeeper已经从node1、2、3节点迁移到了node4、5、6节点

其他方案

  1. 修改node4、5、6配置,添加6个节点全部配置,依次启动;此时node4、5、6是无法加入节点的
  2. 修改node1、3配置,添加node4、5、6信息,重启;此时会触发选举,根据myid最大的node6为leader;之前的leader node2被踢出集群
  3. 下线node1、2,修改node4、5,去除node1、2配置后重启,此时leader依然是node6
  4. 修改node6,去除node1、2、3配置重启,此时会触发选举,根据myid选择node5为leader
  5. 下线node3,修改node4、5,去除node3配置重启,触发选举,node6为leader

转载请注明出处:https://github.com/imperio-wxm


Thank you for your support.