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 加入了该组。是否可以“动态地”将 peer-3 添加到 zookeeper 服务器列表中(即,无需在 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 来做这样的事情之外,我还可以使用其他选项吗?

谢谢。

4

2 回答 2

8

目前,您无法在不重新启动的情况下动态更改 Zookeeper 集群的配置。有一个未解决的问题可以解决此问题,ZOOKEEPER-107。描述集群成员算法的论文非常有趣,可以在这里找到。

您可以通过一次重新启动服务器节点 1 来更改集群的配置。例如,如果您的集群有服务器 A、B、C,并且您想用 D 替换服务器 C,那么您可以执行以下操作,

  • 打倒C
  • 调出 D,它的对等列表是 A,B,D
  • 拿下B
  • 将 B 的对等列表更改为 A,B,D
  • 培养B
  • 删除 A 将 A 的对等列表更改为 A,B,D
  • 提出一个
  • 将所有客户端的客户端配置更改为指向 A,B,D

在 t=t_1 时,您有一个包含 2 个 zookeeper 节点的集群。这是相当脆弱的,如果任何一个节点宕机,你将无法建立仲裁(floor(N / 2) + 1),集群将不可用。通常 zookeeper 集群是奇数。

当你说,我不确定你想做什么,

peer-3 成为领导者,所有客户端请求都发送到 peer-3。

你不能指定zookeeper集群中的哪个节点是leader,节点自己会选举他们的leader,并且leader会随着节点的上下变化而变化。同样,客户端通常并不总是连接到领导者,但客户端会获得集群中的机器列表,并随机连接到其中一台,如果它们连接的服务器出现故障,则会重新连接。您可以设置leaderServes选项以指定领导者不服务器客户端连接。

于 2012-07-07T13:41:15.147 回答
1

我不建议将上述内容用于任何生产情况。上述解决方案仅在您可以暂时丢失 ZK 仲裁直到所有更改完成时才有效。

原因如下: 关闭 C 启动 D,它的对等列表是 A、B、D"

-> 此时 A 和 B 不知道 D -> D 知道 AB

所以此时你只有 A 和 B 在法定人数中运作,接下来你取消 B 并且你失去法定人数。

您将无法访问 zk 数据,直到迁移完成并再次恢复仲裁。在这种情况下,大多数设计良好的应用程序使用 zk 故障转移到只读模式,并将正常恢复。

Zookeeper-107在 Zookeeper 3.5 下发布之前,您需要明智地选择毒药。

最好:

  1. 只需设置一个新的 zk 集成(zk 集群)
  2. 从快照恢复
  3. 从旧的 zk ensemble 迁移到新的 zk ensemble 的应用程序
  4. 迁移完成后关闭旧的 zk ensemble
于 2015-03-16T19:46:38.053 回答