Page 234 - 《软件学报》2021年第10期
P. 234
3206 Journal of Software 软件学报 Vol.32, No.10, October 2021
能,同时也将备机的情况考虑在内,以获得良好的高可用行为.Query Fresh 对待重放操作只需将 redo 日志存储到
相应的内存数组即可,因此重放操作在 Query Fresh 中的开销可以忽略不计.此外,针对典型 DBMS 中重放操作
的串行化行为,Query Fresh 中不同的线程可以并行实施重放操作,最大限度地减少系统的不可用间隔.Query
Fresh 最大的不足是它对硬件配置要求很高,需要在 Infiniband 以及非易失性内存的高端机器环境中运行.
总的来说,log-as-database 系统实现上存在两种实践.
1) 一种方式是定制底层文件系统,其向上层的执行引擎提供读写接口,实现简单的文件操作功能;同时,
针对数据库管理系统的要求,实现高可用、时间点恢复等功能.国内互联网公司,例如腾讯、阿里巴巴
等都采用这种技术路线;
2) 第 2 种方式是在已有的文件系统,例如 HDFS、S3 等上实现单拷贝系统.NUS 与 Amazon 采用的就是
这种方法.
对比两种不同的技术路线或者量化分析底层文件系统(例如 HDFS)给系统带来的开销是很有意义的,这可
以作为未来的一个研究方向.
复制
复制是分布式环境中最复杂的一个技术.复制策略可以被划分为两大类:主动复制 [15] 和被动复制 [16,17] .主动
复制技术实现起来相对较为简单,因为它规定了事务提交操作的网络传输代价.主动复制的缺点在于它要求事
务的操作序列必须是确定性的,这与现实环境的工作负载存在较大的冲突.因此,大多数工程实践采用被动复制
策略,LogStore 采用类似 raft [18] 的同步复制协议.
2 系统架构
LogStore 是一个多线程、无锁化、高性能的键值数据库系统,同时将高可用规范纳入系统设计准则.
LogStore 将分片指派到特定线程,同时利用多版本并发控制,以无锁的方式消除读写冲突、写写冲突、上下文切
换开销.我们充分利用日志即数据的设计理念优化 LogStore,以达到满意的效果.此外,为了方便读操作,LogStore
集成了轻量级缓冲区.系统定期执行合并操作以支持范围查询.因此,在 LogStore,数据分为两部分:排序、无序的
两部分.图 1 所示为系统总体架构示意图.每个分片都配备一个队列以接收到达的写请求;利用 ART 树(adaptive
radix tree) [19] 对外存数据进行索引,以便快速定位顺序写入的数据;LogStore 内嵌了轻量级缓冲区以及复制模块,
以高效地支持读操作以及系统高可用.
主机 备机 备机
写请求队列 secondary 写请求队列
计算引擎 索引 缓存 索引 缓存
......
分片k 分片N 分片V 分片K 分片N 分片V
...... ...... ...... ......
CPU Core CPU Core CPU Core CPU Core CPU Core CPU Core
日志
存储
一致性模块
Fig.1 System overview
图 1 系统总体架构