Atomic Broadcast
At the heart of ZooKeeper is an atomic messaging system that keeps all of the servers in sync.
zk的核心是原子广播,该机制保证了各个Server间的同步。实现该机制的协议叫zab协议。
当我们描述zk消息协议时,通常会涉及以下三个概念:
- Packet: 数据包。通过FIFO 通过发送的字节序列。
- Proposal: 提议。提案通过zk服务器的法定人数交换数据包达成一致。大多数提案都包含着消息。
- Message: 消息。将以原子广播方式广播到所有zk服务器节点的字节序列。在提议中加入的信息,并在提交前达成一致。
zk的消息传递包括两个阶段:
Leader activation: 这个阶段,Leader 建立起系统的正确状态,并且准备开始提出提议(Proposal)。
Active messaging: 在这个阶段,Leader接受提案里的消息,并协调消息的传递。
Leader activation 包括 leader 选举。zk中的leader选举有两种算法:
- LeaderElection
- FastLeaderElection
无论哪种选举方法(默认用快速选举算法),都需要满足以下两个条件:
- 这个leader节点可以看到所有follower 节点中最高的zxid。(为确保正确操作)
- 达到半数+1个节点已承诺追随leader节点。(提高成功的概率)
在ZAB协议中,节点可能处于以下三种状态之一:
- Looking 选举状态
- Following 从节点状态
- Leading 主节点状态
zk中的节点角色:
- leader (读/写)
- follower(读)
- observer(读) 不参与选举
Paxos协议是分布式一致协议的原语,zab是在其基础上做的简化。
zk 是cp的,在选举过程中,对外服务不可用。 牺牲可用性,保证一致性(最终一致性)。