不得不說的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