Page 238 - 《软件学报》2021年第10期
P. 238

3210                                 Journal of Software  软件学报 Vol.32, No.10, October 2021

                    2)   replayed_lsn<l≤potential_commit_lsn:如果读请求的时间戳落入此区间,那么该请求需要被阻塞直到
                        备机收到主机推送的提交位点,然后回放完成;
                    3)   l>potential_commit_lsn 或 l≥flushed_lsn:这种情况下,该请求需要被丢弃.
                    在单拷贝系统下,可以对第 2 种情况进行优化.系统只需将 replayed_lsn 推进到 potential_commit_lsn,表示此
                 区间日志已经回放完成,并且可以为查询提供服务,这几乎完全消除了图 3(b)所示的主从差距.当读取请求从元
                 服务器获取最新的读取视图位点 l 后向备机请求数据,它可以将 potential_commit_lsn 与 l 进行比较.若 l 不大于
                 potential_commit_lsn,则读取请求可以利用内存中的索引来检索数据,而无需等待回放操作,提高了备机的可见
                 性与数据库的响应速度.
                 2.3.2    复制技术
                    LogStore 复制算法类似于 raft 同步复制协议.我们在工程实现上优化了 raft 协议.最大的不同如图 4 所示.


                                                               Repl queue1          Secondary 1


                                                               Repl queue2          Secondary 2
                              client

                                           Network
                              client                ordered    Task queue
                                             IO                                    Pipeline---Send stage
                              client
                                                                                   Pipeline---Ack stage
                                                                execute


                                                               Wait quorum


                                                                commit

                                                Fig.4   Replication architecture
                                                  图 4   复制算法总体架构

                    系统使用流水线技术,将复制分为请求发送阶段与 ack 接收阶段;同时,为了减少请求开销,主机将多个请求
                 打包到一个任务.系统的数据复制流程如下.
                    (1)  主机负责将请求定序,执行本地提交并等待来自备机的确认.一旦收到客户端的请求,LogStore 就会将
                        请求复制到备机.这一步骤与本地提交并行执行,以避免串行化等待.需要注意的是,主机和备机的存
                        储引擎可以与计算引擎在不同的机器上部署;
                    (2)  复制的两个阶段,即数据发送和 ack 接收,可以同时进行;
                    (3)  当收到的 ack 达到多数派,主机立即将结果返回给客户端.
                    此外,我们从工程的角度优化 LogStore 复制模块,例如合并 I/O 请求减少系统调用、使用无锁数据结构等.
                 当提供只读请求时,LogStore 的单拷贝架构可以使得副本能够提供所需的数据可见性(这主要得益于 LogStore
                 无需重放日志来产生最新的快照).复制的具体算法见下面各个子算法的相关描述.下面给出算法使用到的符号
                 以及含义.
                        p :第 p 个分片维护的修改请求集合;
                       u i p  :针对第 p 个分片的第 i 个修改操作;
   233   234   235   236   237   238   239   240   241   242   243