RocksDB -- Index Block 格式
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
RocksDB -- Partitioned Index Filters 浅析
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
什么是 Varint 编码
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
RocksDB -- Block-based Table 浅析
1. 什么是 Block-based TableBlock-basedTable 是 RocksDB 默认的 SST 表格式。
SST 是 RocksDB 架构的重要部分,关于 RocksDB 的架构,查看 RocksDB — 高级架构。
SST 文件就是数据库目录里那些以后缀 .sst 结尾的文件,例如 000009.sst,其中存储着 RocksDB 持久化的数据。
2. 文件格式Block-based Table 的格式如下:
123456789101112131415<beginning_of_file>[data block 1][data block 2]...[data block N][meta block 1: filter block][meta block 2: index block][meta block 3: compression dictionary block][meta block 4: range deletion block][meta block 5: stats block]...[meta block K: future ex ...
RocksDB -- WAL 记录格式
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
RocksDB -- MANIFEST 记录格式
请注意,此文章尚未完成。
当此文章完结时,此声明将被删除。
RocksDB -- WAL(Write Ahead Log) 浅析
1. 什么是 WALWAL(Write Ahead Log) 顾名思义,写前日志。
每次对 RocksDB 的更新都被写入两个地方:
内存中一个名为 memtable 的数据结构(稍后将被 flush 到 SST 文件中);
WAL。
当发生故障时,可以使用 WAL 来完全恢复 memtable 中的数据,这对于将数据库恢复到原始状态是必要的。
在默认配置中,RocksDB 通过在每个用户写入后 flush WAL 来保证进程崩溃的一致性。
当 RocksDB 干净地关闭时,所有未提交的数据都在关闭之前提交,因此始终保证一致性。当 RocksDB 进程被杀死或机器重新启动时,RocksDB 需要将自己恢复到一致的状态。
WAL 是 RocksDB 架构中重要的一部分,如果你还不了解 RocksDB 的架构,可以查看 RocksDB — 高级架构 这篇文章。
2. WAL 的生命周期让我们使用一个示例来说明 WAL 的生命周期。
-
12345678DB *db;std::vector<ColumnFamilyDescriptor> column_families;co ...
RocksDB -- MANIFEST 浅析
1. 什么是 MANIFESTRocksDB 是文件系统与存储介质无关的。
文件系统的操作不具有原子性,可能会由于意外情况,导致 RocksDB 出现不一致的问题。
即使打开了日志记录,文件系统也不能保证不洁重启的一致性。
POSIX 文件系统也不支持原子的操作批处理。
因此,在 RocksDB 重新启动时,仅仅依赖 RocksDB 数据存储文件中的元数据来重建最后的一致状态是不现实的。
RocksDB 拥有一个内置的机制来克服上述 POSIX 文件系统的限制,即 MANIFEST。
RocksDB 把使 RocksDB 状态改变的事务日志存在 MANIFEST 文件中。
RocksDB 重启时,会通过 MANIFEST 中的内容,将 RocksDB 恢复到最后已知的一致性状态。
MANIFEST 中采用版本编辑记录(Version Edit Records)。
2. 相关术语
MANIFEST: RocksDB 状态变化的事务日志。
Manifest log: 单个包含 RocksDB 状态快照/编辑的日志文件。
CURRENT: 最新的 manifest log。
3. MAN ...
RocksDB -- MemTable 浅析
1. 什么是 MemTableMemTable 是一个内存中的数据结构,在数据被 flush 到 SST 文件之前,它保存着数据。
memtable 同时服务于读和写 —— 新的写总是插入数据到 memtable,而读必须在从 SST 文件读取之前查询memtable,因为 memtable 中的数据是更新的。
一旦一个 memtable 被填满,它就成为不可变的,并被一个新的 memtable 所取代。
一个后台线程将不可变的 memtable 的内容 flush 到一个 SST 文件中,然后可以销毁这个 memtable。
memtable是 RocksDB 架构中非常重要的一部分。关于 RocksDB 的架构,查看这里 RocksDB — 高级架构。
2. 几个对 MemTable 影响较大的选项1. AdvancedColumnFamilyOptions::memtable_factory: memtable 的工厂对象。通过指定工厂对象,用户可以改变 memtable 的底层实现,并提供实现特定的选项(默认工厂: SkipListFactory)。
2. ColumnFam ...
Rust -- 泛型、trait 与生命周期
简单来说,泛型就是一个减少重复的编程技术。泛型概念在大部分编程语言中都有,学习 Rust 的人一般都有其他语言的基础,这里就不详细介绍什么是泛型了。
trait 是 Rust 的一个特性,这使你可以以一个通用的方式定义行为。trait 可以与泛型结合,将泛型限制为拥有特定行为的类型,而不是任意类型。
生命周期(lifetimes)也是 Rust 中的一个特性,生命周期其实就是一个泛型,这个泛型为编译器提供引用之间如何相互关联的信息。Rust 的生命周期允许我们在许多情况下借用值,同时仍然允许编译器检查引用是否有效。
上面对泛型、trait 和生命周期的介绍可能不是很好理解,简单有个印象就好,我们在下面通过例子详细来说。
1. 泛型1.1. 在函数定义中使用泛型下面的代码定义了一个泛型函数,获取一个数组中的最大值。
由于使用的是泛型,所以数组成员的类型可以是 i32,f64,char 等等。
这里就通过代码看看如何使用即可:
在函数声明中的函数名字右侧,用 <> 来包含你要使用的泛型类型(常用 T,U 等等,也可以是任意的,如果你要同时使用多个泛型类型,在 <> ...