天天看点

ZooKeeper动态增加Server(动态增加节点)的研究(待实践)

说明:是动态增加Server,不是动态增加连接到ZK Server的Client。

场景如下(转自外文):

1、在​

​t=t_1->[peer-1(Leader),peer-2],​

​peer-1是主节点,所有客户端连接到该节点。

2、在​

​t=t_2->[peer-1(Leader),peer-2,peer-3]​

​,稍后的时候,同行3加入了该组。是否可以“动态地”将动态列表添加到zookeeper服务器列表(即,在对等体1上不重新启动ZooKeeper)?

3、在​

​t=t_3->[peer-3(Leader),peer-4],​

​一段时间后,对等体1和对等体2离开组(例如,死亡或被关闭)。假设有一种方法来动态地将peer-3和peer-4添加到组中peer-3成为领导者并且所有客户端请求都发送到对等体3。

提示:或者这样说,原始有3台Server,然后一段时候后访问剧增,想再增加多两台,最后变为5台Server。

动态增加ZK Server/节点会面临的问题:

1、每个连接到ZK Server时,都会配置一个Connect的字符串,字符串上指定了所有ZK Server的服务器列表,形式类似于:“192.168.1.2:2181,192.168.1.3:2181,192.168.1.4:2181”;且配置好之后是不能变的。

2、ZK Server在配置集群时,会在配置文件指定明确的服务器IP和端口,然后启动。如果中途某台挂了,那么只要在一定数量范围之内不影响;但是如果想要增加几台,需要在每台ZK Server上的配置文件上都加入新增加的IP和端口,最重要一点就是要重启所有的ZK Server才能使其生效。

注意:通过以上的做法,那么会面临一个问题,如果此时正在下单,或者分布式事务锁在运行,就会面临丢单等问题!

动态增加ZK Server/节点的解决方案:

1、ZK从3.5版本开始已经增加了动态增加节点的功能,并且是属于动态读取配置文件而不用重启全部ZK Server。

  • 通过最新版本来解决的方案,对于已经连接到ZK Server的客户端,可以采用代码灰度更新的方案来逐步更新掉Connect的服务器IP列表。而不用影响现有的业务完整性。
  • 当然,对于客户端的连接字符串,可以采用远程地址的方式,比如访问一条固定的URL,返回服务器IP列表,当有新的服务器IP列表更新时,将通知全部的客户端去更新。这样可以解决采用代码灰度更新的问题。

2、在3.5版本以前的公开解决方法

  • 对于客户端的连接字符串,可以采用远程地址的方式,比如访问一条固定的URL,返回服务器IP列表,当有新的服务器IP列表更新时,将通知全部的客户端去更新。
  • 对于ZK Server,可以采用部署另外一套环境,比如之前是3台的;那么再次部署9台,且这9台与之前的3台是没关联的。
  • 然后客户端收到更新通知时,去获取新的9台服务器列表。

注意:上面采用更新客户端服务器IP列表的形式需要做业务空闲的判断处理,比如这个客户端在更新前没任何操作正在处理,并且要阻止新来的业务请求等。 

以上研究的搜索线索:zookeeper dynamic add node