【问题标题】:ZooKeeper - adding peers dynamically?ZooKeeper - 动态添加对等点?
【发布时间】:2012-07-07 16:12:30
【问题描述】:
我是 ZooKeeper 的新手。这就是我需要的。
我有一个同行网络。
t=t_1 -> [peer-1 (Leader), peer-2]
peer-1 是主节点,所有客户端都连接到该节点。
t=t_2 -> [peer-1 (Leader), peer-2, peer-3]
稍后,peer-3 加入了该组。是否可以“动态地”将 peer-3 添加到 zookeeper 服务器列表中(即,无需在 peer-1 上重新启动 ZooKeeper)?
t=t_3 -> [peer-3 (Leader), peer-4]
一段时间后,peer-1 和 peer-2 都离开了组(例如,死亡或被关闭。)假设有一种方法可以动态地将 peer-3 和 peer-4 添加到组中,peer-3 成为领导者,并且所有客户端请求都发送到 peer-3。
除了使用 ZooKeeper 来做这样的事情之外,我还可以使用其他选项吗?
谢谢。
【问题讨论】:
标签:
dynamic
p2p
apache-zookeeper
master-slave
【解决方案1】:
目前,您无法在不重新启动的情况下动态更改 Zookeeper 集群的配置。有一个未解决的问题可以解决这个问题,ZOOKEEPER-107。描述聚类隶属度算法的论文挺有意思的,可以找到here。
您可以通过一次重新启动服务器节点 1 来更改集群的配置。例如,如果您的集群有服务器 A、B、C,并且您想将服务器 C 替换为 D,那么您可以执行以下操作,
- 关闭 C
- 调出D,它的peer列表是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集群中的哪个节点是leader,节点自己会选举他们的leader,并且leader会随着节点的上升和下降而改变。同样,客户端通常并不总是连接到领导者,但客户端会获得集群中的机器列表,并随机连接到其中一台,如果它们连接的服务器出现故障,则会重新连接。您可以设置leaderServes 选项来指定领导者不服务客户端连接。
【解决方案2】:
我不建议将上述内容用于任何生产情况。
上述解决方案仅适用于您可以在一段时间内丢失 ZK 仲裁,直到所有更改完成。
原因如下:
调低 C 调高 D,它的对等列表是 A,B,D"
-> 此时 A 和 B 不知道 D
-> D 知道 A B
所以此时你只有 A 和 B 在法定人数中运作
接下来你拿下 B,你就失去了法定人数。
您将无法访问 zk 数据,直到迁移完成并再次恢复仲裁。在这种情况下,大多数设计良好的应用程序使用 zk 故障转移到只读模式,并将正常恢复。
在Zookeeper-107 在 Zookeeper 3.5 下发布之前,您需要明智地选择毒药。
最好是:
- 只需设置一个新的 zk ensemble(zk 集群)
- 从快照恢复
- 将应用从旧的 zk ensemble 迁移到新的 zk ensemble
- 迁移完成后关闭旧的 zk 集成