ZooKeeper - 如何动态添加节点?

7
我刚开始接触ZooKeeper,以下是我的需求。
我有一组对等节点。
1. 在 t = t_1 -> [peer-1(Leader),peer-2] 时,peer-1是主节点,所有客户端都连接到此节点。 2. 在稍后的某个时候 t = t_2 -> [peer-1(Leader),peer-2,peer-3],peer-3加入该组。是否可以“动态”向ZooKeeper服务器列表中添加peer-3(即在peer-1上不重启ZooKeeper)? 3. 在 t = t_3 -> [peer-3(Leader),peer-4] 一段时间后,peer-1和peer-2离开了该组(例如,关闭或意外宕机)。假设有一种方法可以动态地将peer-3和peer-4添加到该组中,则peer-3将成为领导者,所有客户端请求都将发送到peer-3。
除了使用ZooKeeper之外,我是否还有其他选项可以实现此类功能?
谢谢。
2个回答

8
目前,无法在不重新启动的情况下动态更改zookeeper集群的配置。这个问题已经有一个开放的解决方案ZOOKEEPER-107。描述群集成员算法的论文非常有趣,可以在这里找到。
您可以通过逐个重启服务器节点来更改群集的配置。例如,如果您的群集有服务器A、B、C,而您想要用D替换服务器C,则可以执行以下操作:
  • 关闭C
  • 启动D,其对等列表为A、B、D
  • 关闭B
  • 将B的对等列表更改为A、B、D
  • 启动B
  • 关闭A,将A的对等列表更改为A、B、D
  • 启动A
  • 更改所有客户端的客户端配置,使其指向A、B、D
在t=t_1时,您有一个由2个zookeeper节点组成的集群。这是非常脆弱的,因为如果任何一个节点失效,您将无法建立仲裁(floor(N/2)+1),并且集群将不可用。通常,zookeeper集群是奇数个。
我不确定您在说什么时候要做什么, peer-3成为领导者,所有客户端请求都发送到peer-3。
您不能指定zookeeper集群中的哪个节点是领导者,节点本身会选举其领导者,并且随着节点上下,领导权将更替。此外,客户端通常不总是连接到领导者,而是给出了集群中机器的列表,并随机连接到其中一个,如果它们所连接的服务器失效,则重新连接。您可以设置leaderServes选项来指定领导者不提供客户端连接。

1
看起来这个问题在ZK alpha 3.5中已经解决了。 - Alastair
https://zookeeper.apache.org/doc/r3.5.3-beta/zookeeperReconfig.html 提供了一些关于如何动态重新配置Zookeeper的细节。 - chandugunturi

1
我不建议在任何生产环境中使用上述方法。该解决方案仅适用于您可以接受失去ZK法定人数的情况,直到所有更改完成。
原因如下: 关闭C并启动D,其对等列表为A、B、D
->此时A和B不知道D ->D知道A B
因此,此时只有A和B在法定人数中运行,接下来你关闭B并失去了法定人数。
在迁移完成并恢复法定人数之前,您将无法访问zk数据。大多数良好设计的应用程序在这种情况下使用zk故障转移到只读模式,并且会优雅地恢复。
Zookeeper-107发布于Zookeeper 3.5之前,您需要明智地选择毒药。
最好是:
1.只需设置新的zk集合(zk群集) 2.从快照还原 3.将应用程序从旧zk集合迁移到新zk集合 4.迁移完成后关闭旧zk集合

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接