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:这种情况下,读请求可以读到其所需的数据,然后马上返回;
   232   233   234   235   236   237   238   239   240   241   242