目录
概述
Zookeeper是一个分布式协调服务的开源概架,主要用来解决分布式集群中应用系统的一致性问题,例如怎样避免同时操作同一数据造成脏读的问题,
ZooKeeper本质上是一个分布式的小文件存储系统,提供基于类似于文件系统的目录树方式的数据存储,并且可以对树中的节点进行有效管理,从而用来维护和监控你存储的数据的状态变化,通过监控这些数据状态的变化,从而可以达到基于数据的集群管理,诸如:统一命名服务、分布式配置管理、负载均衡、分布式锁、分布式协调等功能
特点
集群的角色
ZooKeeper集群通常称为一个ZooKeeper Ensemble,由多个ZooKeeper服务器(节点)组成,以确保高可用性和容错性。在一个ZooKeeper集群中,每个节点有不同的角色,主要包括以下几种角色:
Leader
角色: 负责处理所有写请求和同步数据到所有Follower节点。
职责:
提供写操作的一致性保证
处理集群的Leader选举。
协调和分发事务请求。
选举: 在ZooKeeper集群启动时或Leader节点故障时,通过选举算法(如Zab协议)选举出新的Leader
Follower
角色: 负责处理读请求,并将写请求转发给Leader。
职责:
响应客户端的读请求
将写请求转发给Leader并等待Leader的同步
参与Leader选举
同步: 从Leader同步数据,以确保数据的一致性
Observer
(对于访问量比较大的集群,可以新增观察者角色)
角色: 类似于Follower,但不参与Leader选举和写操作的投票
职责:
处理读请求
提供额外的读取吞吐量,而不影响写操作的性能。
使用场景: 在需要扩展读取能力的情况下,可以增加Observer节点,而不会增加写操作的开销
ZooKeeper 集群的工作原理
-
写操作流程
- 客户端将写请求发送到Leader节点。
- Leader节点执行操作,并将事务提议发送给所有Follower节点进行投票。
- 当超过半数的Follower节点确认后,Leader将事务提交,并通知所有Follower应用该事务。
-
读操作流程
- 客户端可以将读请求发送到任何Follower或Observer节点。
- 节点返回其当前状态的数据给客户端。
- (可选)客户端可以指定强一致性读,要求从Leader读取最新数据。
-
Leader选举
- 当Leader节点故障时,剩余的Follower节点会通过Zab协议进行选举,选出新的Leader。
- Leader选举过程确保新的Leader由多数节点认可,以保证一致性。
ZooKeeper 集群部署建议
- 奇数节点: 推荐使用奇数个节点(如3、5、7个节点),以确保在发生故障时仍能维持多数决策。
- 分布式部署: 各节点应部署在不同的物理机或虚拟机上,以提高容错性和可用性。
- 监控和报警: 定期监控集群状态,设置故障报警机制,以便及时处理故障
ZooKeeper集群通过这些角色和机制,实现了高可用性和强一致性,是许多分布式系统的重要基础组件。
ZooKeeper 数据结构
图中的每个节点称为一个Znode。每个 Znode 由3部分组成:
stat:此为状态信息,描述该 Znode 的版本,权限等信息
data: 与该Znode 关联的数据
children: 该 Znode下的子节点