ZooKeeper作为高可用的一致性协调框架,自然有着一致性算法的实现,ZooKeeper使用的是ZAB协议作为数据一致性的算法,即ZAB(ZooKeeper Atomic Broadcast )。ZAB在Paxos算法上做了重要改造,和Paxos有着明显的不同。为讨论ZAB,我们假定ZooKeeper已经开启仲裁模式(ZooKeeper还有一种独立模式,除实验需求以外不要开,因为它无法避免脑裂)。
ZooKeeper使用的消息系统提供了以下特殊保证:
- 可靠传输:如果消息m被一台服务器送达,它最终会被送达到所有服务器
- 全序:如果一台服务器上消息a在消息b前送达,那么在所有服务器上a将比b先送达。如果a和b是已传输过的消息,那么要么a在b前送达,要么b在a前送达(即不可能有同时发生的情况)
- 因果序:如果一个发送者在消息a送达后再发送消息b,那么a必须排在b之前。如果发送者在送达b后再发送消息c,那么c必须排在b之后
ZooKeeper的消息系统还需要是高效、可靠、容易实现和维护的。因为大量使用了消息,消息系统还必须满足每秒处理数千个请求的要求。开发者提出的协议假定可以在服务器间建立点对点的FIFO通道。使用TCP协议可以非常简单地实现这一假定,因为TCP具有以下属性:
- 有序传输:数据发出和数据送达的顺序严格一致,即消息m被送达当且仅当m前发送的所有消息都已被送达。(推论:如果m丢失,m后的所有消息必须丢弃)
- 关闭后没有消息:一旦FIFO通道关闭,不会再从它收到消息。
FLP定理(以三个作者名字的首字母命名,nosql一文中讲过)已经证明了在异步的分布式系统中如果容忍错误则不可能达到一致性。为了在允许错误的条件下达到一致性ZooKeeper的开发者使用了超时时间。如果超时计时器出了问题则整个消息系统可能hang住,但不会违背一致性保证。
ZooKeeper消息协议中有以下元素:
- 包:通过FIFO通道传送的byte序列