Apache ZooKeeper 是一个开源的分布式协调服务,它为大型分布式系统提供了可靠的分布式配置管理、命名服务、分布式锁服务、集群管理等功能。ZooKeeper 旨在简化分布式应用程序中复杂的一致性问题,并提供了一种强一致性保证的高可用数据模型。
Zookeeper 架构:
-
集群结构:
ZooKeeper 集群通常由多个服务器组成,这些服务器在内部形成一个动态的主从结构。每个服务器可以是 Leader、Follower 或 Observer 角色之一。- Leader:负责处理写请求和更新系统状态,发起投票并做出决议。
- Follower:接收客户端读写请求,并将写请求转发给 Leader 进行处理,同时参与投票过程以维护集群一致性。
- Observer(可选角色):与 Follower 类似,但不参与投票选举过程,只同步数据并响应客户端的读请求,用于提高读性能或扩展集群监控能力。
-
数据存储:
ZooKeeper 存储的数据是以树状结构组织的节点(ZNode),每个 ZNode 可包含数据以及一组元数据,如版本号等。ZooKeeper 采用原子广播协议 zab 来保证所有服务器对 ZNode 状态变更的一致性。 -
心跳与同步:
集群中的各个服务器之间通过心跳机制进行通信,保持连接并交换事务日志和快照数据,确保整个集群的状态一致。
Zookeeper 工作流程:
-
客户端连接:
客户端可以连接到集群中的任意一台服务器,无论是 Leader 还是 Follower/Observer。如果连接的是非 Leader 节点,对于写请求会自动重定向到 Leader。 -
请求处理:
- 读请求:可以直接在 Follower 或 Observer 上处理,返回最新的已知数据。
- 写请求:首先发送到 Leader,Leader 将该操作转换成一个事务提议(Proposal),然后将其发给所有 Follower 进行投票。
- 共识达成:当超过半数以上的 Follower (法定人数)投票同意后,Leader 提交该事务并更新自身状态,然后通知其他服务器同步这个新状态。
-
状态同步与持久化:
所有服务器都会记录相同的事务日志,并定期生成数据快照,以便在节点故障恢复时能快速重建状态。 -
客户端回调:
客户端可以通过注册 Watcher 监听特定 ZNode 的变化,一旦发生相应事件,ZooKeeper 会触发回调通知客户端。
总的来说,ZooKeeper 通过其特有的复制和投票机制实现了高度可靠的数据一致性,并通过灵活的服务发现和协调功能,支持多种分布式应用场景。