2 分布式系统原理
2.2 基本副本协议
2.2.3 去中心化副本控制协议
去中心化副本控制是另一类较为复杂的副本控制协议。与中心化副本系统协议最大的不同是,
去中心化副本控制协议没有中心节点,协议中所有的节点都是完全对等的,节点之间通过平等协商 达到一致。从而去中心化协议没有因为中心化节点异常而带来的停服务等问题。图 2-9 给出了去中 心化副本控制协议的示意图。
然而,没有什么事情是完美的,去中心化协议的最大的缺点是协议过程通常比较复杂。尤其当 去中心化协议需要实现强一致性时,协议流程变得复杂且不容易理解。由于流程的复杂,去中心化 协议的效率或者性能一般也较中心化协议低。一个不恰当的比方就是,中心化副本控制协议类似专 制制度,系统效率高但高度依赖于中心节点,一旦中心节点异常,系统受到的影响较大;去中心化 副本控制协议类似民主制度,节点集体协商,效率低下,但个别节点的异常不会对系统总体造成太 大影响。
图 2-9 去中心化副本控制协议
与中心化副本控制协议具有某些共性不同,各类去中心化副本控制协议则各有各的巧妙。本节 不再就去中心化副本控制协议做进一步详细分析。Paxos 是唯一在工程中得到应用的强一致性去中 心化副本控制协议。本文在2.8 节详细分析 paxos 协议。
2.2.4 工程投影
这里简要分析几种典型的分布式系统在副本控制协议方面的特点。工程中大量的副本控制协议 都是primary-secondary 型协议。从下面这些具体的分布式系统中不难看出,Primary-secondary 型副 本控制虽然简单,但使用却极其广泛。
2.2.4.1 GFS 中的 Primary-Secondary 协议
GFS 系统的副本控制协议是典型的 Primary-Secondary 型协议,Primary 副本由 Master 指定,
Primary 副本决定并发更新操作的顺序。虽然在 GFS 中,更新操作的数据由客户端提交,并在各个 副本之间流式的传输,及由上一个副本传递到下一个副本,每个副本都即接受其他副本的更新,也 向下更新另一个副本,但是数据的更新过程完全是由 primary 控制的,所以也可以认为数据是由 primary 副本同步到 secondary 副本的。
2.2.4.2 PNUTS 中的 Primary-Secondary 协议
协商 协商 节点
节点
协商 节点
PNUTS 的副本控制协议也是典型的 primary-secondary 型协议。Primary 副本负责将更新操作向 YMB 中提交,当更新记录写入 YMB 则认为更新成功。YMB 本身是一个分布式的消息发布、订阅 系统,其具有多副本、高可用、跨地域等特性。Secondary 副本向 YMB 订阅 primary 发布的更新操 作,当收到更新操作后,secondary 副本更新本地数据。从而,数据的更新过程也完全是由 primary 副本进行控制的。
2.2.4.3 Niobe 中的 Primary-Secondary 协议
Niobe 协议又是一个典型的 primary-secondary 型协议。Niobe 协议中,primary 信息由 GSM 模 块维护,更新操作由primary 副本同步到 secondary 副本。
2.2.4.4 Dynamo/Cassandra 的去中心化副本控制协议
Dynamo / Cassandra 使用基于一致性哈希的去中心化协议。虽然 Dynamo 尝试通过引入 Quorum 机制和vector clock 机制解决读取数据的一致性问题,但其一致性模型依旧是一个较大的问题。由于 缺乏较好的一致性,应用在编程时的难度被大大增加了。本文在2.4.6 中较为详细的分析了 Dynamo 的一致性模型及其优缺点。
2.2.4.5 Chubby/Zookeeper 的副本控制协议
Chubby[13]和 Zookeeper 使用了基于 Paxos 的去中心化协议选出 primary 节点,但完成 primary 节点的选举后,这两个系统都转为中心化的副本控制协议,即由 primary 节点负责同步更新操作到 secondary 节点。本文在 2.8.6 中进一步分析这三个系统的工作原理。
2.2.4.6 Megastore 的副本控制协议
虽然都使用了Paxos 协议,但与 Chubby 和 Zookeeper 不同的是,Megastore 中每次数据更新操 作都基于一个改进的Paxos 协议的实例,而不是利用 paxos 协议先选出 primary 后,再转为中心化的 primary-secondary 方式[12]。另一方面,Megastore 又结合了 Primary-secondary 本文在 2.8.6 中进一 步分析Megastore 使用 paxos 的工作原理。
2.2.4.7 其他系统的副本控制协议
Mola*/Armor*和 Big Pipe*也无一例外的使用了 Primary-secondary 协议控制副本。