Sophia:为高负载而设计的可嵌入 K/V 数据库

  • 李小兵

2015 年 4 月 22 日

话题:数据库语言 & 开发架构AI

Sophia是一个为高负载而设计的可嵌入 K/V 数据库,基于 BSD 许可协议开源,代码托管在GitHub。Sophia 和其架构来源于对原始算法约束的研究和重新思考,如目前日益流行的基于日志文件的数据结构(LSM-treeB-tree等)。大多数的基于日志的数据库都会将自己的文件存储作为一个存储文件的集合进行组织,并定时合并文件。当查找数据、Range 时性能表现非常低。而 Sophia 改进了这种解决方案,它采用了只追加模式,还提供了更加快速的读取数据操作。

Sophia 的主要特征如下:

  • 完全只追加的 MVCC 的存储引擎,旨在快速地进行写操作,并优化了读操作;
  • 支持 ACID 事务,基于快照隔离而实现的真正轻量级事务控制;
  • 支持异步,能够选择阻塞或非阻塞的方式执行事务处理过程;
  • 支持压缩,最少两到十倍压缩比率,压缩算法包括LZ4ZSTD
  • 基于BSD 开源协议开源。

Sophia 的主要存储单元是节点(Node),每个节点代表一个独立的文件,该文件被分配到内存区域(Region)索引和两个内存 Key 索引。节点文件有多个(Branch)组成,每个分支由一套已排序的区域和区域索引构成。一个区域持有许多具有值的 Key,它同一个 B-Tree 页具有相同的语义,但是以不同的方式组织。区域没有树结构或者任何内部页面到页面的关系,并且因此没有元数据开销。一个区域索引由一个有序的区域表示,这些区域具有最小和最大 Key 以及磁盘上的引用。一个 Key 索引与 0 层的 LSM-tree 非常相似,但是具有不同生命周期的 Key。Sophia 的架构如下图所示:

Sophia 的生命周期有两个主要操作构成:分支和压缩(Compaction)。当节点的内存 Key 索引大小达到一个特定的上线值时,或者全局内存不足时,分支操作就会如期执行。当一些节点分支计数达到一个特定上线值时,压缩操作就会以多线程模式如期执行。Sophia 的所有后台操作都由特定的计划任务(Scheduler)控制,它对读操作进行了优化,最新创建的 Branch(热数据)会存储在文件系统的缓存中。此外,Sophia 还能够高效地利用可用内存以及具有硬盘和闪存友好特征。

Sophia 的当前最新版本是1.2.2 版。Sophia 的性能已经基于实际场景进行了基准测试,有兴趣的读者请查看测试的结果文档。此外,官方还提供了各个版本的相关文档,如 API、例子、操作手册等。


感谢郭蕾对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群)。

数据库语言 & 开发架构AI