rocksdb
针对leveldb的改进
- rocksdb支持在key的sub-part上设置Bloomfilter,这使得范围查询成为可能
问题
compaction不可控,当L0文件达到12个, 而compaction来不及的时候, 写入完全阻塞, 这个阻塞时间可能长达10s。LevelDB实现上是L0达到4个时开始触发compaction, 8个时开始减慢写入, 12个时完全停止写入. 具体配置是写死的, 不过可以在编译时修改。但是
一旦写入速度>compaction速度, 不论这几个阈值设置多大, L0都迟早会满的.
阈值调大会导致数据都堆积在L0, 而L0的每个文件key范围是重叠的, 意味着一次查询要到L0的每个文件中都查一下, 如果L0文件有100个的话,这大约就是100次IO, 读性能会急剧降低.
实际上, RocksDB的 Universal Style 就是把所有的数据都放在L0, 不再做compaction, 这样显然没有写放大了,但是读的速度就更慢了, 所以限制单个DB大小小于100G, 而且最好在内存.
写放大。基准数据100G的情况下, 50K的value, 用200qps写入, 磁盘带宽达到100MB\/s 以上。真实写入数据大约只有50K*200=10MB\/s, 但是磁盘上看到的写大约是10-20倍, 这些写都是compaction在写,此时的性能瓶颈已经不是CPU或者是LevelDB代码层,而是磁盘带宽了, 所以这个性能很难提上去,而且HDD和SSD在顺序写上性能差别不大, 所以换SSD后性能依然很差
参考资料