6.2.6 协调者
(1)快速读
Paxos协议要求读取最新的数据至少需要经过一半以上的副本,然而,如果不出现故障,每个副本基本都是最新的。也就是说,能够利用本地读取(local reads)实现快速读,减少读取延时和跨机房操作。Megastore引入协调者来记录每个本机房Bigtable实例中的每个实体组的数据是否最新。如果实体组的数据最新,读取操作只需要本地读取,没有跨机房操作。实体组有更新操作时,写操作需要将协调者记录的实体组状态更新为无效,如果某个机房的Bigtable集群写入失败,需要首先使得相应的协调者记录的实体组状态失效以后写操作才可以成功返回客户端。
(2)协调者的可用性
每次写操作都需要涉及协调者,因此协调者出现故障将会导致系统不可用。当协调者因为网络或者主机故障等原因导致不可用时,需要检测到协调者故障并将它隔离。
Megastore使用了Chubby锁服务,协调者在启动时从数据中心获取Chubby锁。为了处理请求,协调者必须持有Chubby锁。一旦因为出现问题导致锁失效,协调者就会恢复到一个默认的保守状态:认为所有它所能看见的实体组都是失效的。如果协调者的锁失效,写操作可以安全地将它忽略;然而,从协调者不可用到锁失效有一个短暂(几十秒)的Chubby锁过期时间,这个时间段写操作都会失败。所有的写入者都必须等待协调者的Chubby锁过期。
(3)竞争条件
除了可用性问题,对于协调者的读写协议必须满足一系列的竞争条件。失效操作总是安全的,但是生效操作必须谨慎处理。在异步网络环境中,消息可能乱序到达协调者。每条生效和失效消息都带有日志位置信息。如果协调者先收到较晚的失效操作再收到较早的生效操作,生效操作将被忽略。
协调者从启动到退出为一个生命周期,每个生命周期用一个唯一的序号标识。生效操作只允许在最近一次对协调者进行读取操作以来序号没有发生变化的情况下修改协调者的状态。