一,Zookeeper是什么
Zookeeper是一个高性能、高可用的分布式协调服务,提供数据的最终一致性保证。
高性能:
- 简单的数据结构,采用树形结构存储数据
- 数据量小,每个节点最多存储1m数据
- follower和observer直接处理非事务请求
- 全量数据都保存在内存中
高可用:
- zookeeper是主从结构,只要超过半数的服务器能够提供服务,集群就能正常对外提供服务
- 自动进行 Leader 选举
最终一致性:
- 基于Zab协议,确保半数集群更新成功就认为更新成功,其他server会自动从leader同步数据
顺序一致性:
- 每个事务请求,都会转发给 Leader 处理
- 每个事务,会分配全局唯一的递增id(zxid,64位:epoch + 自增 id)
顺序一致性可以理解为读取的顺序和写入的顺序保持一致,先写入的数据先被读取;写入的过程中,事务ID小的先写入;
二,Zookeeper的架构
如上图,Zookeeper是一个C/S架构的分布式系统,Server是主从结构。
Server的角色分类:
- leader,负责事务性操作(写、更新、删除)以及读
- follower,负责读,参与投票,可能成为leader
- observer,负责读,不参与投票,不可能成为leader,是为了不影响写性能的情况下提高读性能而存在
三,理解Zookeeper的关键
1,Zookeeper不是分布式存储系统,也不是分布式计算引擎,而是一个分布式服务协调者
2,Zookeeper的数据不是分布式存储,而是单机存储,所有Server都保存相同的完整的数据,follower的存在是为了高可用、负载均衡
3,Zookeeper不提供强一致性,提供最终一致性保证;Zookeeper不能保证读取到的数据一定是最新数据
4,Zab协议的两阶段作用:leader election阶段和Atomic Brodcast阶段
-
a) 集群中将选举出一个leader,其他的机器则称为follower,所有的写操作都被传送给leader,并通过brodcast将所有的更新告诉给follower。
-
b) 当leader崩溃或者leader失去大多数的follower时,需要重新选举出一个新的leader,让所有的服务器都恢复到一个正确的状态。
-
c) 当leader被选举出来,且大多数服务器完成了 和leader的状态同步后,leadder election 的过程就结束了,就将会进入到Atomic brodcast的过程。
-
d) Atomic Brodcast同步leader和follower之间的信息,保证leader和follower具有形同的系统状态。
5,Zookeeper所有事务性操作(写、更新、删除)都由leader负责,follower和observer将写请求转发给leader,这是其能保证顺序一致性的关键,也是能作为分布式锁即协助其他服务高可用的关键
四,Zookeeper的典型应用
1,统一命名服务
类似域名服务器,一个域名下面有多个ip;或者像是微服务,一个服务名下面有多台服务器提供相同服务
2,分布式锁
- 独占锁,所有客户端抢占一个结点的创建,创建成功的拥有锁,抢占失败则等待;拥有锁的客户端执行完成后会删除锁,其他客户端监听到锁删除后,再次抢占锁。
- 顺序锁,所有有锁需求的客户端在指定结点下创建节点,结点按序编号,编号小的拥有锁,拥有锁的客户端执行完成删除节点,其他客户端监听到后判断是否是自己拥有锁。
3,负载均衡
4,服务器动态上下线管理
5,集群管理
6,分布式队列
- ①当一个队列的成员都聚齐时,这个队列才可用,否则一直等待所有成员到达,这种是同步队列。
a)一个job由多个task组成,只有所有任务完成后,job才运行完成。
b)可为job创建一个/job目录,然后在该目录下,为每个完成的task创建一个临时的Znode,一旦临时节点数目达到task总数,则表明job运行完成。 - ②队列按照FIFO方式进行入队和出队操作,例如实现生产者和消费者模型。
7,统一配置
每个配置都是一个结点,结点修改后,所有监听的服务器同步更新。
五,小细节
1,leader如何保证节点的唯一性
leader在创建结点时会从截取父目录,以父目录为key从ConcurrentHashMap中读取Node,如果有,则以此对象为锁,然后创建子目录。