zookeeper 扩容

背景

因为阿里经常进行机房断网演练, 如果一套zk 只能部署在一个机房时, 当发生断网时, 这套zk是无法为其他机房提供zk 服务, 因此需要将单机房zk 升级到多机房zk, 但因为zookeeper是强同步方式, 所有的请求会在内部进行同步, 如果机器之间延迟比较大时, zookeeper 问题会非常多, 因此,这套解决方案前提条件是同城多机房, 并且时延比较小。

这套解决方案也适合, zookeeper 升级扩容和zookeeper 机器替换

在多机房方案中, 常常是3机房, 这个时候,推荐221 的分布模式, 客户端多的机房多部署一台zookeeper

解决的问题

目前zk 是3台机器, 现在需要再新增3台机器, 并把老的3台机器中一台给下线掉。

步骤

  • 扩容新zookeeper
  • 下线无用的zookeeper
  • 更新所有zookeeper

zk的变更其实需要非常小心, 如果发生错误,会导致整个zk停止服务, 会导致大片程序出错。
所以, 思路是,逐步增加机器, 尽量减少leader的变更

扩容新zookeeper

扩容时, 新增一台机器的配置,仅仅比运行zk的配置多一台机器, 从而保证zk集群的leader不会发生任何变更

老的zookeeper 配置

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
# 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.
maxClientCnxns=300
dataDir=/dev/shm/zk/data
dataLogDir=/dev/shm/zk/logs

# the port at which the clients will connect
clientPort=2181
# The number of snapshots to retain in dataDir
autopurge.snapRetainCount=5
# Purge task interval in hours
# Set to "0" to disable auto purge feature
autopurge.purgeInterval=1

#minSessionTimeout=10000
minSessionTimeout=100
maxSessionTimeout=100000

server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888

扩容D

新增D 的配置

扩容后新的配置是:

1
2
3
4
5
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888

有几点需要注意:

  • /dev/shm/zk/data 目录下,记得创建id
  • 本例中, zookeeper 的目录是放到共享内存中, 因此需要一个cronjob 每分钟 把新的增量数据文件同步到本地硬盘中,并把本地硬盘中的过时文件删除
  • 下线机器的id 会被保留,不会覆盖, 避免出现数据紊乱
  • 增加D 后,需要确保A/B/C/D zk提供服务,并且集群只有一个leader, 如果没有,则需要重做;有很多的方法, 下面提供一种方法
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     ~  echo srvr | nc zkD.jstorm.alibaba.com 2181
    Zookeeper version: 3.4.5-1392090, built on 09/30/2012 17:52 GMT
    Latency min/avg/max: 0/0/13432
    Received: ***
    Sent: ***
    Connections: ***
    Outstanding: 0
    Zxid: 0x***
    Mode: follower
    Node count: ***

扩容E

新增E 的配置

1
2
3
4
5
6
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888
server.5=zkE.jstorm.alibaba.com:2888:3888

有几点需要注意:

  • /dev/shm/zk/data 目录下,记得创建id
  • 本例中, zookeeper 的目录是放到共享内存中, 因此需要一个cronjob 每分钟 把新的增量数据文件同步到本地硬盘中,并把本地硬盘中的过时文件删除
  • 下线机器的id 会被保留,不会覆盖, 避免出现数据紊乱
  • 增加E 后,需要确保A/B/C/D/E zk提供服务,集群只有一个leader

扩容F

新增F 的配置

1
2
3
4
5
6
7
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888
server.5=zkE.jstorm.alibaba.com:2888:3888
server.6=zkF.jstorm.alibaba.com:2888:3888

有几点需要注意:

  • /dev/shm/zk/data 目录下,记得创建id
  • 本例中, zookeeper 的目录是放到共享内存中, 因此需要一个cronjob 每分钟 把新的增量数据文件同步到本地硬盘中,并把本地硬盘中的过时文件删除
  • 下线机器的id 会被保留,不会覆盖, 避免出现数据紊乱
  • 增加E 后,需要确保每台zk提供服务

更新D 配置

更新d 的配置后, 重启D 的zookeeper, 并检查所有zk 节点是否正常

1
2
3
4
5
6
7
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888
server.5=zkE.jstorm.alibaba.com:2888:3888
server.6=zkF.jstorm.alibaba.com:2888:3888

更新E 配置

更新e 的配置后, 重启e 的zookeeper, 并检查所有zk 节点是否正常

1
2
3
4
5
6
7
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888
server.5=zkE.jstorm.alibaba.com:2888:3888
server.6=zkF.jstorm.alibaba.com:2888:3888

更新老zookeeper的配置

步骤:

  • 检查老zk, 谁是leader, 谁是follower
  • 更新zookeeper 配置
  • 重新启动zookeeper
  • 检查重启的zookeeper是否能提供服务

注意几点:

  • 还是必须一台一台的操作, 一台完成后,才能进行下一台
  • 配置文件 含有6台机器, 而不是5台机器
  • 变更过程中, 所有zk 的角色不发生任何变更。

在本例中, 假设leader是c, 则我们先变更a, 成功后,再变更b

这次的配置文件是:

1
2
3
4
5
6
7
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.3=zkC.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888
server.5=zkE.jstorm.alibaba.com:2888:3888
server.6=zkF.jstorm.alibaba.com:2888:3888

下掉老zk的leader

  • 杀死老zk的leader
  • 检查所有zk是否提供服务, 确保所有zk能够提供服务

更新所有机器的配置

这次的配置文件是:

1
2
3
4
5
6
## 其他配置 同老的配置 ##
server.1=zkA.jstorm.alibaba.com:2888:3888
server.2=zkB.jstorm.alibaba.com:2888:3888
server.4=zkD.jstorm.alibaba.com:2888:3888
server.5=zkE.jstorm.alibaba.com:2888:3888
server.6=zkF.jstorm.alibaba.com:2888:3888

新的配置文件, 会剔除掉一台zk机器, 就是老的zk leader

注意几点:

  • 还是必须一台一台的操作, 一台完成后,才能进行下一台
  • 配置文件 含有5台机器,新的配置文件同样需要同步到下线的c机器上,以防止c后面被误启动
  • 变更过程中, leader所在的机器必须是最后变更, 这样可以减少一次leader选举