Page 237 - 《软件学报》2021年第10期
P. 237
朱阅岸 等:构建新型高性能与高可用的键值数据库系统 3209
机确认日志记录已被成功地在多数派备机上执行时,它即可以安全地提交这批事务,然后回复客户端;
阶段 2:主机首先更新本地的提交位点(commit point).在下一轮,主机附带上该提交位点,通知备机将提
交位点推进该位置.备机需要再次从磁盘读入已经达成共识的日志记录,然后回放(一个优化措施是将
最近的日志记录放入内存缓存,但是仍然需要多一次的内存拷贝).这意味着这一轮接收与刷盘的日志
需要在下一轮再次被读入,回放.主从差距产生的根源即在于此流程.
Phase 1 Phase 2
Client Log entry 提交位点
主副本
ack
备份1 flush
备份2 flush
(a) 数据复制流程
gap
Log
entry
replayed_lsn potential_commit_lsn flushed_lsn
(b) 主从差距示意图
Fig.3 Data replication flow and illustrates the gap between primary and secondary
图 3 数据复制流程和主从差距的示意图
尽管主机可以使用批量提交以及流水线技术最小化 I/O 代价,但是备机面临的问题却是双拷贝架构无法避
免的.备机将本轮接收的日志记录追加到文件末尾,但是这些新到来的日志记录即使在参与者之间达成共识,备
机也无法马上进行回放操作,而是需要等待主机的提交位点.当只读请求被路由到备机时,它读到的数据很大可
能是较早前的快照.如图 3(b)所示,备机存在 3 种状态的日志记录:第 1 种情况是,已经回放完成的日志记录,其描
述的操作已经反映到数据存储;第 2 种情况是,已经确定在主机提交的日志记录但是提交位点尚未同步到备机,
我们将这些日志记录的状态称为潜在提交;最后一种是已经刷盘但是尚未达成共识的日志记录.本文采用 3 个
变量区分这 3 种状态的日志记录.
1) replayed_lsn:LSN 小于该变量的日志记录都属于已经回放完成的记录;
2) potential_commit_lsn:LSN 大于 replayed_lsn 但是小于等于该变量的日志记录都已经达成共识,但是尚
未在备机回放;
3) flushed_lsn:LSN 大于 potential_commit_lsn 小于该变量的日志记录都尚未达成共识.
因此,当时间戳为 l 的读请求到达备机时,面临 3 种情况.
1) l≤replayed_lsn:这种情况下,读请求可以读到其所需的数据,然后马上返回;