1层坠、簡介
? ? ? ?RocksDB是FaceBook起初作為實驗性質(zhì)開發(fā)的一個高效數(shù)據(jù)庫軟件,旨在充分實現(xiàn)快存上存儲數(shù)據(jù)的服務能力刁笙。RocksDB是一個c++庫破花,可以用來存儲keys和values,且keys和values可以是任意的字節(jié)流疲吸,支持原子的讀和寫座每。除此外,RocksDB深度支持各種配置摘悴,可以在不同的生產(chǎn)環(huán)境(純內(nèi)存峭梳、Flash、hard disks or HDFS)中調(diào)優(yōu)蹂喻,支持不同的數(shù)據(jù)壓縮算法葱椭、和生產(chǎn)環(huán)境debug的完善工具。 RocksDB的主要設計點是在快存和高服務壓力下性能表現(xiàn)優(yōu)越口四,所以該db需要充分挖掘Flash和RAM的讀寫速率孵运。RocksDB需要支持高效的point lookup和range scan操作,需要支持配置各種參數(shù)在高壓力的隨機讀窃祝、隨機寫或者二者流量都很大時性能調(diào)優(yōu)掐松。
2、High Level Architecture
? ? ? ?RocksDB是一個嵌入式的K-V(任意字節(jié)流)存儲粪小。所有的數(shù)據(jù)在引擎中是有序存儲大磺,可以支持Get(key)、Put(Key)探膊、Delete(Key)和NewIterator()杠愧。RocksDB的基本組成是memtable、sstfile和logfile逞壁。memtable是一種內(nèi)存數(shù)據(jù)結構流济,寫請求會先將數(shù)據(jù)寫到memtable中,然后可選地寫入logfile腌闯。logfile是一個順序寫的文件绳瘟。當內(nèi)存表溢出的時候,數(shù)據(jù)會flush到sstfile中姿骏,然后這個memtable對應的logfile也會安全地被刪除糖声。sstfile中的數(shù)據(jù)也是有序存儲以方便查找。
3、Features
Column Families
? ? ? RocksDB支持將一個數(shù)據(jù)庫實例分片為多個列族蘸泻。每個DB新建時默認帶一個名為"default"的列族琉苇,如果一個操作沒有攜帶列族信息,則默認使用這個列族悦施。如果WAL開啟并扇,當實例crash再恢復時,RocksDB可以保證用戶一個一致性的視圖抡诞。通過WriteBatch API穷蛹,可以實現(xiàn)跨列族操作的原子性。
Updates
? ? ? Put 接口可以把一對k-v數(shù)據(jù)寫入DB沐绒,如果k已經(jīng)存在的話俩莽,則已有的v會被新的v覆蓋。Write接口可以實現(xiàn)將多個k-v對寫入DB乔遮,RockdDB可以保證要么所有的k-v對都寫入DB扮超,要么一個都不寫入。同理蹋肮,不管哪個k在DB中已經(jīng)存在出刷,舊值都會被覆蓋。
Gets坯辩、Iterators馁龟、Snapshots
? ? ? RocksDB中的key和value完全是byte stream,key和value的大小沒有任何限制漆魔。Get接口提供用戶一種從DB中查詢key對應value的方法坷檩,MultiGet提供批量查詢功能。DB中的所有數(shù)據(jù)都是按照key有序存儲改抡,其中key的compare方法可以用戶自定義矢炼。Iterator方法提供用戶RangeScan功能,首先seek到一個特定的key阿纤,然后從這個點開始遍歷句灌。Iterator也可以實現(xiàn)RangeScan的逆序遍歷,當執(zhí)行Iterator時欠拾,用戶看到的是一個時間點的一致性視圖胰锌。Snapshot接口可以創(chuàng)建數(shù)據(jù)庫在某一個時間點的快照。Get和Iterator接口也可以執(zhí)行在某一個Snapshot上藐窄。某種意義上资昧,Iterator和Snapshot提供了DB在某個時間點的一個一致性視圖,但是其實現(xiàn)原理卻不一樣荆忍¢簧Γ快速短期/前臺的scan操作比較適合用Iterator诺凡,長期/后臺操作適合用Snapshot。當使用Iterator時践惑,會對數(shù)據(jù)庫相應時間點的所有底層文件增加引用計數(shù),直到Iterator結束或者釋放了引用計數(shù)后嘶卧,這些文件才允許被刪除尔觉。Snapshot不關注數(shù)據(jù)文件是否被刪除的問題,Compation進程會感知Snapshot的存在芥吟,會保證對應視圖的數(shù)據(jù)不會被刪除侦铜。當實例重啟時,Snapshot會丟失钟鸵,這是因為RocksDB不會持久化Snapshot相關數(shù)據(jù)钉稍。
Transations
? ? RocksDB提供了多個操作的事務性,支持悲觀和樂觀模式棺耍。
Prefix Iterator
? ? ?大部分的LSM引擎都不支持高效的RangeScan操作贡未,這是由于執(zhí)行RangeScan操作時都要訪問所有的數(shù)據(jù)文件導致。但是大部分用戶并不僅僅是完全scan所有的數(shù)據(jù)蒙袍,相反俊卤,很多情況下僅僅需要按照key的前綴字符串區(qū)遍歷。RocksDB根據(jù)這些應用場景害幅,優(yōu)化了對應的底層實現(xiàn)消恍。用戶可以prefix_extractor來聲明一個key_prefix,然后RocksDB為每一個key_prefix存儲相應的blooms以现。配置了key_prefix的Iterator操作可以通過對應的bloom bits來避免檢索不含有特定key prefix的數(shù)據(jù)文件狠怨,依次可以提高Iterator性能。
Persistence
? ? ?RocksDB有事物日志邑遏,所有的寫操作首先寫入內(nèi)存表內(nèi)佣赖,然后可選地寫入到事物日志中。當DB重啟時會重新執(zhí)行事物日志中的所有操作无宿,然后恢復到特定的數(shù)據(jù)狀態(tài)茵汰。事物日志數(shù)據(jù)可以與DB數(shù)據(jù)文件配置成不同的目錄下,這種情況適用于將數(shù)據(jù)文件寫到一致性孽鸡、性能高的快存中蹂午,同時可以將事物日志保存在讀寫性能相對比較慢的持久化存儲上來保證數(shù)據(jù)的安全性。當寫數(shù)據(jù)時可以配置WriteOption,來支持是否將寫操作記錄在事物日志中或者當用戶執(zhí)行commit時是否需要執(zhí)行事物日志記錄的sync操作彬碱。
Fault Torlerance
? ? ?RocksDB通過checksum來檢測磁盤數(shù)據(jù)損壞豆胸。每個sst file的數(shù)據(jù)塊(4k-128k)都有相應的checksum值。寫入存儲的數(shù)據(jù)塊內(nèi)容不允許被修改巷疼。
Multi-Threaded Compactions
? ? ?當用戶重復寫入一個key時晚胡,在DB中會存在這個key的多個value,compaction操作就是來刪除這個key的冗余數(shù)據(jù)。當一個key被刪除時估盘,compation也可以用來真正執(zhí)行這個底層數(shù)據(jù)的刪除工作瓷患,如果用戶配置合適的話,compation操作可以多線程執(zhí)行遣妥。DB的數(shù)據(jù)都存儲在sstfile中擅编,當內(nèi)存表的數(shù)據(jù)滿的時候,會將內(nèi)存數(shù)據(jù)(去重箫踩、刪除無效數(shù)據(jù)后)寫入到L0 文件中爱态。每隔一段時間小文件中的數(shù)據(jù)會重新merge到更大的文件中,這就是compation境钟。LSM引擎的寫吞吐直接依賴于compation的性能锦担,特別是數(shù)據(jù)存儲在SSD或者RAM的情況。RocksDB也支持多線程并行compaction慨削。
Avoiding Stalls
? ? ?后臺的compaction線程用來將內(nèi)存數(shù)據(jù)flush到存儲洞渔,當所有的后臺線程都正在執(zhí)行compaction時,瞬時大量寫操作會很快將內(nèi)存表寫滿理盆,這就會引起寫停頓痘煤。可以配置少一些的線程用于執(zhí)行數(shù)據(jù)flush操作猿规,
Full Backups, Incremental Backups and Replication
? ? ?RocksDB支持增量備份衷快,增量復制需要能夠查找到所有的DB修改記錄。GetUpdatesSince接口可以提供tail DB transction log的功能姨俩。RocksDB的tranction log記錄在數(shù)據(jù)庫目錄中蘸拔,當日志文件不再需要時就會move到歸檔目錄。歸檔目錄之所以存在是因為數(shù)據(jù)復制流比較落后時有可能需要檢索過去某一個時間點的日志环葵。GetSortedWalFiles可以返回所有的transction log文件列表调窍。
Block Cache -- Compressed and Uncompressed Data
? ? ?RocksDB使用LRU cache提供block的讀服務。block cache partition為兩個獨立的cache张遭,其中一塊可以cache未壓縮RAM數(shù)據(jù)邓萨,另一塊cache 壓縮RAM數(shù)據(jù)。如果壓縮cache配置打開的話菊卷,用戶一般會開啟direct io缔恳,以避免OS的也緩存重新cache相同的壓縮數(shù)據(jù)。
Table Cache
? Table cache緩存了所有已打開的文件句柄洁闰,這些文件都是sstfile歉甚。用戶可以設置table cache的最大值。
Merge Operator
? RocksDB原生地就支持三種記錄類型扑眉,分別為Put纸泄、Delete和Merge赖钞。Merge可以合并多個Put和Merge記錄為一個單獨的記錄。
本文先介紹了一下RocksDB的基本概念和知識聘裁。