ZooKeeper Observers

观察者:在不影响写入性能的情况下扩展 ZooKeeper

尽管 ZooKeeper 通过使 Client 端直接连接到集合中的投票成员而表现良好,但是此体系结构使其很难扩展到大量 Client 端。问题在于,当我们添加更多投票成员时,写入性能会下降。这是由于以下事实:写操作需要(通常)集合中至少一半节点的同意,因此,随着添加更多的投票者,投票的成本可能会显着增加。

我们引入了一种称为* Observer *的新型 ZooKeeper 节点,该节点有助于解决此问题并进一步提高 ZooKeeper 的可伸缩性。观察员是合奏的非投票成员,他们仅听取投票结果,而听不到投票结果。除了这种简单的区别外,观察者的功能与跟随者的功能完全相同-Client 端可以连接到观察者,并向其发送读写请求。观察者像追随者一样将这些请求转发给领导者,但是他们只是 await 听取投票结果。因此,我们可以根据需要增加观察员的数量,而不会影响投票的表现。

观察者还有其他优点。因为他们不投票,所以它们不是 ZooKeeper 合奏中的关键部分。因此,它们可以在不损害 ZooKeeper 服务可用性的情况下发生故障或与群集断开连接。给用户带来的好处是,观察者可以通过比追随者更不可靠的网络链接进行连接。实际上,可以使用观察者从另一个数据中心与 ZooKeeper 服务器进行对话。观察者的 Client 端将看到快速读取,因为所有读取均在本地提供,并且由于缺少表决协议而需要的消息数量较小,因此写入会导致网络流量最小。

如何使用观察者

设置使用 Observers 的 ZooKeeper 集成非常简单,只需对配置文件进行两次更改即可。首先,在要成为观察者的每个节点的配置文件中,必须放置以下行:

peerType=observer

此行告诉 ZooKeeper 服务器将成为观察者。其次,在每个服务器配置文件中,必须将:observer 添加到每个 Observer 的服务器定义行。例如:

server.1:localhost:2181:3181:observer

这告诉其他所有服务器,server.1 是观察者,因此他们不应期望它投票。这是将 Observer 添加到 ZooKeeper 集群所需的全部配置。现在,您可以像普通的追随者一样连接到它。通过运行以下命令进行尝试:

$ bin/zkCli.sh -server localhost:2181

其中,localhost:2181 是每个配置文件中指定的 Observer 的主机名和端口号。您应该看到一个命令行提示符,通过它可以发出* ls *之类的命令来查询 ZooKeeper 服务。

用例示例

下面列出了观察者的两个示例用例。实际上,无论您希望扩展 ZooKeeper 集成 Client 端的数量,还是希望将集成的关键部分与处理 Client 端请求的负载隔离开的地方,观察者都是一个不错的体系结构选择。

  • 作为数据中心的 bridge 梁:在两个数据中心之间形成 ZK 集成是一项有问题的工作,因为数据中心之间的延迟高差异可能导致错误的故障检测和分区错误。但是,如果该集成完全在一个数据中心中运行,而第二个数据中心仅运行观察者,则分区不会出现问题,因为该集成仍然保持连接状态。观察员的 Client 可能仍会看到并发布建议。

  • 作为到消息总线的链接:一些公司已经表示有兴趣使用 ZK 作为持久可靠消息总线的组件。观察者会为这项工作提供一个自然的整合点:插件机制可用于将观察者看到的提议流附加到发布-订阅系统,而又不会加载核心组件。