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

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

Sophia的主要特征如下:

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

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

Sophia:为高负载而设计的可嵌入K/V数据库_第1张图片

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

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

感谢郭蕾对本文的审校。

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

你可能感兴趣的:(Sophia:为高负载而设计的可嵌入K/V数据库)