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 | // 查看zk状态 |
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节点,则:
- 添加node4、5,使得总节点数从3个扩充到5
- (n-1)/2,5节点zk允许挂掉2个节点,则先下线node1、再上线node6
- 此时在线节点有node2、3、4、5、6
- 最后再下线node2、3节点
- 此时zk节点从node1、2、3切换到了node4、5、6
操作步骤
查看node1、2、3状态
node1(follower):1
2
3
4
5
6
7
8
9Received: 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
9Received: 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
9Received: 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 | // 修改zoo.cfg |
node4(follower)1
2
3
4
5
6
7
8
9Received: 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
9Received: 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
9Received: 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节点
其他方案
- 修改node4、5、6配置,添加6个节点全部配置,依次启动;
此时node4、5、6是无法加入节点的
- 修改node1、3配置,添加node4、5、6信息,重启;
此时会触发选举,根据myid最大的node6为leader;之前的leader node2被踢出集群
- 下线node1、2,修改node4、5,去除node1、2配置后重启,
此时leader依然是node6
- 修改node6,去除node1、2、3配置重启,
此时会触发选举,根据myid选择node5为leader
- 下线node3,修改node4、5,去除node3配置重启,
触发选举,node6为leader
转载请注明出处:https://github.com/imperio-wxm