暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

CockroachDB 存储引擎介绍(六)

CockroachDB 2021-07-14
2079


本文将详细介绍CockroachDB(以下简称CRDB)底层存储引擎RocksDB中与文件操作相关的Env类,以及SST文件的构造与Ingest导入功能。CRDB基于Env类操作SST文件实现灵活、高效的数据存储,以及支持快速备份恢复功能。


Env 类

RocksDB内部抽象出Env类,对不同平台的系统访问接口进行了封装。这使得RocksDB能够运行在不同的平台系统环境,成为一个跨平台的存储引擎。Env类声明的接口主要涉及到了文件系统相关的操作、线程池调度管理、获取系统时间等内容,需要根据不同平台系统进行了具体的实现。


用户也可以针对性地根据不同的平台运行环境和业务需求去实现自己的Env接口,例如RocksDB的SPDK拓展和SST文件加密功能,都在Env类实现上进行了改造与拓展。

Env类简介



Ingest 导入 SST 文件

Ingest功能允许用户预先创建好SST文件,并在随后直接加载到硬盘LSM结构当中,达到数据快速导入的目的。


直接构造SST文件并导入,绕开了RocksDB数据写入的线程模型(Single-Writer的设计),避免了写WAL日志,以异步的方式将键值对直接写成SST文件。同时RocksDB的Ingest实现能够尽可能地将数据放在LSM结构中最“下层”的位置,从而减少L0到Ln层不断Compaction带来的写放大问题。因此,Ingest功能适合大批量数据的直接导入。


值得注意的是,用户需要保证导入SST文件的正确性,保证SST文件能够兼容LSM层次结构而不会引起数据异常。例如,这种方式绕开了内存数据结构的排序流程,因此要求导入的数据必须严格有序。


具体地,用户首先指定了Env对象、DBOptions等配置信息创建兼容了当前DB实例的SstFileWriter对象,随后按照DBOptions中Comparator对象定义的排序规则,有序插入键值对数据,最终生成一个SST文件。在构造完一系列SST文件对象以后,通过调用DB实例的IngestExternalFile方法将这些文件直接加载到DB实例当中。


关于IngestExternalFile方法的实现:


  • 首先,构造一个ExternalSstFileIngestionJob任务,该任务管理整个Ingest任务的环境配置以及一些统计信息。

  • 任务进入Prepare阶段:检查需要Ingest导入的SST文件的正确性,包括文件之间Key值是否范围重叠,ColumnFamilyID是否有效,是否为空文件等判断。随后这些SST文件将链接到DB实例的数据目录当中,如果系统平台不支持文件链接,则替换为文件拷贝操作。

  • 通过往RocksDB的Writer队列中插入特殊标记,阻塞写DB实例的数据写入操作。随后对可能的、与Ingest导入的SST文件Key值范围重叠的所有MemTable,进行刷盘的操作。

  • 更新全局变量,阻止RocksDB执行新的Compaction任务导致LSM结构更新。

  • 任务进入Run阶段:确定文件应该在硬盘LSM结构中的哪一层,RocksDB尽可能将文件放在Key值范围不重叠的最下层。如下图,Key值范围为[E, F)的SST文件将Ingest导入到了L1层;随后,根据当前存在的快照、LSM组织形式等设置SST文件的seqnumber信息;


Ingest导入SST文件


  • 更新versionset对象到最新的version,该对象管理LSM结构中包含的所有文件的元信息。

  • 移除RocksDB的Writer队列中的特殊标记,唤醒下一个Writer作为Leader,重新开始执行数据写入流程。


总的来说,Ingest导入是RocksDB的一个很关键的功能特性,适合用户数据的大批量写入。而开发者也需要注意到Ingest导入是一个比较重的操作。对DB实例来说,除了会导致停写停Compaction以外,还可能导致MemTable的强制刷盘操作。


CRDB:文件操作相关

在libroach.h文件中声明的、与文件操作相关的接口,包括了:

  • 基本操作:新建、同步、删除、链接等文件操作;以二进制形式读写文件;文件锁。

  • RocksDB特性相关:往SST文件中写入键值对数据;Ingest导入;获取SST文件属性。


基于以上接口,CRDB能够通过Env类操作SST文件实现灵活、高效的存储。同时,底层以固定512KB的数据大小去同步硬盘文件,平滑了文件读写相关的硬盘IO曲线。除此之外,CRDB还实现了以下的功能:


1、备份与恢复

备份与恢复是CRDB企业版一个重要的功能特性。尽管CockroachDB提供了多活高可用的特性,然而在一些很极端情况下仍然可能发生集群不可用的问题,例如业务层发起不可修复的误操作或是大规模硬件故障的时候。这时候CRDB能够通过备份出来的数据进行数据恢复,保障用户数据在极端情况下能以尽量小的代价去恢复可用。


CRDB允许用户将schema和库表数据以全量或增量的方式备份到预定的位置,备份出来的文件为一系列的SST文件以及备份数据的元数据文件BACKUP。

备份与恢复


在备份功能的实现中,备份任务并行发送至备份数据相关的Range去处理,每个Range导出一个SST文件。具体地,每个子任务调用DBSstFileWriterNew接口,创建一个内存中的SST文件,随后将读取到键值对数据插入到SST文件当中,构造出SST文件。在构造完一个完整SST文件以后,整个文件将以二进制方式读取并发送到备份数据最终存放的地方(例如本地文件系统、亚马逊S3、Google云存储等)。


在恢复功能的实现中,相比起备份文件中的数据以Batch的形式直接写入RocksDB实例,Ingest功能为CockroachDB提供了另一种更加高效的数据导入方式,能够有效地减少故障恢复时间,尽快地恢复业务系统的可用状态。在恢复过程中,CRDB会先将接收到的备份数据持久化成SST文件,并基于RocksDB的Ingest功能快速导入RocksDB实例。值得注意的是,在恢复的过程中CRDB会为恢复的库和表,重新赋予新的ID,即恢复数据在一个全新的Key值区间内,不会与RocksDB实例中已有数据的Key值重叠。这就带来了两个好处,一是尽可能地避免了Ingest数据与MemTable数据重叠时,导致MemTable的强制Flush操作;二是RocksDB能够直接将恢复数据放到LSM结构的最下层。


2、信息采集

RocksDB为CRDB提供了数据持久化存储的能力,为CRDB ACID特性中原子性和持久性提供了支持。因此,CRDB中与存储相关的性能监控就需要从RocksDB中采集出相应的信息,相关的信息也能为CRDB部分性能优化提供重要的依据。


在SST文件的信息采集方面,CRDB定期获取了RocksDB中所有“有效”的SST文件的元信息(包括文件数量、key值范围、用户自定义属性集合、LSM读放大系数等),更新CRDB内部跟存储相关的性能指标,并将这些信息提供给用户做性能参考。


此外,CRDB能够利用收集到的信息进行存储相关的性能优化。例如我们在存储引擎介绍(二)中提到的,Compactor定时器对于队列中的SuggestedCompactions任务,就会使用SST文件的key值范围信息,去聚合、过滤出符合条件的Compaction任务,以便高效地回收存储空间。


3、临时存储

在CRDB中,若有限的内存空间无法满足一个SQL查询的使用需求,就会使用临时的物理存储空间,即一个临时的RocksDB实例。CRDB为了保证只有一个用于临时存储的RocksDB实例,将使用Env对象的接口来创建文件锁,确保不会创建新的临时存储空间。在关闭CRDB进程的时候,该文件锁会被删除。


总  结

本文主要介绍了为RocksDB跨平台存储提供支持的Env类,以及基于RocksDB LSM模型如何构造和Ingest导入SST文件。Env类为CRDB提供了统一的RocksDB文件操作的接口,在此之上SST文件的直接构造与Ingest导入提供了一种以SST文件形式快速导入数据的方式。


RocksDB本身的高性能以及丰富的功能特性,支撑起了CRDB更高效的数据存储能力以及更多的数据库功能。CRDB的开发者也将会持续挖掘RocksDB的潜力,在适合的场景下使用适合的RocksDB接口。


参考资料:
[1] https://github.com/cockroachdb/cockroach
[2] https://github.com/facebook/rocksdb
[3] https://www.cockroachlabs.com/blog/cockroachdb-on-rocksd/
[4] https://github.com/cockroachdb/cockroach/pull/25806
[5] https://www.cockroachlabs.com/docs/v2.1/backup.html#main-content


 



 关于我们:我们是百度 DBA 团队,团队有两位 CockroachDB PMC Member 及一位 Contributor, 目前正积极推动 NewSQL 在百度内部以及外部的发展。除了NewSQL, 我们在MySQL, PostgreSQL, GreenPlum 有多年的内核开发经验及实践经验,对数据库和大数据领域有疑问或者需求欢迎联系我们,同时欢迎有志青年加入我们!



关注我们 



文章转载自CockroachDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论