侈奢读什么RocksDB系列⼆⼗⼆:RocksDB使⽤场景和特性
存储和访问数百PB的数据是⼀个⾮常⼤的挑战,开源的RocksDB就是FaceBook开放的⼀种嵌⼊式、持久化存储、KV型且⾮常适⽤于fast storage的存储引擎。
传统的数据访问都是RPC,但是这样的话访问速度会很慢,不适⽤于⾯向⽤户的实时访问的场景。随着fast storage的流⾏,越来越多的应⽤可以通过在flash中管理数据并快速直接的访问数据。这些应⽤就需要使⽤到⼀种嵌⼊式的databa。
dota2分段 使⽤嵌⼊式的databa的原因有很多。当数据请求频繁访问内存或者fast storage时,⽹路延时会增加响应时间,⽐如:访问数据中⼼⽹络耗时可能就耗费50ms,跟访问数据的耗时⼀样多,甚⾄更多。这意味着,通过RPC访问数据有可能是本地直接访问耗时的两倍。另外,机器的core数越来越多,storage-IOPS的访问频率也达到了每秒百万次,传统数据库的锁竞争和context 切换会成为提⾼storage-IOPS的瓶颈。所以需要⼀种容易扩展和针对未来硬件趋势可以定制化的databa,RocksDB就是⼀种选择。
RocksDB是基于Google的开源key value存储库LevelDB,主要满⾜以下⽬标:
1、适⽤于多cpu场景
商业服务器⼀般会有很多cpu核,要开发⼀个随着CPU 核数吞吐量也随之增⼤的数据库是很困难的,更
别提是线性的递增关系。但
是,RocksDB是可以⾼效地运⾏在多核服务器上。⼀个优点是RocksDB提供的语义⽐传统的DBMS更简单。例如:RocksDB⽀持MVCC,但是仅限于只读的transaction。另⼀个优点是数据库在逻辑上分⽚为read-only path和read-write path。这两种⽅法可以降低锁竞争,⽽降低锁竞争是⽀持⾼并发负载的前提条件。
2、⾼校利⽤storage(更⾼的IOPS、⾼效的压缩、更少的写磨损)
现在的存储设备都可以⽀持到每秒10w的随机读,如果有10块存储卡的话就可以⽀持每秒100w的随机读。RocksDB可以在这种快速存储上⾼效运⾏且不会成为性能瓶颈。
和实时更新的B-tree相⽐,RocksDB有更好的压缩和更⼩的写放⼤。RocksDB由于压缩更优,所以占⽤更少的storage;由于更⼩的写放⼤,flash 设备可以更持久。
3、弹性架构,⽀持扩展
RocksDB⽀持扩展。⽐如,我们可以新增⼀个merge operator,这样就可以使⽤write-only来替代read-modify-write。然⽽,read和Write 是会增加存储的读写IOPS。在写频繁的负载下,这种措施可以降低IOPS。
津贴补贴
4、⽀持IO-bound、in-memory、write-once
IO-bound workload是指数据库⼤⼩远⼤于内存且频繁地访问storage。in-memory workload是指数据库数据都在内存中且仍然使⽤storage来持久化存储DB。write-once workload是指⼤部分的key都只会写⼊⼀次或者inrt且没有更新操作。现在RocksDB很好⽀持IO-bound,要想更好地⽀持in-memory,需要做⼀些⼯作。⽀持write-once的话,还有很多遗留问题待解决。
RocksDB不是⼀个分布式的DB,⽽是⼀个⾼效、⾼性能、单点的数据库引擎。RocksDB是⼀个持久化存储keys和values的c++ library。keys 和values可以是任意的字节流,且按照keys有序存储。后台的compaction会消除重复的和已删除的key。RocksDB的data以log-structured merge tree的形式存储。RocksDB⽀持原⼦的批量写⼊操作以及前向和后向遍历。
RocksDB采⽤“可插拔式”的架构,所以很容易替换其中的组件,允许⽤户很容易在不同的负载和硬件设备上进⾏调优。
槟城>pets考试
1441593_10151976018697200_1580274673_n.png
⽐如,⽤户可以添加不同的压缩模块(snappy, zlib, bzip, etc),且使⽤不同模块时不⽤修改源码。这可⽤于在不同负载下通过配置使⽤不同的压缩算法。同理,⽤户可以在compaction时加载个性化的compaction filter来处理keys,例如,可以实现DB的key的"expire-time"功能。RocksDB有可插拔式的API,所以应⽤可以设计个性化的数据结构来cache DB的写数据,典型应⽤就是prefix-hash,其中⼀部分key使⽤hash 存储,剩下的key存储在B-tree。storage file的实现也可以定制开发,所以⽤户可以实现⾃⼰的storage file格式。
RocksDB⽀持两种compaction style(level style和universal style)。这两种style可做读放⼤、写放⼤、空间放⼤之间做tradeoff。compaction也⽀持多线程,所以打的DB可以⽀持⾼性能的compaction。
RocksDB也提供在线的增量备份接⼝,也⽀持bloom filters,这可以在range-scan时降低IOPS。
RocksDB可以充分挖掘使⽤flash的IOPS,在随机读、随机写和bulk load时性能优于LevelDB。在随机写和bulk load时,性能优于LevelDB 10倍,在随机读时性能优于LevelDB 30%。
LevelDB是单线程执⾏compaction,在特定的rver workload下表现堪忧,但是RocksDB在IO-boun
d workload下性能明显优于LevelDB。在测试中发现,LevelDB发⽣频繁的write-stall,这严重影响了DB的99%延迟,另外也发现,把⽂件mmap到OS cache会引⼊读性能瓶颈。测试表明,应⽤不能充分使⽤flash的⾼性能,这是因为数据的带宽瓶颈引起了LevelDB的写放⼤。通过提⾼写速率和降低写放⼤,可以避免很多问题,同时提⾼RocksDB性能。
射骑RocksDB的典型场景(低延时访问):
1、需要存储⽤户的查阅历史记录和⽹站⽤户的应⽤
2、需要快速访问数据的垃圾检测应⽤
3、需要实时scan数据集的图搜索query
普联路由器设置4、需要实时请求Hadoop的应⽤
5、⽀持⼤量写和删除操作的消息队列
梦到去世的人