Table of Contents
背景
最近在我们围绕着全网跨云迁移在折腾,有幸owner了线上两套zk集群的迁移,zk不能停机迁移,而且zk是3.4.13,是较老的版本, 这个版本的平滑迁移比较烦人,需要在几台zk间循环的改配置重启等,操作并不难,但是要心细。
我们的业务都在k8s上,服务都是使用内网域名来访问zk,所以业务对zk的读写切换只涉及域名切换、业务重启。难点、折腾点是需要找到连接了这台zk的所有业务, 因为很多时候查看cmdb或者查看什么服务用了这个zk域名作为业务变量也是看不全的,重启完后难免会有零星的几个服务仍连接这设施。所以我们需要通过设施机器 上的连接(netstat -antlp)来判断还有什么机器连接,进而查出有什么业务pod连接,直至没有业务连接到设施,才进行下一步的关机、切换、下架等。
于是乎我写了一个小脚本,专门用来查zk上有什么IP连接。从连接过来的IP机器里面,查看conntrack -L | grep 2181,查出k8s snat前的pod IP,最终根据pod IP 查到是哪个pod。重启完连接的服务很关键,不然都无法下架旧zk节点。
怎么迁移?
3.4.13这个版本的zookeeper迁移,在上线新节点和下线旧节点后,需要逐个节点改配置,逐个循环重启。在操作的过程中,我们的操作核心需要关注的是 要保证上线还是下线ZK节点操作之后,整个集群中,每一个节点都认为当前在线的节点数满足合法成员数即可。
什么是合法成员数?每个节点怎么样才认为当前满足合法成员? ZK集群至少 ”过半数“ 的节点成员健康且在线,过半数。 ZK的合法成员数=向下取整 ( 配置中总节点数 / 2 ) + 1。例如zoo.cfg中配置了10个节点,那么合法成员数为6,若配置了9个节点,合法成员则为5。 合法合法,指的是什么规定?什么法?其实合法成员数就是一组成员节点中,至少能够选举出leader的节点数量。反之,不满足则无法选举出leader,所有节点呈looking 状态,无法构成集群,无法提供服务。怎么样才算合法?通常只要zk节点正常启动,配置无误即合法;宕掉的机器,ip被配置在其他zk节点上,但是自己没有启动zk的节点,就不合法, 总之,没有正常启动在线的zk节点,就是不合法的。
对于每一个ZK节点,在zoo.cfg配置文件中定义了当前节点与哪些节点共同归属于一个集群,zoo.cfg里定义了这个zk集群所包含的全部节点的ID,ip 和端口。 每一台ZK节点都有zoo.cfg,而zoo.cfg就是这个zk节点认知的体现。 例如zoo.cfg中配置了10个节点ip,那么当前节点就认为我是一个10节点集群的成员之一,这10个节点,在我做leader选举、集群加入等都需要考虑。
那么我启动的时候,包括自身在内,我必须要有满足合法成员数6个节点健康在线,才能组成集群,并选举出leader。 如果我启动的时候,已经能与10个节点中的6个做通信,且这6个已然构成集群,有合法leader,那我就会加入到该集群中。 如果我启动的时候,包括自身在内,不满足6个节点在线,那么我就会进入looking状态,无法正常提供服务,直到能连通5个节点,加上自身共6个构成集群。
详细操作
原5节点集群,目标全下架5个旧节点,迁移5台对等新节点。
- 新增1台zk(6/10),,配置:9台zk,注释1台新节点。 待所有节点加入集群后,该节点取消注释节点,重启。
注释1台新节点,对于新节点来说,合法节点数为:向下取整(9/2) + 1 =5台。 新节点启动时,老的5台节点正常运行,符合新节点认为的合法节点数,新节点与其他节点通信后,认定原leader为合法、健康leader,遂加入集群,成为follower。
如果不注释掉一台新节点,那新节点的认知中,合法节点数为6台。新节点启动时,发现只有5台可用,找不到稳定集群加入,那他就触发选举,然而,其他5台老节点已然组成稳定集群,不会参与新节点的选举,孤独的他,只获得投给自己的一票leader,不满足6票,成为不了leader,新节点的状态会一直looking。 如果继续加新节点进来即使剩下4台都加进来,那也不满足6票,因为老节点不会参与他们的投票,他们怎么也只有5票,5个都会looking…不可用。
-
新增1台zk(7/10),配置:10台zk全写。
-
新增1台zk(8/10),配置10台全写。
-
新增1台zk(9/10),配置10台全写。
-
新增1台zk(10/10),配置10台全写。
-
第一台新节点,修改配置,取消注释,重启。
-
下架1台老follower,直接stop
-
剩余3台老follower分别改配置:3老follower,1leader和5新节点。并逐个重启
-
leader改配置:同上,3老follower,1leader和5新节点。并重启
集群现状: 目前9人在线,且8节点已然达成共识,可以互相投票 老派节点:认为总人数9人,至少5人在线 新派节点:认为总人数10人,至少6人在线
- 域名解析修改,服务重启,观察旧节点连接数。
- 下架两台老follower,直接stop
下架后,共7节点,2老follower,4新follower,1leader节点。
- 所有follower,改配置只留上述7节点(2老,5新)。并重启
目的是重新构成7节点集群
- leader,改配置同上,只留7个运行中的节点。并重启
至此构成7节点集群,7节点至少4个在线,下一步下掉2台老follower
-
下架两台老follower,直接stop
-
所有follower,改配置5个新节点。并重启
-
leader,改配置只留5个新节点。并重启,完成迁移。