RocksDB系列四:MANIFEST

??RocksDB對(duì)文件系統(tǒng)和存儲(chǔ)介質(zhì)是不可知的禁悠。文件系統(tǒng)的操作不是原子的刮便,所以很有可能在系統(tǒng)故障時(shí)導(dǎo)致不一致讹蘑。即使打開了日志記錄功能,文件系統(tǒng)也不能在unclean restart時(shí)保證一致性功偿。POSIX文件系統(tǒng)也不支持批量操作的原子性盆佣。所以,在RocksDB重啟時(shí)械荷,不能依靠存儲(chǔ)在RocksDB data store file中的元信息來重建啟動(dòng)前的一致性狀態(tài)共耍。
??RocksD有一個(gè)內(nèi)建的機(jī)制來克服POSIX文件系統(tǒng)的各種限制,這種機(jī)制就是通過一個(gè)MANIFEST文件記錄RocksDB狀態(tài)改變的所有事物日志吨瞎。所以痹兜,MANIFEST文件可以在DB重啟時(shí)恢復(fù)到最近一次的一致性狀態(tài)。

  • MANIFEST
    記錄RocksDB狀態(tài)改變的所有transction log的一種機(jī)制
  • Manifest log
    一個(gè)單獨(dú)的文件关拒,記錄了RocksDB狀態(tài)的snapshot和edit log
  • CURRENT
    最新最近的manifest log

how does it work?

??MANIFEST是RocksDB狀態(tài)變更的transction log 記錄佃蚜。MANIFEST包含 manifest log文件和最新的manifest 文件指針庸娱。Manifest logs是滾動(dòng)的日子文件,命名為MANIFEST-(序列號(hào)谐算,遞增)熟尉。CURRENT是一個(gè)特殊的文件用于指定latest manifest log 文件。
??在系統(tǒng)啟動(dòng)或者重啟時(shí)洲脂,latest manifest log文件包含了RocksDB的一致性狀態(tài)斤儿。RocksDB后續(xù)的所有變更記錄都寫入這個(gè)manifest log 文件。當(dāng)一個(gè)manifest log 文件超過了固定大小時(shí)恐锦,一個(gè)新的manifest文件會(huì)被創(chuàng)建往果,這個(gè)新的文件是基于當(dāng)前DB的snapshot。CURRENT中的最新manifest 文件指針會(huì)更新一铅,同時(shí)sync到文件系統(tǒng)中陕贮。一旦成功寫入CURRENT file,冗余的manifest log文件會(huì)被清除潘飘。

MANIFEST = { CURRENT, MANIFEST-<seq-no>* } 
CURRENT = File pointer to the latest manifest log
MANIFEST-<seq no> = Contains snapshot of RocksDB state and subsequent modifications

Version Edit

??RocksDB在特定時(shí)間的特定狀態(tài)會(huì)關(guān)聯(lián)一個(gè)version肮之。針對(duì)version的任何改動(dòng)都被視為一個(gè)version edit。version(or RocksDB state snapshot)是通過join 一連串的version-edit構(gòu)建起來卜录「昵埽總之,一個(gè)manifest log文件是一連串的version edits艰毒。

version-edit      = Any RocksDB state change
version           = { version-edit* }
manifest-log-file = { version, version-edit* }
                  = { version-edit* }

Version Edit Layout

?? Manifest log是一串version edit記錄筐高。version edit 記錄的類型是通過 edit number指定。

1丑瞧、Data Types

簡(jiǎn)單數(shù)據(jù)類型

VarX   - Variable character encoding of intX
FixedX - Fixed character encoding of intX

復(fù)雜數(shù)據(jù)類型

String - Length prefixed string data
+-----------+--------------------+
| size (n)  | content of string  |
+-----------+--------------------+
|<- Var32 ->|<-- n            -->|

2柑土、Version Edit Record Format

version edit record 使用下面的格式,解碼器通過Record ID來識(shí)別記錄類型嗦篱。

+-------------+------ ......... ----------+
| Record ID   | Variable size record data |
+-------------+------ .......... ---------+
<-- Var32 --->|<-- varies by type       -->

3冰单、Version Edit Record Types and Layout

根據(jù)對(duì)RocksDB的狀態(tài)變更的不同幌缝,有不同類型的edit record灸促。

  • Comparator edit record
Captures the comparator name

+-------------+----------------+
| kComparator | data           |
+-------------+----------------+
<-- Var32 --->|<-- String   -->|
  • Log number edit record
Latest WAL log file number

+-------------+----------------+
| kLogNumber  | log number     |
+-------------+----------------+
<-- Var32 --->|<-- Var64    -->|
  • Previous File Number edit record
Previous manifest file number

+------------------+----------------+
| kPrevFileNumber  | log number     |
+------------------+----------------+
<-- Var32      --->|<-- Var64    -->|
  • Next File Number edit record
Next manifest file number

+------------------+----------------+
| kNextFileNumber  | log number     |
+------------------+----------------+
<-- Var32      --->|<-- Var64    -->|
  • Last Sequence Number edit record
Last sequence number of RocksDB

+------------------+----------------+
| kLastSequence    | log number     |
+------------------+----------------+
<-- Var32      --->|<-- Var64    -->|
  • Max Column Family edit record
Adjust the maximum number of family columns allowed.

+---------------------+----------------+
| kMaxColumnFamily    | log number     |
+---------------------+----------------+
<-- Var32         --->|<-- Var32    -->|
  • Deleted File edit record
Mark a file as deleted from database.

+-----------------+-------------+--------------+
| kDeletedFile    | level       | file number  |
+-----------------+-------------+--------------+
<-- Var32     --->|<-- Var32 -->|<-- Var64  -->|
  • 新文件的edit record
    表明這個(gè)文件是新添加到數(shù)據(jù)庫中的,同時(shí)提供RocksDB元信息涵卵。
    ?a浴栽、File edit record with compaction information
+--------------+-------------+--------------+------------+----------------+--------------+----------------+----------------+
| kNewFile4    | level       | file number  | file size  | smallest_key   | largest_key  | smallest_seqno | largest_seq_no |
+--------------+-------------+--------------+------------+----------------+--------------+----------------+----------------+
|<-- var32  -->|<-- var32 -->|<-- var64  -->|<-  var64 ->|<-- String   -->|<-- String -->|<-- var64    -->|<-- var64    -->|

+-----------+---------------+-------+------------------+-------+--------------+
|kPathID ---| Path size(n)  | path  | kNeedCompaction  | 1     | value (0/1)  |
+-----------+---------------+-------+------------------+-------+--------------+
<- var32  ->|<-- var32   -->|<- n ->|<-- var32      -->|<- 1 ->|<-- 1      -->|

??b、File edit record backward compatible

+--------------+-------------+--------------+------------+----------------+--------------+----------------+----------------+
| kNewFile2    | level       | file number  | file size  | smallest_key   | largest_key  | smallest_seqno | largest_seq_no |
+--------------+-------------+--------------+------------+----------------+--------------+----------------+----------------+
<-- var32   -->|<-- var32 -->|<-- var64  -->|<-  var64 ->|<-- String   -->|<-- String -->|<-- var64    -->|<-- var64    -->|

??c轿偎、File edit record with path information

+--------------+-------------+--------------+-------------+-------------+----------------+--------------+
| kNewFile3    | level       | file number  | Path ID     | file size   | smallest_key   | largest_key  |
+--------------+-------------+--------------+-------------+-------------+----------------+--------------+
|<-- var32  -->|<-- var32 -->|<-- var64  -->|<-- var32 -->|<-- var64 -->|<-- String   -->|<-- String -->|
+----------------+----------------+
| smallest_seqno | largest_seq_no |
+----------------+----------------+
<-- var64     -->|<-- var64    -->|
  • Column family status edit record
Note the status of column family feature (enabled/disabled)

+------------------+----------------+
| kColumnFamily    | 0/1            |
+------------------+----------------+
<-- Var32      --->|<-- Var32    -->|
  • Column family add edit record
Add a column family

+---------------------+----------------+
| kColumnFamilyAdd    | cf name        |
+---------------------+----------------+
<-- Var32         --->|<-- String   -->|
  • Column family drop edit record
Drop all column family

+---------------------+
| kColumnFamilyDrop   |
+---------------------+
<-- Var32         --->|
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末典鸡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子坏晦,更是在濱河造成了極大的恐慌萝玷,老刑警劉巖嫁乘,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異球碉,居然都是意外死亡蜓斧,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門睁冬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來挎春,“玉大人,你說我怎么就攤上這事豆拨≈狈埽” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵施禾,是天一觀的道長(zhǎng)脚线。 經(jīng)常有香客問我,道長(zhǎng)弥搞,這世上最難降的妖魔是什么殉挽? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮拓巧,結(jié)果婚禮上斯碌,老公的妹妹穿的比我還像新娘。我一直安慰自己肛度,他們只是感情好傻唾,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著承耿,像睡著了一般冠骄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上加袋,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天凛辣,我揣著相機(jī)與錄音,去河邊找鬼职烧。 笑死扁誓,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚀之。 我是一名探鬼主播蝗敢,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼足删!你這毒婦竟也來了寿谴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤失受,失蹤者是張志新(化名)和其女友劉穎讶泰,沒想到半個(gè)月后咏瑟,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡痪署,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年响蕴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惠桃。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浦夷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辜王,到底是詐尸還是另有隱情劈狐,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布呐馆,位于F島的核電站肥缔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏汹来。R本人自食惡果不足惜续膳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望收班。 院中可真熱鬧坟岔,春花似錦、人聲如沸摔桦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邻耕。三九已至鸥咖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兄世,已是汗流浹背啼辣。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留御滩,地道東北人鸥拧。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像艾恼,于是被迫代替她去往敵國和親住涉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子麸锉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,694評(píng)論 0 3
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,448評(píng)論 0 13
  • 起因 前一段時(shí)間钠绍,在給用戶升級(jí) TiKV 并重啟的時(shí)候,突然爆出了大量 “Sst file size mismat...
    siddontang閱讀 4,779評(píng)論 1 8
  • 一個(gè)人走過的路花沉, 有時(shí)會(huì)走重復(fù)柳爽。 但不知道會(huì)走過多少次媳握! 一個(gè)人愛過多少次, 也許每次都...
    振泰和莉雅閱讀 191評(píng)論 0 0
  • 前天突然爬不起來了,去看醫(yī)生赵誓,一堆事兒出來了打毛,建議休息,吃中藥調(diào)理俩功。這兩天就干脆休息幻枉,什么也不做,但娃的踐行一刻都...
    燁媽閱讀 175評(píng)論 0 0