RocksDB---一個事實可以取代Redis和DynamoDB的NoSql數據庫

不得不說的RocksDB

標題看起來是比較大了,因爲無論Redis還是DynamoDB都堪稱是各自領域的翹楚,已經非常好了。

RocksDB: https://github.com/facebook/rocksdb/

RocksDB是使用C++編寫的嵌入式kv存儲引擎,其鍵值均允許使用二進制流。由Facebook基於levelDB開發, 提供向後兼容的levelDB API。

RocksDB針對Flash存儲進行優化,延遲極小。RocksDB使用LSM存儲引擎,純C++編寫。Java版本RocksJava正在開發中。參見RocksJavaBasic

RocksDB依靠大量靈活的配置,使之能針對不同的生產環境進行調優,包括直接使用內存,使用Flash,使用硬盤或者HDFS。支持使用不同的壓縮算法,並且有一套完整的工具供生產和調試使用。

  • 爲需要存儲TB級別數據到本地FLASH或者RAM的應用服務器設計
  • 針對存儲在高速設備的中小鍵值進行優化——你可以存儲在flash或者直接存儲在內存
  • 性能碎CPU數量線性提升,對多核系統友好

其實,國內對於RocksDB使用的廠家可能並不多,倒是可能對levelDB更加了解一些,但是事實是RocksDB已經把levelDB的功能甩開幾條街,具體如下:

Performance

  • Multithread compaction
  • Multithread memtable inserts
  • Reduced DB mutex holding
  • Optimized level-based compaction style and universal compaction style
  • Prefix bloom filter
  • Memtable bloom filter
  • Single bloom filter covering the whole SST file
  • Write lock optimization
  • Improved Iter::Prev() performance
  • Fewer comparator calls during SkipList searches
  • Allocate memtable memory using huge page.

Features

  • Column Families
  • Transactions and WriteBatchWithIndex
  • Backup and Checkpoints
  • Merge Operators
  • Compaction Filters
  • RocksDB Java
  • Manual Compactions Run in Parallel with Automatic Compactions
  • Persistent Cache
  • Bulk loading
  • Forward Iterators/ Tailing iterator
  • Single delete
  • Delete files in range
  • Pin iterator key/value

Alternative Data Structures And Formats

  • Plain Table format for memory-only use cases
  • Vector-based and hash-based memtable format
  • Clock-based cache (coming soon)
  • Pluggable information log
  • Annotate transaction log write with blob (for replication)

Tunability

  • Rate limiting
  • Tunable Slowdown and Stop threshold
  • Option to keep all files open
  • Option to keep all index and bloom filter blocks in block cache
  • Multiple WAL recovery modes
  • Fadvise hints for readahead and to avoid caching in OS page cache
  • Option to pin indexes and bloom filters of L0 files in memory
  • More Compression Types: zlib, lz4, zstd
  • Compression Dictionary
  • Checksum Type: xxhash
  • Different level size multiplier and compression type for each level.

Manageability

  • Statistics
  • Thread-local profiling
  • More commands in command-line tools
  • User-defined table properties
  • Event listeners
  • More DB Properties
  • Dynamic option changes
  • Get options from a string or map
  • Persistent options to option files

當然以上還緊緊是截止到2006年的數據,國內不太熟悉主要可能還是因爲源自國外Facebook,主要是英文文檔導致的。

特性

適用於多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都只會寫入一次或者insert且沒有更新操作。現在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採用“可插拔式”的架構,所以很容易替換其中的組件,允許用戶很容易在不同的負載和硬件設備上進行調優。

 

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,在特定的server workload下表現堪憂,但是RocksDB在IO-bound workload下性能明顯優於LevelDB。在測試中發現,LevelDB發生頻繁的write-stall,這嚴重影響了DB的99%延遲,另外也發現,把文件mmap到OS cache會引入讀性能瓶頸。測試表明,應用不能充分使用flash的高性能,這是因爲數據的帶寬瓶頸引起了LevelDB的寫放大。通過提高寫速率和降低寫放大,可以避免很多問題,同時提高RocksDB性能。
RocksDB的典型場景(低延時訪問):
1、需要存儲用戶的查閱歷史記錄和網站用戶的應用
2、需要快速訪問數據的垃圾檢測應用
3、需要實時scan數據集的圖搜索query
4、需要實時請求Hadoop的應用
5、支持大量寫和刪除操作的消息隊列

參考

https://rocksdb.org.cn/doc.html

https://www.jianshu.com/p/3302be5542c7

https://www.cnblogs.com/cobbliu/articles/9553271.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章