zookeeper迁移

背景

当前zk集群为3节点单机房部署,为了增加集群的跨机房的容灾内里,需要将3个节点分别部署在3个可用区,迁移过程中不中断业务,因此需要先扩容后下线

zookeeper选举原则

  • 首先比较 Zxid,哪个节点的 Zxid 最大就选择谁作为 leader
  • 在所有节点的 Zxid 全都一致的情况下,则比较选举 id(myid文件中的值),选举 id 较大的节点会作为 leader
  • 由于zookeeper只允许 myid 大的节点连接到 myid 小的节点,所以启动 zookeeper 的顺序应该按照 myid 从小到大启动,最后再启动leader节点。

迁移风险

  • zk业务使用方,使用的是ip地址还是域名,如何统计?
  • zk除了用于配置中心,是否还有其他业务线用于键值存储?
  • zk使用方的业务除了部署容器的,ECS上的业务怎么重启?
  • zk迁移到新IP后,AC是否需要重启
  • 如果应用不重启,使用ZK加载动态配置的业务方由于获取的是老ip导致配置下发异常,是否会引发线上故障

迁移总体方案

  1. zk从5节点扩容到8节点,新增的3个节点分布到2个或者3个机房
  2. 修改zk域名解析到最新的5个节点上
  3. ZK使用方重启应用以获取最新的IP地址
  4. 老节点没流量后,逐步下线老的3个节点

迁移步骤-扩容

参考链接

  • 当前现状
    • server.1=192.16.35.216:2181 follower
    • server.2=192.16.35.217:2181 follower
    • server.3=192.16.35.218:2181 leader
  • 将192.16.90.44加入集群,原有节点配置暂时不要改
# zoo.cfg配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/alidata/server/zookeeper-3.4.6/data
clientPort=2181
clientPortAddress=192.16.90.44
maxClientCnxns=600
server.1=192.16.35.216:2888:3888
server.2=192.16.35.217:2888:3888
server.3=192.16.35.218:2888:3888
server.11=192.16.90.44:2888:3888
# data目录新增myid 内容为:11,为了后面将leader选举给新节点,id要大
# 启动新节点
# 查看zk状态 echo mntr|nc 192.16.35.218 2181
zk_version	3.4.6-1569965, built on 02/20/2014 09:09 GMT
zk_avg_latency	0
zk_max_latency	878
zk_min_latency	0
zk_packets_received	3721607370
zk_packets_sent	4095812121
zk_num_alive_connections	99
zk_outstanding_requests	0
zk_server_state	leader
zk_znode_count	86745
zk_watch_count	562752
zk_ephemerals_count	163
zk_approximate_data_size	9747076
zk_open_file_descriptor_count	136
zk_max_file_descriptor_count	65535
zk_followers	3 #新增了一个follower节点数符合预期
zk_synced_followers	3
zk_pending_syncs	0
  • 将192.16.91.173加入集群
# zoo.cfg配置
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/alidata/server/zookeeper-3.4.6/data
clientPort=2181
clientPortAddress=192.16.91.173
maxClientCnxns=600
server.1=192.16.35.216:2888:3888
server.2=192.16.35.217:2888:3888
server.3=192.16.35.218:2888:3888
server.11=192.16.90.44:2888:3888
server.12=192.16.91.173:2888:3888
# data目录新增myid 内容为:12,为了后面将leader选举给新节点,id要大
# 启动新节点
# 查看zk状态 echo mntr|nc 192.16.35.218 2181 |grep zk_followers
zk_followers	4 #新增了一个follower节点数符合预期
  • 修改新节点192.16.90.44配置信息,将12节点配置信息加入
# zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/alidata/server/zookeeper-3.4.6/data
clientPort=2181
clientPortAddress=192.16.90.44
maxClientCnxns=600
server.1=192.16.35.216:2888:3888
server.2=192.16.35.217:2888:3888
server.3=192.16.35.218:2888:3888
server.11=192.16.90.44:2888:3888
server.12=192.16.91.173:2888:3888
# 重启服务
  • 修改旧节点配置文件,旧节点重启顺序是先重启follower节点,最后重启leader节点
# zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/alidata/server/zookeeper-3.4.6/data
clientPort=2181
clientPortAddress=192.16.90.44
maxClientCnxns=600
server.1=192.16.35.216:2888:3888
server.2=192.16.35.217:2888:3888
server.3=192.16.35.218:2888:3888
server.11=192.16.90.44:2888:3888
server.12=192.16.91.173:2888:3888
# 最后重启leader节点,并检查新leader节点是否是新扩容的节点

迁移步骤-修改域名解析并重启相关应用

  • 修改域名解析到新节点
  • 重启zk应用方

迁移步骤-老节点下线

  • 旧节点下线不能同时下线,只能依次下线
  • 需要判断待下线上的流量是否已经切换到新节点
  • 下线节点1,192.16.35.216
# 停止192.16.35.216上的zk服务
# 依次修改其余4个节点的配置如下:
server.2=192.16.35.217:2888:3888
server.3=192.16.35.218:2888:3888
server.11=192.16.90.44:2888:3888
server.12=192.16.91.173:2888:3888
# 其余4个节点配置修改后,依次重启,重启完成后,观察下leader是否分布在新节点
  • 下线节点2,192.16.35.217,方法同上,配置如下:
server.3=192.16.35.218:2888:3888
server.11=192.16.90.44:2888:3888
server.12=192.16.91.173:2888:3888
# 同样依次重启剩下的3个节点,重启完成后,观察下leader是否分布在新节点
  • 结束