Zookeeper - 工作流程



一旦 ZooKeeper 集群启动,它将等待客户端连接。客户端将连接到 ZooKeeper 集群中的一个节点。它可能是一个领导者节点或一个跟随者节点。一旦客户端连接,节点会为该特定客户端分配一个会话 ID 并向客户端发送确认。如果客户端没有收到确认,它会简单地尝试连接 ZooKeeper 集群中的另一个节点。一旦连接到一个节点,客户端将定期向该节点发送心跳,以确保连接不会丢失。

  • 如果客户端想要读取特定的 znode,它会向节点发送一个读取请求,其中包含 znode 路径,节点通过从自己的数据库中获取请求的 znode 来返回该 znode。因此,ZooKeeper 集群中的读取速度很快。

  • 如果客户端想要将数据存储在 ZooKeeper 集群中,它会将 znode 路径和数据发送到服务器。连接的服务器会将请求转发到领导者,然后领导者会将写入请求重新发布到所有跟随者。只有当大多数节点成功响应时,写入请求才会成功,并且会向客户端发送成功的返回码。否则,写入请求将失败。节点的严格多数称为Quorum(仲裁)。

ZooKeeper 集群中的节点

让我们分析在 ZooKeeper 集群中具有不同节点数量的影响。

  • 如果我们有单个节点,那么当该节点发生故障时,ZooKeeper 集群就会失败。这会导致“单点故障”,因此不建议在生产环境中使用。

  • 如果我们有两个节点并且一个节点发生故障,我们也没有多数,因为两个节点中只有一个不是多数。

  • 如果我们有三个节点并且一个节点发生故障,我们有多数,因此这是最低要求。ZooKeeper 集群在活动生产环境中至少需要三个节点。

  • 如果我们有四个节点并且两个节点发生故障,它也会再次失败,这类似于拥有三个节点。额外的节点没有任何作用,因此最好以奇数添加节点,例如 3、5、7。

我们知道在 ZooKeeper 集群中,写入过程比读取过程开销更大,因为所有节点都需要将其数据库中的数据写入相同的数据。因此,为了获得平衡的环境,最好拥有较少的节点(3、5 或 7),而不是拥有大量的节点。

下图描绘了 ZooKeeper 工作流程,随后的表格解释了其不同的组件。

ZooKeeper Ensemble
组件 描述
写入 写入过程由领导者节点处理。领导者将写入请求转发到所有 znode 并等待来自 znode 的响应。如果一半的 znode 回复,则写入过程完成。
读取 读取由特定的连接 znode 在内部执行,因此无需与集群交互。
复制数据库 它用于在 zookeeper 中存储数据。每个 znode 都有自己的数据库,并且每个 znode 在任何时候都拥有相同的数据,这得益于一致性。
领导者 领导者是负责处理写入请求的 Znode。
跟随者 跟随者接收来自客户端的写入请求并将其转发到领导者 znode。
请求处理器 仅存在于领导者节点中。它管理来自跟随者节点的写入请求。
原子广播 负责将更改从领导者节点广播到跟随者节点。
广告