Rocksdb Tuning

Rocksdb配置选项尤其繁多,想要获得真正的高性能,需要进行详细的调优,这是项复杂的工作,需要在实践中积累经验:https://www.jianshu.com/p/8e0018b6a8b6

https://cloud.tencent.com/developer/article/2329992

调优 RocksDB 通常就是在三个 amplification 之间做取舍:

  • Write amplification - 也就是我们最经常碰到的写放大,假设我们每秒写入 10MB 的数据,但观察到硬盘的写入是 30MB,那么写放大就是 3。写放大主要发生在compaction阶段,因为每层的sst文件大小和数量是有限制的,所以Level0层compaction可能会引起Level1~LevelN连锁compatction。对于写入压力比较大的应用来说,我们要做的就是尽量减小写放大。写放大能通过 RocksDB 自己的统计看到。
  • Read amplification - 读放大,对于一个 query 需要读取硬盘的次数。譬如一个 query 我们读取了 5 pages,那么读放大就是 5。读放大没法通过 RocksDB 自己的统计很好的查看,通常会通过 iostat 等命令进行评估。
  • Space amplification - 空间放大,这个比较好理解,假设我需要存储 10MB 的数据,但实际硬盘占用了 30MB,那么空间放大就是 3。对于内存和硬盘资源比较紧张的系统,要尽量减小空间放大。 

对于写性能衰退的问题,要根据不同的情况调整参数,参考Tuning RocksDB - Write Stalls - 简书 (jianshu.com)

 Rocksdb的MANIFEST文件:

MANIFEST 记录着 RocksDB 一些状态变化的信息,用来在重启的时候能让 RocksDB 还原到最近的一致状态上面去。

为什么需要 MANIFEST 呢?RocksDB 是一个 key-value storage,但它实际的数据文件

还是会存放到操作系统的文件系统上面。有些时候,文件系统的操作并不是原子的,可能因为一些系统的问题导致出现数据不一致的状态,即使文件系统有 journal log,也不是绝对安全的。所以 RocksDB 并不会将自己的一些 meta 信息存放到自己的 key-value 系统里面,而是使用了单独的一个 MANIFEST 文件。

MANIFEST 包括一系列的 manifest 文件,以及标识最后最新的一个 manifest 文件的 CURRENT 文件。Manifest 文件名的格式类似 MANIFEST-,sequence number 会一直递增,最新的 manifest 文件一定有最大的 sequence number。

我们可以认为 MANIFEST 是一个 transaction log,只要 RocksDB 的状态变化,就会记录一下。当一个 manifest 文件超过了配置的最大值的时候,一个包含当前 RocksDB 状态信息的新的 manifest 文件就会创建,CURRENT 文件会记录最新的 manifest 文件信息。当所有的更改都 sync 到文件系统之后,之前老的 manifest 文件就会被自动清除。

这里需要注意,一定要设置 max_manifest_file_size,不然 RocksDB recover 的时间会非常的长。

链接:https://www.jianshu.com/p/d1b38ce0d966

你可能感兴趣的:(数据库)