背景 因为阿里经常进行机房断网演练, 如果一套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选举