RocksDB系列一:RocksDB基礎和入門

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的基本概念和知識聘裁。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末雪营,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咧虎,更是在濱河造成了極大的恐慌卓缰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,744評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砰诵,死亡現(xiàn)場離奇詭異,居然都是意外死亡捌显,警方通過查閱死者的電腦和手機茁彭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,505評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扶歪,“玉大人理肺,你說我怎么就攤上這事∩屏” “怎么了妹萨?”我有些...
    開封第一講書人閱讀 163,105評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長炫欺。 經(jīng)常有香客問我乎完,道長,這世上最難降的妖魔是什么品洛? 我笑而不...
    開封第一講書人閱讀 58,242評論 1 292
  • 正文 為了忘掉前任树姨,我火速辦了婚禮,結果婚禮上桥状,老公的妹妹穿的比我還像新娘帽揪。我一直安慰自己,他們只是感情好辅斟,可當我...
    茶點故事閱讀 67,269評論 6 389
  • 文/花漫 我一把揭開白布转晰。 她就那樣靜靜地躺著,像睡著了一般士飒。 火紅的嫁衣襯著肌膚如雪查邢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,215評論 1 299
  • 那天变汪,我揣著相機與錄音侠坎,去河邊找鬼。 笑死裙盾,一個胖子當著我的面吹牛实胸,可吹牛的內(nèi)容都是我干的他嫡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,096評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼庐完,長吁一口氣:“原來是場噩夢啊……” “哼钢属!你這毒婦竟也來了?” 一聲冷哼從身側響起门躯,我...
    開封第一講書人閱讀 38,939評論 0 274
  • 序言:老撾萬榮一對情侶失蹤淆党,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后讶凉,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體染乌,經(jīng)...
    沈念sama閱讀 45,354評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,573評論 2 333
  • 正文 我和宋清朗相戀三年懂讯,在試婚紗的時候發(fā)現(xiàn)自己被綠了荷憋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,745評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡褐望,死狀恐怖勒庄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情瘫里,我是刑警寧澤实蔽,帶...
    沈念sama閱讀 35,448評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站谨读,受9級特大地震影響局装,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜漆腌,卻給世界環(huán)境...
    茶點故事閱讀 41,048評論 3 327
  • 文/蒙蒙 一贼邓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧闷尿,春花似錦塑径、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,683評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劳景,卻和暖如春誉简,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盟广。 一陣腳步聲響...
    開封第一講書人閱讀 32,838評論 1 269
  • 我被黑心中介騙來泰國打工闷串, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人筋量。 一個月前我還...
    沈念sama閱讀 47,776評論 2 369
  • 正文 我出身青樓烹吵,卻偏偏與公主長得像碉熄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子肋拔,可洞房花燭夜當晚...
    茶點故事閱讀 44,652評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 關于Mongodb的全面總結 MongoDB的內(nèi)部構造《MongoDB The Definitive Guide》...
    中v中閱讀 31,928評論 2 89
  • 最近項目中用到這個nb的玩意锈津,所以就花時間研究了下,同時整理下助自己記憶凉蜂。這個猛虎上山的logo就是rocksdb...
    小東_16d3閱讀 9,077評論 3 10
  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理琼梆,服務發(fā)現(xiàn),斷路器窿吩,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 我快把手機里每個軟件翻來覆去看五遍了茎杂,然而我還是不知道要做什么! 所以我決定給自己設置階段性目標纫雁,人生在世蛉顽,總得找...
    孔七二閱讀 383評論 0 0
  • 從今天開始我們分幾次聊聊互聯(lián)網(wǎng)創(chuàng)業(yè)者需要修煉和掌握的領導力框架。 在互聯(lián)網(wǎng)時代先较,重在控制和教條的管理思維對創(chuàng)業(yè)有百...
    hmisty閱讀 336評論 0 0