当前位置: 首页 > 后端技术 > Java

记录zookeeper集群迁移及易错点

时间:2023-04-02 00:18:00 Java

本文使用《Signature4.0International(CCBY4.0)》许可协议,欢迎转载,或二次使用,但需注明出处。Signature4.0International(CCBY4.0)本文作者:Nicksxs创建时间:2022-05-29本文链接:记录zookeeper集群的迁移和容易出错的点。前段时间做了一个zk的集群升级迁移,可能是因为原来是三节点集群zk集群(zoo.cfg配置中最低可用可能是zk1192.168.2.1zk2192.168.2.2zk3192.168.2.3如下server.1=192.168.2.1:2888:3888server.2=192.168.2.2:2888:3888server.3=192.168.2.3:2888:3888添加节点需要将集群迁移到192.168.2.4(简称zk4),192.168.2.5(简称zk5),192.168.2.6(简称zk6)三台机器上都没有zk部署,我们要的是数据不会丢失,主要考虑的是滚动升级,我其实这里犯了几个错误,我也特意说明了我们要加入Go进去,所以我在zk4、zk5、zk6中的配置是这样的2.4:2888:3888server.5=192.168.2.5:2888:3888server.6=192.168.2.6:2888:3888发现status是节点没有upPS:可以通过./zkServer.shstatus查看当前节点的状态查看第一个问题是我需要一个myid文件来识别我是哪个节点,里面的内容可以写成4或者5或者6这样就可以了,这个文件的路径要在dataDir=data目录下的配置文件中指定第二个问题困扰了我许久。我按照上面的配置启动节点后,发现这些节点都没有起来,出现了FastLeaderElection@xxx-Notificationtimeout:60000的错误。一开始以为是网络没有连接,端口是由于这些原因未开放。检查后,已全部连接。原因其实和我之前的一个考虑有关。当有六个节点时,理论上需要一半以上的节点可用。簇才会健康,但是按照我的方法,我其实配置了6个节点,但是其中3个不可用(包括自己的节点),那自然就不能正常工作了,所以其实需要Rollingadd,类似这样,我的zk4配置应该像这样server.1=192.168.2.1:2888:3888server.2=192.168.2.2:2888:3888server.3=192.168.2.3:2888:3888server.4=192.168。2.4:2888:3888然后zk5配置server.1=192.168.2.1:2888:3888server.2=192.168.2.2:2888:3888server.3=192.168.2.3:2888:3888server.4=192.168.2.4:2888:3888server.5=192.168.2.5:2888:3888然后zk6配置可以都是server.1=192.168.2.1:2888:3888server.2=192.168.2.2:2888:3888server.3=192.168.2.3:2888:3888server.4=192.168.2.4:2888:3888server.5=192.168.2.5:2888:3888server.6=192.168.2.6:2888:3888然后为了集群完全更新,继续添加zk4和zk5的其他节点,这样我的6节点集群启动,下一个节点就在这里。又踩了一个坑,还是没看懂这两种方法的区别。第一个说说我没有用到的第一种方法。(也有道理)其实上面这个集群有一个很明显的问题。事实上,旧集群各自识别一个三节点集群,其中zk3是主节点。对于zk1、zk2、zk3,他们只能看到这三个节点。三个zk4、zk5和zk6节点可以连接到其他五个节点。可以认为这是一个六节点的集群,所以更合理的操作应该是将最后三个节点添加到旧的三个节点上。也就是每个节点的配置里有6台服务器,然后我下线到老节点。这里理想的需要注意的是下一个节点的配置需要修改,下线的节点要去掉。再次重启,比如我知道集群中的leader在zk3上,那么我就先把zk1和zk2连接起来然后我把zk1下线后,把其他5个节点上zk1的配置删掉,然后重启。这个其实没有必要,但是会比较靠谱。理论上我也可以dropzk1和zk2然后修改配置,重启剩下的节点。当集群中只有zk3、zk4、zk5、zk6四个节点,并且每个节点中的配置只有这四台服务器时,当我作为zk3的leader下线时,会进行一次选举,然后会选出一个新的leader,因为刚好是三个节点,这也保证了最低可用性。第二种也是我踩坑的一种方式,就是我没有修改原来三个节点的配置,一开始我以为下线zk1,zk2,zk3就可以完成下线(for选),然后进行Restart,不过这个方法就是我上面说的。原来的三个节点中,我把zk1掉下来还能正常运行,但是当我用zk2下线的时候,集群相当于挂掉了,小于可用的最小值。这样,三个节点就都挂了,而对于新加入的三个节点,又回到了当初起不来的状态。六个节点只有三个节点在线,导致整个集群挂掉,所以像我这样的操作,需要滚动修改才能启动。当zk1离线时,需要将zk1从zk4、zk5、zk6中移除,然后重新启动。当然,这样做唯一的好处就是可以少重启几次。当zk2继续下线时,移除zk2实际上,移除zk1后,修改并重启,当zk2下线时,集群会重新选举,因为当zk2下线时,zk3仍然会一起下线。这是我们需要特别注意的