Checkpoints¶
Checkpoint 在 rocksdb 中提供了一种 给运行中的数据库在一个独立的文件夹中生成快照的能力。checkpoint 可以当成一个特定时间点的快照来使用,可以用只读模式打开,用于查询该时间点的数据,或者以读写模式打开,作为一个可写的快照使用。checkpoint 可以用于全量和增量备份。
checkpoint 功能使得 Rocksdb 有能力为给定的 Rocksdb 数据库在一个特定的文件夹创建一个一致性的快照。如果快照跟原始数据在同一个文件系统,SST 文件会以硬链接形式生成,否则,SST 文件会被拷贝。MAINFEST 文件和 CURRENT 文件会被拷贝。另外,如果有多个列族,在 checkpoint 开始和结束的时间段内的日志文件(WAL)会被拷贝,以保证提供一个跨列族的一致性的快照。
生成 checkpoint(逻辑意义上的 checkpoint)前,一个 Checkpoint(cpp 代码层面意义上的)对象需要被创建。API 如下:
Status Create(DB* db, Checkpoint** checkpoint_ptr);
给出 Checkpoint 对象和一个目录,CreateCheckpoint 函数会在目标文件夹创建一个数据库的一致性的快照。
Status CreateCheckpoint(const std::string& checkpoint_dir);
这个目录不应该是已经存在的,他会被这个 API 创建。目录需要时绝对路径。checkpoint 可以被当做一个只读的 DB 备份,或者可以被当做一个独立的 DB 实例打开。当以读写模式打开,SST 文件会继续以硬链接存在,只有当这些文件被淘汰的时候,这些链接才会被删除。当用户用完这个快照,用户可以删除这个目录,以删除这个快照。
在 MyRocks,Checkpoints 被用来做在线备份。MyRocks 是 Mysql 使用 RocksDB 做存储引擎的一个分支(基于 Rocksdb 的 Mysql)。