raft+rocksdb實(shí)現(xiàn)秒級(jí)生成快照

背景

hugegraph使用jraft+rocksdb的checkpoint實(shí)現(xiàn)了快照栏豺,這樣能保證服務(wù)重啟或者有新節(jié)點(diǎn)加入時(shí)快速同步狀態(tài)機(jī)的數(shù)據(jù)困后。但是由于目前實(shí)現(xiàn)的只是多副本版,所以每一個(gè)服務(wù)都是存儲(chǔ)著全部的數(shù)據(jù)数冬。

當(dāng)服務(wù)導(dǎo)入較多數(shù)據(jù)后节槐,每生成一次快照耗時(shí)幾分鐘,再把快照壓縮又需要幾分鐘拐纱,在這期間占用了較多的CPU資源,并且隨著數(shù)據(jù)量的持續(xù)增長(zhǎng)哥倔,很容易出現(xiàn)上一次的快照還未生成完秸架,又要生成新一波的快照了。很容易導(dǎo)致服務(wù)不可用咆蒿。

在之前的一片文章《定位rocksdb生成快照慢問(wèn)題》中东抹,已經(jīng)提到:生成快照慢是因?yàn)楸4婵煺瘴募拇疟P(pán)和保存原始數(shù)據(jù)的盤(pán)不是同一個(gè)盤(pán),跨盤(pán)是不能進(jìn)行硬鏈接的沃测,所以rocksdb的checkpoint就走了copy file的分支缭黔,這樣自然就慢了。所以解決方法就是:將快照目錄設(shè)置為原始數(shù)據(jù)的兄弟目錄蒂破,這樣能保證是同一塊磁盤(pán)馏谨,checkpoint一定會(huì)走硬鏈接。

生成快照

優(yōu)化前保存快照的目錄結(jié)構(gòu)如下:

disk1/raftlog/snapshot/_128/ss.zip
                           /snapshot_meta
                           /ss/g/{md5}/sst,manifest,log
                              /m/{md5}/sst,manifest,log
                              /s/{md5}/sst,manifest,log

這里為什么會(huì)存在 md5 這一級(jí)目錄呢附迷?因?yàn)槊總€(gè)store(g/m/s)都可以配置多個(gè)數(shù)據(jù)目錄用來(lái)保存其不同類(lèi)型的數(shù)據(jù)惧互,比如對(duì)于 store g,vertex 和 edge 可以配置成不同的目錄喇伯,所以這里就會(huì)對(duì) vertex 和 edge 的目錄各自做 md5 運(yùn)算喊儡,然后加載的時(shí)候通過(guò)遍歷的方式進(jìn)行目錄匹配,代碼風(fēng)格實(shí)在是不太好稻据。

優(yōu)化后保存快照的目錄結(jié)構(gòu)如下:

# 原始數(shù)據(jù)目錄
disk1/rocksdb_data/g
                  /m
                  /s
# 對(duì)應(yīng)的快照目錄
disk1/snapshot_rocksdb_data/g
                           /m
                           /s

# 原始數(shù)據(jù)目錄
disk2/rocksdb_vertex/g
                    /m
                    /s
# 對(duì)應(yīng)的快照目錄
disk2/snapshot_rocksdb_vertex/g
                             /m
                             /s

結(jié)構(gòu)很清晰艾猜,就是在每一個(gè)原始數(shù)據(jù)目錄的父級(jí)目錄下,放置一個(gè)帶snapshot前綴的快照目錄捻悯,然后目錄內(nèi)部的結(jié)構(gòu)與原始數(shù)據(jù)目錄完全相同匆赃。這樣能保證快照目錄與原始數(shù)據(jù)目錄一定是同一個(gè)磁盤(pán)上的,能夠使用硬鏈接的方式快速生成快照秋度。

所以設(shè)置好快照目錄結(jié)構(gòu)后炸庞,代碼就很簡(jiǎn)單了,因?yàn)楹诵牡恼{(diào)用 checkpoint 的部分已經(jīng)實(shí)現(xiàn)過(guò)了荚斯,只需要將目錄的層級(jí)關(guān)系配置好即可埠居。具體實(shí)現(xiàn)中使用 Path 類(lèi)做相關(guān)的操作比用字符串或 File 都方便一些查牌。

加載快照

上面已經(jīng)實(shí)現(xiàn)了秒極生成快照,但還有一個(gè)問(wèn)題就是:如何加載快照滥壕?

為什么加載快照會(huì)成為一個(gè)問(wèn)題呢纸颜,直接把原始數(shù)據(jù)刪除,然后把快照目錄重命名為原始數(shù)據(jù)目錄不就可以了嗎绎橘?核心步驟當(dāng)然是這樣胁孙,但是這樣存在的一個(gè)問(wèn)題是:如果本次啟動(dòng)服務(wù)刪除了快照目錄,并且在下次生成快照前服務(wù)就宕掉了称鳞,那下次啟動(dòng)服務(wù)的時(shí)候可就沒(méi)有快照目錄供重命名了涮较。所以在raft模式下,不能在加載快照時(shí)把快照目錄刪除冈止。

既然不能刪除狂票,又必須得加載快照,怎么辦呢熙暴?很簡(jiǎn)單闺属,再做一次硬鏈接不就可以了嗎。

話不多說(shuō)周霉,看下面的示意圖即可掂器。

# 原始數(shù)據(jù)目錄
disk1/rocksdb_data/g
                  /g_link    <--------+ 
                  /m                  |
                  /m_link             |
                  /s                  |
                  /s_link             |
# 對(duì)應(yīng)的快照目錄                        |
disk1/snapshot_rocksdb_data/g  -------+
                           /m
                           /s

# 原始數(shù)據(jù)目錄
disk2/rocksdb_vertex/g
                    /g_link
                    /m
                    /m_link
                    /s
                    /s_link
# 對(duì)應(yīng)的快照目錄
disk2/snapshot_rocksdb_vertex/g
                             /m
                             /s

加載快照時(shí)的日志

2021-03-26 11:23:24 11696 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.raft.StoreStateMachine [] - The node 127.0.0.1:8281 start snapshot loading
2021-03-26 11:23:24 11896 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Delete origin data directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/m
2021-03-26 11:23:24 11903 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Move snapshot directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/m_link to /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/m
2021-03-26 11:23:24 11936 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStore [] - The store 'm' resume snapshot successfully
2021-03-26 11:23:24 11970 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Delete origin data directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/g
2021-03-26 11:23:24 11973 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Move snapshot directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/g_link to /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/g
2021-03-26 11:23:24 11989 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Delete origin data directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-vertex/g
2021-03-26 11:23:24 11991 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Move snapshot directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-vertex/g_link to /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-vertex/g
2021-03-26 11:23:24 11997 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStore [] - The store 'g' resume snapshot successfully
2021-03-26 11:23:24 12020 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Delete origin data directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/s
2021-03-26 11:23:24 12023 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStdSessions [] - Move snapshot directory /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/s_link to /Users/liningrui/IdeaProjects/baidu/xbu-data/hugegraph/node1/rocksdb-data/s
2021-03-26 11:23:24 12037 [JRaft-FSMCaller-Disruptor-0] [INFO ] com.baidu.hugegraph.backend.store.rocksdb.RocksDBStore [] - The store 's' resume snapshot successfully
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市俱箱,隨后出現(xiàn)的幾起案子国瓮,更是在濱河造成了極大的恐慌,老刑警劉巖匠楚,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巍膘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡芋簿,警方通過(guò)查閱死者的電腦和手機(jī)峡懈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)与斤,“玉大人肪康,你說(shuō)我怎么就攤上這事×么” “怎么了磷支?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)食寡。 經(jīng)常有香客問(wèn)我雾狈,道長(zhǎng),這世上最難降的妖魔是什么抵皱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任善榛,我火速辦了婚禮辩蛋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘移盆。我一直安慰自己悼院,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布咒循。 她就那樣靜靜地躺著据途,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叙甸。 梳的紋絲不亂的頭發(fā)上颖医,一...
    開(kāi)封第一講書(shū)人閱讀 49,031評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音蚁署,去河邊找鬼便脊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛光戈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播遂赠,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼久妆,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了跷睦?” 一聲冷哼從身側(cè)響起筷弦,我...
    開(kāi)封第一講書(shū)人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎抑诸,沒(méi)想到半個(gè)月后烂琴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜕乡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年奸绷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片层玲。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡号醉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辛块,到底是詐尸還是另有隱情畔派,我是刑警寧澤,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布润绵,位于F島的核電站线椰,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏尘盼。R本人自食惡果不足惜憨愉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一烦绳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧莱衩,春花似錦爵嗅、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至括细,卻和暖如春伪很,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奋单。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工锉试, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人览濒。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓呆盖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贷笛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子应又,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345

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

  • 0. 背景描述 測(cè)試 rocksdb 多副本版的導(dǎo)入時(shí)發(fā)現(xiàn) rocksdb 生成快照非常慢,其實(shí)一開(kāi)始還發(fā)現(xiàn)了一些...
    蘇黎世黃昏閱讀 729評(píng)論 0 0
  • 1savepoint checkpoint savepoint是checkpoint的一種特殊方式乏苦,手動(dòng)保...
    虎不知閱讀 2,428評(píng)論 0 0
  • ??Checkpoint是RocksDB的一個(gè)feature株扛,主要支持對(duì)當(dāng)前正在運(yùn)行的數(shù)據(jù)庫(kù)制作一個(gè)snapsho...
    薛少佳閱讀 9,545評(píng)論 2 3
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭汇荐,有人歡樂(lè)有人憂愁洞就,有人驚喜有人失落,有的覺(jué)得收獲滿(mǎn)滿(mǎn)有...
    陌忘宇閱讀 8,523評(píng)論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候掀淘,很多事情旬蟋,失敗、遺憾繁疤、錯(cuò)過(guò)咖为,源于不自信,不信任他人 覺(jué)得自己做不成稠腊,別人做不...
    吳氵晃閱讀 6,181評(píng)論 4 8