ZooKeeper 是一个开源的分布式协调服务,由 Apache 软件基金会维护。它旨在为分布式应用提供高性能、高可用、强一致性的基础服务,解决分布式系统中常见的协调难题(如配置管理、命名服务、分布式锁、服务发现、领导者选举等)。
ZooKeeper 的架构设计围绕其核心目标(协调)而优化,主要包含以下关键组件:
集群模式 (Ensemble):
ensemble
),由多个服务器节点(通常是奇数个,如 3、5、7)组成。Quorum
原则,即 N/2 + 1
),服务就能继续对外提供。数据模型:ZNode Tree (类似文件系统)
ZNode
。ZNode
特点:
/services/serviceA/member1
)。ZNode
都有版本号,用于实现乐观锁(CAS操作)。读写操作与一致性保证:
Leader
节点处理。Leader
使用 Zab 协议(ZooKeeper Atomic Broadcast)确保写操作的顺序性和一致性。
Leader
失效时,通过选举协议选出新 Leader
。Leader
将写请求作为提案广播给所有 Follower
;收到过半 Follower
的 ACK
后,Leader
提交提案并通知 Follower
执行。这保证了所有成功提交的写请求在所有服务器上以相同的顺序被应用(顺序一致性)。Leader
或 Follower
)直接处理。这提供了高读取吞吐量。读请求看到的是该节点本地最终一致的数据视图(但保证单调一致性)。客户端可以通过 sync()
操作强制读取最新数据(线性化读)。角色 (Server Roles):
Leader
。Leader
选举投票。Leader
的提案)。Follower
。Leader
。会话 (Session):
sessionTimeout
)。客户端需要定期发送心跳(Ping)来保持会话活跃。临时节点
生命周期的依据。客户端会话结束(主动断开或超时),其创建的所有临时节点都会被自动删除。Watch 机制 (事件监听):
ZNode
上设置监视点。ZNode
或其直接子节点发生特定变化(创建、删除、数据更新、子节点列表变化)时,ZooKeeper 服务器会异步通知(一次性触发)设置了 Watch
的客户端。ZooKeeper 的架构特性(数据模型、Watch、临时顺序节点、一致性保证)使其成为解决分布式协调问题的理想选择:
配置管理 (Configuration Management):
ZNode
中。各应用节点启动时读取该节点数据,并在该节点上设置 Watch
。当配置需要更新时,管理员更新该节点数据,ZooKeeper 会通知所有监听的节点,节点收到通知后重新拉取最新配置。实现配置的集中化、动态化更新。服务发现 (Service Discovery):
/services/serviceName
)为自己创建一个临时 ZNode
(名称可包含地址端口信息,或在该节点下创建子临时节点)。Watch
)。分布式锁 (Distributed Lock):
/locks/lockname
)下创建临时顺序节点。/locks/lockname
下的所有子节点列表。Watch
。领导者选举 (Leader Election):
/election/app
)下创建临时顺序节点。Leader
。Followers
)在序号比自己小的节点(通常是紧邻的前一个节点)上设置 Watch
。Leader
崩溃(其临时节点被删除),那么原来 Watch
这个 Leader
节点的 Follower
会收到通知。它重新获取子节点列表,如果发现自己现在是序号最小的节点,它就晋升为新的 Leader
。其他节点继续监听新 Leader
之前的节点。实现主节点的自动选举和故障转移。命名服务 (Naming Service):
ZNode
路径的唯一性和可存储少量数据的特性,将名字映射信息存储在对应的 ZNode
中。客户端通过路径名即可查找。分布式队列 (Distributed Queue):
/queue/task-
),消费者获取 /queue
下所有子节点,找到序号最小的节点处理,处理完后删除该节点。新消费者监听子节点变化。需要处理并发消费的协调问题(类似锁机制)。集群成员管理 (Group Membership):
/members
)下创建自己的临时 ZNode
。管理员或其他节点可以列出 /members
下的所有节点来获取当前存活成员列表,并设置 Watch
来感知成员加入或离开(节点创建或删除)。ZNode
存储的数据量小(MB 上限,通常 KB 级别),不适合存储业务数据。Leader
并由 Zab 协议保证,写吞吐量有上限。Watch
。Leader
(脑裂),但 ZooKeeper 的 Quorum 机制和 Zab 协议的设计旨在快速检测和解决脑裂,保证最多只有一个活跃的 Leader
能提交写请求(少数分区的 Leader
会因无法获得多数 ACK
而无法提交写操作)。ZooKeeper 通过其独特的树形数据模型(ZNode)、基于临时节点和 Watch 的事件驱动机制、以及 Zab 协议保证的强一致性(顺序一致性),为构建大规模分布式系统提供了可靠、高性能的协调基础服务。它在配置管理、服务发现、分布式锁、领导者选举、集群管理等场景中扮演着不可或缺的角色,是分布式系统领域的重要基石之一。理解其架构和核心机制是有效使用 ZooKeeper 的关键。