WTable:RocksDB使用技巧之分布式存儲擴容演進

1. 背景

RocksDB是由Facebook公司開源的一款高性能Key Value存儲引擎,目前被廣泛應用于業(yè)界各大公司的存儲產(chǎn)品中衩椒,其中就包括58存儲團隊自研的分布式KV存儲產(chǎn)品WTable斤蔓。

RocksDB基于LSM Tree存儲數(shù)據(jù)恒水,它的寫入都是采用即時寫WAL + Memtable培愁,后臺Compaction的方式進行监氢。當寫入量大時悬襟,Compaction所占用的IO資源以及對其讀寫的影響不容忽視衅码。而對于一個分布式存儲系統(tǒng)來說,擴展性尤為重要脊岳,但是在擴展的過程中逝段,又不可避免地會涉及到大量的數(shù)據(jù)遷移垛玻、寫入。

本篇文章將會著重介紹WTable是如何利用RocksDB的特性對擴容流程進行設計以及迭代的奶躯。

2. 數(shù)據(jù)分布

WTable為了實現(xiàn)集群的可擴展性帚桩,將數(shù)據(jù)劃分成了多個Slot,一個Slot既是數(shù)據(jù)遷移的最小單位嘹黔。當集群的硬盤空間不足或?qū)懶阅苄枰獢U展時账嚎,運維人員就可以添加一些機器資源,并將部分Slot遷移到新機器上儡蔓。這就實現(xiàn)了數(shù)據(jù)分片郭蕉,也就是擴容。

具體哪些數(shù)據(jù)被分到哪個Slot上喂江,這是通過對Key做Hash算法得到的召锈,偽算法如下:
SlotId = Hash(Key)/N 其中的N就是Slot的總量,這個是一個預設的固定值获询。

另外烟勋,為了讓同一個Slot中所有Key的數(shù)據(jù)在物理上能夠存儲在一起,底層實際存儲的Key都會在用戶Key的前面加上一個前綴:該Key對應的SlotId筐付。具體方式是將SlotId以大端法轉(zhuǎn)換成2個字節(jié),填充到Key字節(jié)數(shù)組的前面阻肿。

在RocksDB中瓦戚,除了level 0外,其余l(xiāng)evel中的sst文件丛塌,以及sst文件內(nèi)部都是有序存儲的较解。這樣一來,WTable也就實現(xiàn)了單個Slot內(nèi)數(shù)據(jù)的連續(xù)存儲赴邻,以及所有Slot整體的有序性印衔。

3. 初始擴容方式

WTable初始的擴容方式如下:

  1. 添加一個或多個機器資源,并搭建存儲服務節(jié)點姥敛。
  2. 制定遷移計劃奸焙,得到需要遷移的Slot及其節(jié)點信息的列表。
  3. 循環(huán)遷移每個Slot彤敛,遷移每個Slot的流程如下圖:

如上圖所示与帆,遷移一個Slot可以分成3個階段:全量遷移、增量遷移墨榄、路由信息切換玄糟。

其中全量遷移會在該Slot所在的老節(jié)點上創(chuàng)建一個RocksDB的Iterator,它相當于創(chuàng)建了一份數(shù)據(jù)快照袄秩,同時Iterator提供了seek阵翎、next等方法逢并,可以通過遍歷Iterator有序地獲取一定范圍內(nèi)的數(shù)據(jù)。對應到這里郭卫,就是一個Slot在某一時刻的全量快照數(shù)據(jù)砍聊。老節(jié)點通過遍歷Slot數(shù)據(jù),將每個Key箱沦,Value傳輸?shù)叫鹿?jié)點辩恼,新節(jié)點寫入到自己的RocksDB中。

增量遷移則會利用老WTable節(jié)點記錄的Binlog谓形,將全量遷移過程中新的寫入或更新灶伊,傳輸?shù)叫碌墓?jié)點,新節(jié)點將其應用到RocksDB寒跳。

最后聘萨,當發(fā)現(xiàn)新老節(jié)點上待遷移Slot的數(shù)據(jù)已經(jīng)追平之后,則在ETCD上修改該Slot對應的節(jié)點信息童太,也就是路由信息切換米辐。從此以后,該Slot中數(shù)據(jù)的線上服務就由新節(jié)點提供了书释。

4. 存在問題

然而翘贮,上述的擴容方式在線上運行過程中存在一個問題:當數(shù)據(jù)遷移速度較高(如30MB/s)時,會影響到新節(jié)點上的線上服務爆惧。

深究其具體原因狸页,則是由于一次擴容會串行遷移多個Slot,率先遷移完成的Slot在新節(jié)點上已經(jīng)提供線上服務扯再,而遷移后續(xù)的Slot還是會進行全量數(shù)據(jù)芍耘、增量數(shù)據(jù)的遷移。

通過上個章節(jié)的描述熄阻,我們可以得知斋竞,全量數(shù)據(jù)是用RocksDB Iterator遍歷產(chǎn)生,對于一個Slot來說秃殉,是一份有序的數(shù)據(jù)坝初。而增量數(shù)據(jù)則是線上實時寫入的數(shù)據(jù),肯定是無序的數(shù)據(jù)复濒。所以當新節(jié)點同時寫入這兩種數(shù)據(jù)時脖卖,從整體上就變成了無序的數(shù)據(jù)寫入。

在RocksDB中巧颈,如果某一個level N中的文件總大小超過一定閾值畦木,則會進行Compaction,Compaction所做的就是:將level N中的多個sst文件與這些文件在level N+1中Key范圍有重疊的文件進行合并砸泛,最終生成多個新文件放入level N+1中十籍。合并的方式可以簡單表述為:如果多個文件中的Key確實有交集蛆封,則按照規(guī)則進行歸并排序,去重勾栗,按大小生成多個新sst文件惨篱;如果Key沒有交集(說明這次合并,就沒有l(wèi)evel N+1中的文件參與)围俘,則直接將level N中的文件move到levelN+1砸讳。

這樣我們就可以看出,當大量的整體無序的數(shù)據(jù)寫入遷移新節(jié)點時界牡,各level之間的sst文件Key的范圍難免會重疊簿寂,而其上的RocksDB則會頻繁進行大量的,需要歸并排序宿亡、去重的Compaction(而不是簡單的move)常遂。這勢必會占用大量的IO,進而影響讀挽荠、寫性能克胳。

另外,Compaction過多圈匆、過重造成level 0層的文件無法快速沉淀到level 1漠另,而同時數(shù)據(jù)遷移使得新節(jié)點RocksDB的寫入速度又很快,這就導致level 0中的文件個數(shù)很容易就超過閾值level0_stop_writes_trigger跃赚,這時則會發(fā)生write stall酗钞,也就是停寫,這時就會嚴重影響寫服務来累。

5. 擴容方式演進

根據(jù)前面的問題描述,我們深入分析了RocksDB Compaction的特點窘奏,提出了兩點改進思路:

  1. 擴容過程中嘹锁,所有待遷移Slot的全量數(shù)據(jù)和增量數(shù)據(jù)要分開傳輸。
    當大量的有序數(shù)據(jù)寫入RocksDB時着裹,由于多個sst文件之間领猾,完全不會出現(xiàn)Key存在交集的情況,所以其進行的Compaction只是move到下一個level骇扇,這個速度很快摔竿,而且占用IO極少。所以我們利用這一點少孝,選擇把所有Slot的全量數(shù)據(jù)放在一起遷移继低,這期間不會有增量數(shù)據(jù)的打擾,在整體上可以看做是有序的數(shù)據(jù)稍走。這就使得在遷移速度很快的時候袁翁,也不會占用大量的IO柴底。而增量數(shù)據(jù)畢竟是少數(shù),這個過程可以在全量數(shù)據(jù)傳輸完成后粱胜,以較慢的速度來傳輸柄驻。

  2. 考慮到大量數(shù)據(jù)傳輸可能會影響線上的服務質(zhì)量,所以我們決定不再采取每一個Slot數(shù)據(jù)傳輸完成后就使其提供線上服務的方案焙压,而是等所有Slot數(shù)據(jù)都遷移完成之后鸿脓,再統(tǒng)一提供服務。

根據(jù)以上分析涯曲,我們最終將擴容分為了3個大的階段:

  1. 全量數(shù)據(jù)遷移野哭;
  2. 增量數(shù)據(jù)遷移;
  3. 路由信息統(tǒng)一切換掀抹。

整體流程如下圖所示:

經(jīng)過上述擴容方式的改進虐拓,目前線上WTable集群已經(jīng)可以進行較高速的擴容,比如50~100MB/s傲武,并且在整個流程中不會對線上服務有任何影響蓉驹。

6. 其他

在制定方案之初,我們也調(diào)研過其他的方案揪利,比如老節(jié)點傳輸sst文件給新節(jié)點态兴,后者通過IngestExternalFile的方式將sst文件導入RocksDB。

但是WTable的主備同步是通過Binlog進行的疟位,而當主機通過IngestExternalFile的方式導入數(shù)據(jù)時瞻润,并不會有Binlog產(chǎn)生,也就無法通過正常流程同步數(shù)據(jù)給備機甜刻。因此如果以此方式實現(xiàn)數(shù)據(jù)遷移绍撞,需要增加新的主備同步方式,這對原有流程是一個破壞得院,另外也需要比較大的工作量傻铣,效率方面也無法保證。

因此我們最終利用RocksDB Compaction的特點設計了適合WTable的快速擴容方案祥绞,解決了這個痛點非洲。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蜕径,隨后出現(xiàn)的幾起案子两踏,更是在濱河造成了極大的恐慌,老刑警劉巖兜喻,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梦染,死亡現(xiàn)場離奇詭異,居然都是意外死亡朴皆,警方通過查閱死者的電腦和手機弓坞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進店門隧甚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人渡冻,你說我怎么就攤上這事戚扳。” “怎么了族吻?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵帽借,是天一觀的道長。 經(jīng)常有香客問我超歌,道長砍艾,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任巍举,我火速辦了婚禮脆荷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘懊悯。我一直安慰自己蜓谋,他們只是感情好,可當我...
    茶點故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布炭分。 她就那樣靜靜地躺著桃焕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪捧毛。 梳的紋絲不亂的頭發(fā)上观堂,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天,我揣著相機與錄音呀忧,去河邊找鬼师痕。 笑死,一個胖子當著我的面吹牛而账,可吹牛的內(nèi)容都是我干的七兜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼福扬,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了惜犀?” 一聲冷哼從身側(cè)響起铛碑,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虽界,沒想到半個月后汽烦,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡莉御,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年撇吞,在試婚紗的時候發(fā)現(xiàn)自己被綠了俗冻。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,953評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牍颈,死狀恐怖迄薄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情煮岁,我是刑警寧澤讥蔽,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站画机,受9級特大地震影響冶伞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜步氏,卻給世界環(huán)境...
    茶點故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一响禽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧荚醒,春花似錦芋类、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铺董,卻和暖如春巫击,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背精续。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工坝锰, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人重付。 一個月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓顷级,卻偏偏與公主長得像,于是被迫代替她去往敵國和親确垫。 傳聞我的和親對象是個殘疾皇子弓颈,可洞房花燭夜當晚...
    茶點故事閱讀 44,901評論 2 355

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

  • 最近項目中用到這個nb的玩意,所以就花時間研究了下删掀,同時整理下助自己記憶翔冀。這個猛虎上山的logo就是rocksdb...
    小東_16d3閱讀 9,080評論 3 10
  • 在先前我們討論了 RocksDB 的 statistics 和 write stall,但這些只能讓我們發(fā)現(xiàn)問題披泪,...
    siddontang閱讀 8,106評論 2 16
  • 桔妹導讀:Fusion 是滴滴自研的分布式 NoSQL 數(shù)據(jù)庫纤子,完全兼容 Redis 協(xié)議,支持超大規(guī)模數(shù)據(jù)持久化...
    滴滴技術閱讀 830評論 0 0
  • 今天出了考試成績,又一次涼涼了控硼,開始陷入對自己的深深懷疑中泽论。懷疑自己的能力,會害怕自己明年離開現(xiàn)在的單位后什么都做...
    孫小媛閱讀 167評論 0 0
  • 其實我特別不想提起你這么個爛人抄瓦。 你這個本應該活在亂葬崗里的爛人。 工作原因陶冷,和一起工作的妹妹聊到了愛情钙姊,又或者說...
    王卉卉閱讀 233評論 0 0