6.2.7 读取流程

Megastore的读取流程如图6-8所示。Megastore最新读取流程如下。

6.2.7 读取流程 - 图1

图 6-8 Megastore读取流程

1)本地查询。查询本地副本的协调者来决定这个实体组上数据是否已经是最新的。

2)发现位置。确认一个最高的已经提交的操作日志位置,并选择最新的副本,具体操作如下:

●本地读取(Local Read):如果本地查询确认本地副本已经是最新的,直接读取本地副本已经提交的最高日志位置和相应的时间戳。这实际上就是前面提到的快速读。

●多数派读取(Majority Read):如果本地副本不是最新的(或者本地查询、本地读取超时),从多数派副本中读取最大的日志位置,然后从中选取一个响应最快或者最新的副本,并不一定是本地副本。

3)追赶。一旦某个副本被选中,就采取如下方式使其追赶到已知的最大位置处:

●获取操作日志:对于所选副本中所有不知道Paxos共识值的日志位置,从其他副本中读取。对于所有不确定共识值的日志位置,利用Paxos发起一次无操作的写(Paxos中的no-op)。Paxos协议将会促使大多数副本达成一个共识值:要么是无操作写,要么是以前已提交的一次写操作。

●应用操作日志:顺序地应用所有已经提交但还没有生效的操作日志,更新实体组的数据和索引信息。

4)使实体组生效。如果选取了本地副本且原来不是最新的,需要发送一个生效消息以通知协调者本地副本中这次读取的实体组已经最新。生效消息不需要等待应答,如果请求失败,下一个读取操作会重试。

5)查询数据。在所选副本中通过日志中记录的时间戳读取指定版本数据。如果所选副本不可用了,重新选取一个替代副本,执行追赶操作,然后从中读取数据。