2.6 存储层
CockroachDB架构将数据读写在磁盘上
**概要
--与其他层的交互
**组件
--RocksDB
--MVCC
--垃圾收集
**与其他层的交流
--存储层与复制层
2.6.1 概要
每个cockroachDB包含至少一个存储,当节点启动,cockroach进程在磁盘中读写数据。
这个数据以KV对形式存储在磁盘上使用RocksDB,被视为一个黑箱的API,每个节点包含三个rocksDB的实例
--一个为raftlog服务
--一个存储当前的分布式SQL数据
--一个为其他节点数据服务
例外,在一个节点的所有存储共享一个block缓存。这些存储按顺序获取有range副本,一个range的多个副本不会放在相同的存储中,甚至不会放在相同的节点。
**与其他层的交互
存储层:
从复制层成功的读写。
2.6.2 组件
**RocksDB
CockroachDB使用RocksDB---一种内含的KV存储引擎—从磁盘中读写数据。你可以在RocksDB基本的Github页面找到更多信息,
https://github.com/facebook/rocksdb/wiki/RocksDB-Basics
RocksDB聚合的很好由于以下原因:
--KV存储,使它很容易映射KV层
--原子批量写和快照,提供了事务的子集。
**MVCC
CockroachDB严重依赖于多版本并发管理(MVCC)处理并发请求保证一致性。很多工作使用HLC时间戳(混合逻辑时钟)是比我不同版本的数据,跟踪提交时间戳,识别过期值垃圾回收。MVCC数据存储在RocksDB。
MVCC
https://en.wikipedia.org/wiki/Multiversion_concurrency_control
虽然MVCC在存储层实现,MVCC值在事务层广泛使用,例如cockroachDB包括时间戳缓存,存储key的最新时间戳。如果写操作发生在比读时间戳缓存更低的时间戳。这时发生了一个潜在的异常,事务必须使用最新的时间戳重启。
--Time-Travel(穿越)
像2011SQL标准中,cockroach支持穿越query(MVCC支持)。
为了使用这个,所有的schema信息也有类似于MVCC的模型。可以select… as of system time,cockroachDB利用自那时起的schema信息规划query。
使用这些组件,我们获得数据库的一致性数据,直到进入垃圾回收阶段。
**垃圾回收
CockroachDB周期性进行垃圾回收MVCC值,减少磁盘中的数据存储大小。带有时间戳新的MVCC的值比垃圾回收阶段旧,将压缩旧的MVCC值。默认的垃圾回收阶段是24小时,通过复制区域可以被设置为集群,数据库,表级别。
2.6.3 与其他层交互
**存储层和复制层
存储层提交将写操作从raft日志中提交到disk,存储层返回请求(如读请求)数据到复制层。