6.2.8 写入流程
Megastore的写入流程如图6-9所示。
图 6-9 Megastore写入流程
执行完一次完整的读操作之后,下一个可用的日志位置,最后一次写操作的时间戳,以及下一次的主副本(Leader)都知道了。在提交时刻所有的修改操作都被打包,同时还包含一个时间戳、下一次主副本提名,作为提议的下一个日志位置的共识值。如果该值被大多数副本通过,它将被应用到所有的副本中,否则整个事务将中止且从读操作开始重试。
写入过程包括如下几个步骤:
1)请求主副本接受:请求主副本将提议的共识值(写事务的操作日志)作为0号提议。如果成功,跳至步骤3)。
2)准备:对于所有的副本,运行Paxos协议准备阶段,即在当前的日志位置上使用一个比以前所有提议都更高的提议号进行提议。将提议的共识值替换为已知的拥有最高提议号的副本的提议值。
3)接受:请求剩余的副本接受主副本的提议,如果大多数副本拒绝这个值,返回步骤2)。Paxos协议大多数情况下主副本不会变化,可以忽略准备阶段直接执行这个阶段,这就是Megastore中的快速写。
4)使实体组失效:如果某些副本不接受多数派达成的共识值,将协调者记录的实体组状态标记为失效。协调者失效操作返回前写操作不能返回客户端,从而防止用户的最新读取得到不正确的结果。
5)应用操作日志:将共识值在尽可能多的副本上应用生效,更新实体组的数据和索引信息。