1.集群角色
Zookeeper中分为Leader,Follower,Observer三种角色。
Zookeeper集群中所有的机器通过一个Leader选举过程来选定一台Leader机器,
Leader既可以为客户端提供写服务又能提供读服务。
Follower和Observer都只提供读服务。
Follower和Observer唯一的区别是Observer不参与Leader的选举过程,也不参与写操作的“过半写成功”策略,因此Observer机器可以在不影响写性能的情况下提升集群的读性能。
2.paxos算法
算法目标:让分布式系统的每个参与者达成一致,从而实现具有容错能力的分布式系统。
百度文档
:paxos算法
1.通俗概述:Lamport为了讲述这个算法,假想了一个叫做Paxos的希腊城邦进行选举的情景,这个选举是异步且非拜占庭模型的(消息传送速度不可预测,允许消息的丢失或者重复,但是不会出现内容损坏)。整个算法的大致过程为:
第一阶段:要先明确哪个“提议者”是意见领袖有权提出提议,“接受者”们就主要处理这个“提议者”的提议了(这样,也可以在提出提议时就尽量让意见统一,谋求尽早形成多数派)。
第二阶段:由上阶段选出的意见领袖提出提议,“接受者”反馈意见。如果多数“接受者”接受了一个提议,那么提议就通过了。
2.忽略严密性的通俗解释
明确意见领袖:每个“提议者”在第一阶段先报个号,谁的号大,谁就是意见领袖。可以想象为贿选:每个提议者先拿着钞票贿赂一圈“接受者”,谁给的钱多,第二阶段“接受者”就听谁的。即:“意见领袖”是在第一轮贿赂成功的“提议者” 。
尽早形成多数派:“提议者”不会执着于让自己的提议通过,而是执着于让提议尽快达成一致。为了实现这个目标,“提议者”在贿选的时候,若发现“接受者”已经接受过前面意见领袖的提议了,即便贿选成功,也会默默的把自己的提议改为前面意见领袖的提议。
提议者改变提案的依据:
- “接受者”在被“提议者”贿赂的时候,会记下贿赂的金额。所以当你贿赂“接受者”时,一旦你给的贿赂多而胜出,“接受者”会告诉你两件事情:a、前任意见领袖的提议内容(如果有的话);b、前任意见领袖当时贿赂了多少钱。
- 如果你是“提议者”,在贿赂的时候,“接受者1”跟你说“他见过的意见领袖的提议是方案1”,而“接受者2”跟你说“他见过的意见领袖提议是方案2”,只需要判断一下“接受者1”和“接受者2”告诉你的信息中,哪个意见领袖当时给的钱多,就把自己的提议改成那个意见领袖的提议。
先来后到很重要:在第一阶段中,一旦“接受者”已经接受了之前意见领袖的提议,那后面再来找这个“接受者”的“提议者”,即便在贿赂中胜出,也要将自己的提议改为前任意见领袖的提议,然后他会在第二阶段提出该提议。如果“接受者”之前没有接受过任何提议,那贿选胜出的“提议者”就可以提出自己的提议了。
3.ZAB协议
ZAB 协议是 Zookeeper 基于paxos专门设计的一种支持崩溃恢复的原子广播协议。通过该协议,Zookeeper 基于主从模式的系统架构来保持集群中各个副本之间数据的一致性。
Zookeeper 使用一个单一的主进程来接收并处理客户端的所有事务请求,并采用原子广播协议将数据状态的变更以事务 Proposal 的形式广播到所有的副本进程上去。
二阶段提交:
所有的事务请求必须由唯一的 Leader 服务来处理,Leader 服务将事务请求转换为事务 Proposal,并将该 Proposal 分发给集群中所有的 Follower 服务。如果有半数的 Follower 服务进行了正确的反馈,那么 Leader 就会再次向所有的 Follower 发出 Commit 消息,要求将前一个 Proposal 进行提交。
ZAB 协议包括两种基本的模式,分别是崩溃恢复和消息广播:
- 崩溃恢复 当整个服务框架在启动过程中,或者当 Leader 服务器出现异常时,ZAB 协议就会进入恢复模式,通过过半选举机制产生新的 Leader,之后其他机器将从新的 Leader上同步状态,当有过半机器完成状态同步后,就退出恢复模式,进入消息广播模式。
- 消息广播
ZAB 协议的消息广播过程使用的是原子广播协议。在整个消息的广播过程中,Leader 服务器会每个事物请求生成对应的 Proposal,并为其分配一个全局唯一的递增的事务 ID(ZXID),之后再对其进行广播。具体过程如下:
Leader 服务会为每一个 Follower 服务器分配一个单独的队列,然后将事务 Proposal 依次放入队列中,并根据 FIFO(先进先出) 的策略进行消息发送。Follower 服务在接收到 Proposal 后,会将其以事务日志的形式写入本地磁盘中,并在写入成功后反馈给 Leader 一个 Ack 响应。当 Leader 接收到超过半数 Follower 的 Ack 响应后,就会广播一个 Commit 消息给所有的 Follower 以通知其进行事务提交,之后 Leader 自身也会完成对事务的提交。而每一个 Follower 则在接收到 Commit 消息后,完成事务的提交。