CockroachDB架构的Storage层读取数据并将数据写入磁盘。

如果你还没阅读过架构概览,建议你先阅读该篇。

概览

每个CockroachDB节点至少包含一个store,在节点启动时指定,这是cockroach进程在磁盘上读取和写入其数据的地方。

使用RocksDB将此数据作为键值对存储在磁盘上,RocksDB被作为黑盒API。 在内部,每个store包含三个RocksDB实例:

此外,还在节点中的所有stores之间共享块缓存。 这些store又有一系列range副本。 一个range的多个副本永远不会放在同一个store甚至同一个节点上。

与其他层的交互

与CockroachDB中的其他层的关联中,存储层:

组成

RocksDB

CockroachDB使用RocksDB(一种嵌入式kv存储)来读取和写入磁盘数据。更多信息查看 RocksDB Basics GitHub page.

RocksDB与CockroachDB高度集成,原因如下:

底层RocksDB引擎通过前缀压缩保证了key的高效存储。

MVCC

CockroachDB严重依赖于多版本并发控制(MVCC)来处理并发请求并保证一致性。 通过使用混合逻辑时钟(HLC)时间戳来区分数据版本,跟踪提交时间戳以及识别值的垃圾收集到期时间,可以完成大部分工作。 然后将所有这些MVCC数据存储在RocksDB中。

尽管在Storage层中实现,但MVCC值被广泛用于在Transaction层中保证一致性。 例如,CockroachDB维护一个Timestamp Cache,它存储上次读取key的时间戳。 如果写入操作发生在比读取时间戳缓存中的最大值更低的时间戳,则表示存在潜在的异常,必须在稍后的时间戳重新启动事务。

Time-Travel

正如 SQL:2011 standard中所述,支持 time travel 查询 (由MVCC提供支持).

为此,所有schema information背后都有一个类似MVCC的模型。 这使你可以执行SELECT ... AS OF SYSTEM TIME,并且CockroachDB实际上使用as of指定的时间的schema information来制定查询。

使用这些工具,你可以在垃圾收集时间内从数据库中获取一致的数据。

垃圾回收

CockroachDB定期垃圾回收MVCC值以减少存储在磁盘上的数据大小。 为此,当存在较新的MVCC值且时间戳早于垃圾收集周期时,我们压缩旧的MVCC值。 默认情况下,垃圾回收期为24小时,但可以在Replication Zones所在集群,数据库或表级别进行设置。

与其他层的交互

Storage & Replication 层

Storage层提交从Raft日志到磁盘的写入,以及将请求的数据(即读取)返回到Replication层。

What's Next?

现在你已了解我们的架构,可以开始启动本地群集并开始使用CockroachDB构建应用程序