ThinkInOpenSource / zookeeper

zookeeper实践
Apache License 2.0
1 stars 0 forks source link

zookeeper 扩容方案 #8

Open luoxn28 opened 6 years ago

luoxn28 commented 6 years ago

zookeeper默认是单机模式,如果想要集群部署(集群分为伪集群:单机器上启动多个zk实例,集群:多个机器组成多个zk实例),则需要在zoo.cfg文件尾添加如下配置:

server.0=00.11.22.33:2888:3888
server.1=11.22.33.44:2888:3888
server.2=22.33.44.55:2888:3888

其中server.0中0指的是server的id(区分集群中zk实例),00.11.22.33是server的ip地址,2888是服务器与集群中Leader交换信息的端口,3888是集群中服务器进行选举的端口。如果是在同一台机器部署的话,将ip地址写一样的,但是端口号就需要变更一下了。

除了修改zoo.cfg添加集群配置外,还需要在dataDir配置的路径下新建一个myid文件,这是用于区别不同zookeeper的id文件,我们只需要在文件写上这个zookeeper的id就可以,也就是0、1或者2这种。配置完成之后,就可以启动zookeeper集群。使用./zkServer.sh status可查看zookeeper状态信息。

动态扩容

说到动态扩容,那么如何在不影响zk服务的情况下动态扩容呢?这里分为2种情况。(需要注意的是,由于zookeeper的特性:集群中只要有过半的机器是正常工作的,那么整个集群对外就是可用的。所以我们假设所有集群的数量都是奇数

第一种情况在扩容的时候,短暂的停止服务是不可避免的。因为修改了配置文件,需要将原机器进行重启,而其他系统都依赖于此单机zookeeper服务。在扩容的时候,我们需要先将扩容的机器配置部署完成,在最后阶段,修改原机器上的配置文件后对服务进行重启。这个时候就会出现短暂的停止服务。

而且新机器部署的时候,会有端口异常的错误出现,这是因为单机模式下的zookeeper交换信息的端口2888和选举的端口3888都没有打开,所以会出错。这个时候不用理会,等最终原机器重启完成后,错误就会停止了。

第二种情况就比较好了,步骤还是相同的,先部署新机器,再重启老机器。在重启的过程中,需要保证一台机器重启完成后,再进行下一台机器的重启。这样就整个集群中每个时刻只有一台机器不能正常工作,而集群中有过半的机器是正常工作的,那么整个集群对外就是可用的。所以这个时候不会出现错误,也不会出现停止服务,整个扩容过程对用户是无感知的。

举个例子,加入现在有2台zk集群,现在增加一台,相当于在之前zk的zoo.cfg配置上再增加一个新的zk实例配置,启动新的zk服务后,相当于多了一个follower服务节点。然后再修改之前集群中的follower配置,修改完成后重启。最后修改leader配置,修改完成后重启。这样就完成了扩容操作。(注意,这里新增的zk服务启动后,如果直接把leader kill掉,此时集群是无法工作的,因为原来的follower节点还不知道新增节点的信息,此时无法进行leader选举)

参考资料: 1、http://fangchao.me/2016/10/13/zookeeper.html