ZooKeeper 整体架构
1,角色描述
server.id=主机名:2888:3888:observer
2,架构图
(1)每个Server在内存中存储了一份数据;
(2)ZooKeeper启动时,从中选举一个Leader(Paxos协议);
(3)Leader负责处理数据更新等操作(Zab协议);
(4)一个更新操作成功,当且仅当大多数Server在内存中成功修改数据。
ZooKeeper 工作原理
1,Zab 协议
1,概念
ZooKeeper 的核心是原子广播,这个机制保证了各个 Server 之间的同步。实现这个机制的协议叫做 Zab 协议。
2,两种模式
- 1,恢复模式
- 2,广播模式
2,选主机制
1,选主算法
算法 | 采用 |
---|---|
Basic Paxos | Google Chubby 采用 |
Fast Paxos | ZooKeeper 默认 |
2,选主流程
- (1)每个 Server 启动以后都询问其它的 Server 它要投票给谁。
- (2)对于其它 Server 的询问,Server 每次根据自己的状态都回复自己推荐的 Leader 的 myid 和上一次处理事务的 zxid。(系统启动时每个 Server 都会推荐自己)
- (3)收到所有 Server 回复以后,就计算出 zxid 最大的那个 Server,若是 zxid 相同,则比较 myid。并将这个 Server 相关信息设置成下一次要投票的 Server。
- (4)计算的过程中获得票数最多的 Server 为获胜者,如果获胜者的票数超过半数,则此 Server 被选为 Leader。否则,继续这个过程,直到 Leader 被选举出来。
3,思考题
假设有五台服务器组成的 ZooKeeper 集群,它们的 id 从 1-5,同时它们都是最新启动的,也就是没有历史数据,存放的数据量都是一样的。假设这些服务器依序启动,来看看会发生什么?
- 服务器 1 启动,此时只有它一台服务器启动了,它发出去的消息没有任何响应,所以它的选举状态一直是 LOOKING 状态;
- 服务器 2 启动,它与最开始启动的服务器 1 进行通信,互相交换自己的选举结果,由于两者都没有历史数据,所以 id 值较大的服务器 2 胜出,但是由于没有达到超过半数以上的服务器都同意选举它(这个例子中的半数以上是 3 ),所以服务器 1、2 还是继续保持 LOOKING 状态。
- 服务器 3 启动,根据前面的理论分析,服务器 3 成为服务器 1、2、3 中的老大,而与上面不同的是,此时有三台服务器选举了它,所以它成为了这次选举的 Leader;
- 服务器 4 启动,根据前面的分析,理论上服务器 4 应该是服务器 1、2、3、4 中最大的,但是由于前面已经有半数以上的服务器选举了服务器 3,所以它只能接收当小弟的命了。
- 服务器 5 启动,同 4 一样,当小弟。
4,ZooKeeper Server 四种工作状态
- (1)LOOKING:当前 Server 不知道 Leader 是谁,正在搜寻,正在选举。
- (2)LEADING:当前 Server 即为选举出来的 Leader,负责协调事务。
- (3)FOLLOWING: Leader 已经选举出来,当前 Server 与之同步,服从 Leader 的命令。
- (4)OBSERVING:观察者状态。表明当前服务器角色是 Observer。
3,同步流程 (选完 Leader 之后)
- (1)Leader 就会开始等待 Server 连接。
- (2)Follower 连接 Leader,将最大的 zxid 发送给 Leader。
- (3)Leader 根据 Follower 的 zxid 确定同步点。
- (4)完成同步后通知 Follower 已经成为 UpToDate(现时)状态。
- (5)Follower 收到 UpToDate 消息后,又可以重新接受 Client 的请求进行服务了。
4,工作流程
1,Leader 工作流程
1,功能
- (1)恢复数据;
- (2)维持与 Learner 的心跳,接收 Learner 请求并判断 Learner 的请求消息类型;
- (3)Learner 的消息类型主要有 PING 消息、REQUEST 消息、ACK 消息、REVALIDATE 消息,根据不同的消息类型,进行不同的处理。
2,消息类型
PING | Learner 的心跳信息 |
REQUEST | Follower 发送的提议信息,包括写请求及同步请求 |
ACK | Follower 对提议的回复,超过半数的 Follower 通过,则 commit 该提议 |
REVALIDATE | 用来延长 SESSION 有效时间 |
2,Follower 工作流程
1,功能
- (1)向 Leader 发送请求(PING 消息、REQUEST 消息、ACK 消息、REVALIDATE 消息);
- (2)接收 Leader 消息并进行处理;
- (3)接收 Client 的请求,如果为写请求,发送给 Leader 进行处理;
- (4)返回 Client 结果。
2,消息类型
PROPOSAL | Leader 发起的提案,要求 Follower 投票 |
COMMIT | 服务器端最新一次提案的信息 |
UPTODATE | 表明同步完成 |
REVALIDATE | 根据 Leader 的 REVALIDATE 结果,关闭待 REVALIDATE 的 Session 还是允许其接受消息。 |
SYNC | 返回 SYNC 结果到客户端,这个消息最初由客户端发起,用来强制得到最新的更新。 |
3,Observer 工作流程
- 和 Follower 唯一不同的地方就是 Observer 不会参加 Leader 发起的投票,其他一样