一個中小型分布式KV數(shù)據(jù)庫的設(shè)計

今天和大家分享的是一個中小型分布式KV數(shù)據(jù)庫的設(shè)計染乌,數(shù)據(jù)容量定位于千萬至億級山孔,因為這個級別可以滿足大多數(shù)中小型互聯(lián)網(wǎng)企業(yè)的存儲需求,設(shè)計和開發(fā)者可以騰出手來荷憋,把高可用和高可運(yùn)維做為開發(fā)的核心台颠。

為什么十億或百億級的分布式系統(tǒng)不好做?

分布式存儲的思想就是切分,把一個大型的系統(tǒng)按照一定的組織關(guān)系切分成若干小塊串前,每一小塊存儲一部分?jǐn)?shù)據(jù)瘫里。對存儲分塊來說,分10塊和分1000塊理論上對于技術(shù)實(shí)現(xiàn)基本沒有區(qū)別荡碾,主要是運(yùn)營期的維護(hù)谨读,機(jī)器多了、數(shù)據(jù)量大了各種問題都會放大坛吁,因而很多大型互聯(lián)網(wǎng)巨頭在基礎(chǔ)支撐開發(fā)和運(yùn)維方面投入都非常大劳殖,高可用和高可運(yùn)維非常重要。

還有拨脉,如何組織這些分塊存儲哆姻,需要有一個映射關(guān)系,專業(yè)的說就是索引玫膀。對于一個億級以內(nèi)的系統(tǒng)填具,索引通常可以保存在一個節(jié)點(diǎn)或者說單臺主機(jī)匆骗,并且做到一條記錄一個索引劳景,不用考慮其他的分片規(guī)則。目前主要有兩種分片規(guī)則:哈希和范圍碉就,無論是哪一種盟广,后期數(shù)據(jù)規(guī)模大了需要遷移或者拆分的時候,一定會施加很多約束瓮钥,這個暫且不講吧筋量。我們先粗略計算一下,如果采用靈活的一對一索引碉熄,1億條記錄需要的存儲容量桨武。以每條索引占100字節(jié)計,1億條索引就是100 * 100M = 10G锈津,這無論是做硬盤索引還是內(nèi)存索引都是可以接受的呀酸。當(dāng)然考慮到性能,通常會把索引加載到內(nèi)存中琼梆。

現(xiàn)在讓我們再考慮下百億級系統(tǒng)性誉,索引無論如何是單臺主機(jī)無法放得下的,這時有兩種方向可以考慮:一是壓縮索引茎杂,即前面講的哈希和范圍错览,二是索引也分塊,按一定的規(guī)則把索引分布存儲在不同的索引服務(wù)器中煌往,很顯然這個問題又復(fù)雜化了倾哺。

業(yè)界內(nèi)評價高可用系統(tǒng)有一個著名的CAP理論,即一致性、可用性羞海、分區(qū)容災(zāi)忌愚。前面我們一直在講可用性,一致性應(yīng)該也涵蓋了一部分扣猫,但分區(qū)容災(zāi)需要以多副本為前提菜循,也就是說無論是數(shù)據(jù)和索引都需要多個備份。個人認(rèn)為申尤,開發(fā)一個穩(wěn)定的系統(tǒng)癌幕,光數(shù)據(jù)分布和備份已是十分不易,若索引也分布和備份昧穿,開發(fā)量和復(fù)雜度可想而知勺远,故本文暫不考慮十億級系統(tǒng)。

設(shè)計指標(biāo):

在設(shè)計系統(tǒng)之前时鸵,我們先大致定義下系統(tǒng)的設(shè)計指標(biāo):

存儲容量:5000W級
并發(fā)訪問:5000次/S
系統(tǒng)擴(kuò)容:彈性擴(kuò)充胶逢,自動均衡
故障維護(hù):低度人工介入
機(jī)器要求:10臺以內(nèi)

關(guān)于5000W級記錄所需要的存儲容量,這個跟所存儲的數(shù)據(jù)類型有關(guān)饰潜,如果是普通的用戶記錄數(shù)據(jù)初坠,按每條10K計,需要的硬盤為500G彭雾,而如果是存儲圖片或小視頻碟刺,以每個10M計,需要的硬盤為500T薯酝。兩者對于機(jī)器的要求區(qū)別還是非常大的半沽,相差了整整1000倍。

關(guān)于并發(fā)訪問的性能吴菠,同樣的這里我只能暫且以用戶記錄來估計者填,若存儲服務(wù)器分布于3臺機(jī)器,每臺服務(wù)器可平均負(fù)載2000次/S做葵,并且支持存儲服務(wù)器彈性擴(kuò)充性能占哟。但如果是圖片或小視頻的訪問,訪問一次需要的時間和流量以及系統(tǒng)負(fù)載都非常大蜂挪,如果不使用CDN的話重挑,廣域網(wǎng)純粹依靠數(shù)據(jù)庫系統(tǒng)本身,應(yīng)該性能非常低棠涮。

關(guān)于系統(tǒng)擴(kuò)容,系統(tǒng)需要考慮單機(jī)性能瓶勁刺覆,當(dāng)存儲或CPU出現(xiàn)負(fù)載不足時严肪,支持?jǐn)U充新的機(jī)器加入以擴(kuò)展性能。一個低可維護(hù)的系統(tǒng),需要停止業(yè)務(wù)或者是部分停機(jī)驳糯,由運(yùn)維人員手動遷移數(shù)據(jù)到新的機(jī)器上篇梭,然后再恢復(fù)業(yè)務(wù)。我們這里的設(shè)計要求是酝枢,運(yùn)維人員只需要簡單的對機(jī)器進(jìn)行配置恬偷,剩下的數(shù)據(jù)遷移工作由系統(tǒng)自動完成,整個過程不停機(jī)帘睦,用戶訪問不受影響袍患。

關(guān)于故障維護(hù),出現(xiàn)單機(jī)故障竣付,在人工不干預(yù)的情況下诡延,仍能提供服務(wù)。單機(jī)故障期間古胆,其業(yè)務(wù)訪問由其他主機(jī)接管肆良,故障恢復(fù)后,數(shù)據(jù)同步自動進(jìn)行逸绎,且基本不影響正常訪問惹恃。

關(guān)于機(jī)器要求評估,考慮到分區(qū)容災(zāi)棺牧,以存儲普通的記錄計巫糙,暫定10臺以內(nèi),具體布署要看整體的系統(tǒng)設(shè)計情況陨帆。

系統(tǒng)設(shè)計:

總體架構(gòu):

圖示如下:


image.png
注冊服務(wù)器:

注冊服務(wù)器主要提供整個分布式系統(tǒng)的服務(wù)器感知功能曲秉,它的功能包括:
a) 管理服務(wù)器注冊
b) 維護(hù)活躍的服務(wù)器列表
c) 提供服務(wù)器列表的查詢

技術(shù)選型:
a) 選擇開源軟件,如zookeeper疲牵、consul承二、etcd,不同的軟件對開發(fā)的技術(shù)棧和標(biāo)準(zhǔn)不一樣纲爸,需要架構(gòu)師根據(jù)自己團(tuán)隊的實(shí)際情況進(jìn)行選擇亥鸠。
b) 自研,其實(shí)就是造輪子识啦,這對于研發(fā)實(shí)力和資金雄厚的團(tuán)隊可以考慮负蚊,好處就是完全Hold得住,缺點(diǎn)也比較明顯颓哮,短時間內(nèi)功能和穩(wěn)定性肯定不如上面的幾款知名開源軟件家妆。

性能和可靠性:
a) 對于中小型系統(tǒng)來說,通常邏輯服務(wù)器的節(jié)點(diǎn)數(shù)在百以內(nèi)冕茅,性能一般不會成為瓶勁伤极。
b) 可靠性比較重要蛹找,通常可以容忍短時間內(nèi)的故障哨坪,這時整個系統(tǒng)不能注冊新服務(wù)庸疾,也不能做服務(wù)器存活狀態(tài)的廣播,除注冊服務(wù)器外的個別的服務(wù)器故障也應(yīng)該在系統(tǒng)的容錯范圍內(nèi)当编,但長時間不恢復(fù)的話一亙故障服務(wù)器的數(shù)量達(dá)到一定級別届慈,系統(tǒng)將不再可用。

索引服務(wù)器:

索引服務(wù)器在一些系統(tǒng)中又稱為主服務(wù)器忿偷,需考慮以下設(shè)計:
a) 維護(hù)關(guān)鍵字到數(shù)據(jù)服務(wù)器的映射金顿。
b) 維護(hù)數(shù)據(jù)服務(wù)器的負(fù)載狀態(tài)。
c) 對外提供關(guān)鍵字到數(shù)據(jù)服務(wù)器的查詢牵舱。

技術(shù)選型:
通常沒有現(xiàn)成的索引服務(wù)器可用串绩,必須自研。索引服務(wù)器的組成包括兩大部分:核心存儲和外圍邏輯芜壁。核心存儲的開發(fā)比較復(fù)雜礁凡,可選擇成熟的技術(shù)方案,如mysql慧妄、leveldb等等顷牌。外圍邏輯包括數(shù)據(jù)服務(wù)器負(fù)載的存儲,但通常保存在內(nèi)存中即可塞淹。其它就是接口的設(shè)計和支持窟蓝。

性能和可靠性:
a) 索引服務(wù)器作為實(shí)際數(shù)據(jù)尋址的關(guān)鍵紐帶,通常情況下每一次讀寫操作饱普,首先都需要向索引服務(wù)器發(fā)起關(guān)鍵字查詢定位运挫,若索引服務(wù)器的性能出現(xiàn)瓶勁,則整個系統(tǒng)的性能將受到限制套耕。
b) 可靠性非常重要谁帕,基本不容忍故障,出現(xiàn)故障必須能夠快速隔離或恢復(fù)冯袍,這對于嚴(yán)重依賴人為干預(yù)的系統(tǒng)來說匈挖,基本上達(dá)不到要求。所以必須在設(shè)計上充分考慮高可用性康愤。
c) 索引數(shù)據(jù)必須有多個副本儡循,索引服務(wù)器也必須以集群形式存在,不必多個節(jié)點(diǎn)同時提供服務(wù)征冷,但必須做到主點(diǎn)出現(xiàn)故障時择膝,快速自動切換備點(diǎn)。

數(shù)據(jù)服務(wù)器:

數(shù)據(jù)服務(wù)器主要管理核心數(shù)據(jù)的存儲检激,需考慮以下設(shè)計:
a) 管理核心數(shù)據(jù)的存儲调榄。
b) 當(dāng)數(shù)據(jù)發(fā)生更新時踊赠,必須及時同步到索引服務(wù)器呵扛。
c) 定期向索引服務(wù)器報告cpu每庆、disk等負(fù)載狀態(tài)。
d) 支持?jǐn)?shù)據(jù)遷移今穿,支持自動彈性擴(kuò)充缤灵。

技術(shù)選型:
同索引服務(wù)器一樣,沒有現(xiàn)成的開源可用蓝晒,必須自研腮出。同樣的組成包括核心存儲和外圍邏輯兩部分,核心存儲也選擇成熟的技術(shù)方案芝薇,如mysql胚嘲、leveldb等等。

性能和可靠性:
a) 數(shù)據(jù)服務(wù)器通常是集群整體提供服務(wù)洛二,單點(diǎn)的性能通常不會成為整體性能的瓶勁馋劈。
b) 數(shù)據(jù)服務(wù)器通常是對等布署,節(jié)點(diǎn)之間弱交互晾嘶,即除了數(shù)據(jù)遷移時有交互外妓雾,通常不直接交互。
c) 數(shù)據(jù)也必須是多副本垒迂,且多副本同時提供服務(wù)械姻,短時間內(nèi)單個節(jié)點(diǎn)的故障不會對系統(tǒng)造成影響,但長時間的故障必須人工干預(yù)机断,移除故障節(jié)點(diǎn)補(bǔ)入新的節(jié)點(diǎn)楷拳。

訪問服務(wù)器:

訪問服務(wù)器主要對外提供讀寫訪問操作,需考慮以下設(shè)計:
a) 對外支持核心數(shù)據(jù)的增刪改查操作吏奸。
b) 訪問發(fā)生時欢揖,首先查詢索引服務(wù)器取得關(guān)鍵字的數(shù)據(jù)服務(wù)器列表,然后根據(jù)列表苦丁,如果是讀操作浸颓,則逐一去讀取,直到讀取成功旺拉,如果是寫操作产上,則并行發(fā)起寫入,并收集響應(yīng)蛾狗,可根據(jù)策略決定收集到多少響應(yīng)才算成功晋涣。

技術(shù)選型:
訪問服務(wù)器相對來說比較勁量,應(yīng)該基本不存在借用開源方案了沉桌。

性能和可靠性:
a) 訪問服務(wù)器是一層薄薄厚厚的代理谢鹊,單點(diǎn)性能的好壞取決于工程的設(shè)計算吩。
b) 訪問服務(wù)器基本可以說無狀態(tài),單點(diǎn)性能不夠時可以布署新的節(jié)點(diǎn)佃扼。
c) 單點(diǎn)故障基本對服務(wù)沒有影響偎巢。

校正服務(wù)器:

校正服務(wù)器的主要功能為:
由于系統(tǒng)支持更新操作,同一個關(guān)鍵字的多個數(shù)據(jù)副本有一定概率存在版本不一致的問題兼耀,需要有一定的機(jī)制發(fā)現(xiàn)并修正這種錯誤压昼。

性能和可靠性:
a) 性能的高低對系統(tǒng)沒有絕對的影響,但更高的性能使系統(tǒng)的全庫檢查周期更短瘤运。
b) 可以單點(diǎn)窍霞,也可以集群工作,但集群工作時應(yīng)避免重復(fù)對同一個關(guān)鍵字執(zhí)行檢查拯坟。

均衡服務(wù)器:

均衡服務(wù)器主要用于解決:
a) 各數(shù)據(jù)服務(wù)器的數(shù)據(jù)存儲量由于數(shù)據(jù)的不均衡性或其他原因造成較大分布不均但金,需要有一種機(jī)制進(jìn)行數(shù)據(jù)位置調(diào)度。
b) 當(dāng)現(xiàn)有數(shù)據(jù)服務(wù)器的數(shù)據(jù)存儲量超過警戒水位時郁季,需要增加新的服務(wù)器冷溃,此時也要進(jìn)行數(shù)據(jù)的遷移調(diào)度。

性能和可靠性:
a) 同樣的巩踏,性能的高低對系統(tǒng)沒有絕對的影響秃诵,但更高的性能使系統(tǒng)的遷移速度更快,更容易達(dá)到數(shù)量平衡塞琼。
b) 可以單點(diǎn)菠净,也可以集群工作,但集群工作時應(yīng)避免重復(fù)對同一個關(guān)鍵字執(zhí)行遷移彪杉。

服務(wù)器設(shè)計:

索引服務(wù)器:

簡單方案:
使用mysql做核心存儲毅往,數(shù)據(jù)備份依靠mysql主從同步。
索引服務(wù)器單點(diǎn)布署派近,故障發(fā)生時攀唯,人工介入切主從,切索引服務(wù)器渴丸。

復(fù)雜方案:
使用leveldb做核心存儲侯嘀,數(shù)據(jù)備份需要自研。
采用paxos主從選舉方案谱轨,3點(diǎn)互備戒幔,主從同步,故障自動切換土童。

索引記錄格式:
key -> dbnodeid1,datatime1,flag;dbnodeid2,datatime2,flag;dbnodeid3,datatime3,flag;
flag取值:
0 - 正常
1 - 刪除中诗茎,即已發(fā)起刪除操作,但未得到dbnodeid確認(rèn)献汗。

數(shù)據(jù)服務(wù)器內(nèi)存負(fù)載表:
dbnodeid1 -> cpu, disk
dbnodeid2 -> cpu, disk
dbnodeid3 -> cpu, disk

接口列表:
設(shè)置索引
命令格式:setidx key dbnodeid
刪除索引
命令格式:delidx key dbnodeid soft/hard
說明:soft軟刪除由訪問服務(wù)器調(diào)用敢订,表示打上刪除標(biāo)記王污。hard由數(shù)據(jù)服務(wù)器調(diào)用,表示完成刪除楚午。
獲取(批量)索引
命令格式:getidx key1,key2,key3,......
說明:返回的dbnodeid列表昭齐,列表分兩個子列表:存活的列表和非存活的列表,其中存活的列表按time降序醒叁、cpu負(fù)載升序司浪。
安排索引
命令格式:planidx key 3
說明:什么時候出現(xiàn)安排索引?當(dāng)新的kv寫入系統(tǒng)時把沼,get key返回空,這時需要plan key給到計劃的dbnodeid節(jié)點(diǎn)列表吁伺。返回的列表應(yīng)排除非存活的節(jié)點(diǎn)饮睬,并且按disk、cpu升序篮奄。
遍歷索引
命令格式:seekidx key/null 10000
設(shè)置數(shù)據(jù)服務(wù)器負(fù)載
命令格式:setload dbnodeid cpu disk
獲取數(shù)據(jù)服務(wù)器負(fù)載表
命令格式:getloads

設(shè)置索引流程:

  1. 僅寫庫捆愁。

刪除索引流程:

  1. 對于軟刪除,寫標(biāo)志窟却。
  2. 對于硬刪除昼丑,刪對應(yīng)索引項,如果索引項全部為空夸赫,清除記錄菩帝。

獲取索引流程:

  1. 讀庫,組織響應(yīng)茬腿。

安排索引流程:

  1. 對存活的dbnode節(jié)點(diǎn)按disk排序呼奢,返回指定的個數(shù),并組織響應(yīng)切平。

設(shè)置數(shù)據(jù)服務(wù)器負(fù)載流程:

  1. 僅更新內(nèi)存表握础。

獲取數(shù)據(jù)服務(wù)器負(fù)載表流程:

  1. 讀取內(nèi)存表,組織響應(yīng)悴品。

多點(diǎn)同步流程:

  1. 略禀综。
數(shù)據(jù)服務(wù)器:

mysql存儲方案:
使用mysql表來存儲kv,不需要做主從同步苔严。
數(shù)據(jù)的多副本由寫流程完成定枷。
數(shù)據(jù)的均衡遷移或故障備份由均衡流程完成。

redis存儲方案:
使用redis來存儲kv邦蜜,需要做持久化依鸥,不需要做主從同步。
數(shù)據(jù)的多副本由寫流程完成悼沈。
數(shù)據(jù)的均衡遷移或故障備份由均衡流程完成贱迟。

leveldb存儲方案:
使用leveldb來存儲kv姐扮,不需要做多點(diǎn)同步(因為不知道多點(diǎn))。
數(shù)據(jù)的多副本由寫流程完成衣吠。
數(shù)據(jù)的均衡遷移或故障備份由均衡流程完成茶敏。

binlog小文件存儲方案:
使用自研的binlog來存儲kv,不需要做多點(diǎn)同步(因為不知道多點(diǎn))缚俏。
需要做本地索引惊搏,用來定位kv的位置,可能不如leveldb來得方便忧换。
數(shù)據(jù)的多副本由寫流程完成恬惯。
數(shù)據(jù)的均衡遷移或故障備份由均衡流程完成。

文件系統(tǒng)存儲方案:
使用文件系統(tǒng)來存儲kv亚茬,不需要做多點(diǎn)同步(因為不知道多點(diǎn))酪耳。
使用文件系統(tǒng)路徑如 xx/xx/xx/xx/key 來定位kv的位置。
數(shù)據(jù)的多副本由寫流程完成刹缝。
數(shù)據(jù)的均衡遷移或故障備份由均衡流程完成碗暗。

接口列表:
寫KV
命令格式:setkv key value [time]
說明:指定time表示復(fù)制數(shù)據(jù)
讀KV
命令格式:getkv key
刪KV
命令格式:delkv key

寫KV流程:

  1. 寫庫。
  2. 同步向索引服務(wù)器寫索引梢夯。
  3. 若索引寫入失敗言疗,則刪庫。
  4. 返回結(jié)果颂砸。
    小概率異常:若第2步返回失敗噪奄,第3步停電,數(shù)據(jù)有多沾凄。
    解決辦法:建一個binlog文件梗醇,處理原子異常。

讀KV流程:

  1. 讀庫撒蟀。
  2. 如果讀取失敗叙谨,同步向索引服務(wù)器刪除索引。
  3. 返回結(jié)果保屯。

刪KV流程:

  1. 刪庫手负。
  2. 同步向索引服務(wù)器刪除索引。
  3. 返回結(jié)果姑尺。

上報負(fù)載流程:

  1. 定時上報disk竟终、cpu負(fù)載。
訪問服務(wù)器:

訪問服務(wù)器不涉及存儲切蟋,是純邏輯服務(wù)器统捶。

接口列表:
寫KV
命令格式:setkv key value
讀KV
命令格式:getkv key
刪KV
命令格式:delkv key

寫KV流程:

  1. 訪問服務(wù)器接收setkv key value請求。
  2. 訪問服務(wù)器向索引服務(wù)器同步詢問getidx key。
  3. 索引服務(wù)器查詢key的索引記錄喘鸟,取出dbnodeid列表匆绣,列表按time降序、cpu升序什黑,排除非存活的節(jié)點(diǎn)崎淳。
  4. 訪問服務(wù)器接收返回結(jié)果,如果列表為空愕把,或者列表數(shù)量太小如1拣凹,訪問服務(wù)器可以再向索引服務(wù)器同步詢問安排索引planidx key 3。
  5. 索引服務(wù)器考慮dbnode節(jié)點(diǎn)的disk恨豁、cpu嚣镜,給出建議的dbnodeid列表,但排除非存活的節(jié)點(diǎn)圣絮。
  6. 訪問服務(wù)器接收返回結(jié)果祈惶,向這些數(shù)據(jù)服務(wù)器列表發(fā)起setkv key value請求(建議并發(fā),如果不好弄扮匠,串行也可以)。
  7. 每個數(shù)據(jù)服務(wù)器接收setkv key value請求凡涩,先寫存儲棒搜,再寫索引,串行進(jìn)行活箕,若失敗則回滾力麸,返回操作結(jié)果。
  8. 訪問服務(wù)器接收返回結(jié)果育韩,統(tǒng)計寫入成功的數(shù)量克蚂,并根據(jù)策略決定最終操作結(jié)果,響應(yīng)給請求者筋讨。

讀KV流程:

  1. 訪問服務(wù)器接收getkv key請求埃叭。
  2. 訪問服務(wù)器向索引服務(wù)器同步詢問getidx key。
  3. 索引服務(wù)器查詢key的索引記錄悉罕,取出dbnodeid列表赤屋,列表按time降序、cpu升序壁袄,排除非存活的節(jié)點(diǎn)类早。
  4. 訪問服務(wù)器接收返回結(jié)果,如果列表為空嗜逻,返回失敗給請求者涩僻。
  5. 非空,訪問服務(wù)器繼續(xù)向列表順序串行向數(shù)據(jù)服務(wù)器發(fā)起getkv key請求。
  6. 數(shù)據(jù)服務(wù)器接收getkv key請求逆日,讀存儲嵌巷,可能找不到或異常,返回操作結(jié)果屏富。
  7. 訪問服務(wù)器接收返回結(jié)果晴竞,并轉(zhuǎn)發(fā)給請求者。

刪KV流程:

  1. 訪問服務(wù)器接收delkv key請求狠半。
  2. 訪問服務(wù)器向索引服務(wù)器同步詢問getidx key噩死。
  3. 索引服務(wù)器查詢key的索引記錄,取出dbnodeid列表神年,列表按time降序已维、cpu升序,但不排除非存活的節(jié)點(diǎn)已日。
  4. 訪問服務(wù)器接收返回結(jié)果垛耳,如果列表為空,返回成功給請求者飘千。
  5. 非空堂鲜,訪問服務(wù)器繼續(xù)按列表順序串行向數(shù)據(jù)服務(wù)器串行發(fā)起delkv key請求。
  6. 每個數(shù)據(jù)服務(wù)器接收delkv key請求护奈,刪存儲缔莲,再硬刪索引,串行進(jìn)行霉旗,若失敗則回滾痴奏,返回操作結(jié)果。
  7. 訪問服務(wù)器收集結(jié)果厌秒,對操作失敗的節(jié)點(diǎn)執(zhí)行軟刪除秃嗜。
  8. 若執(zhí)行到這一步痢缎,訪問服務(wù)器總是返回成功被去。
校正服務(wù)器:

兩個功能:

  1. 對同一個key的多個dbnodeid更新時間差值太大的進(jìn)行校驗概疆。
  2. 對key下dbnodeid有軟刪除標(biāo)志的進(jìn)行索引進(jìn)行數(shù)據(jù)清理。

版本差值校正流程:

  1. 校正服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
  2. 索引服務(wù)器執(zhí)行開頭(區(qū)間)遍歷岛马,返回指定的個數(shù)索引信息棉姐。
  3. 校正服務(wù)器檢查每個key的索引時差,如果超過一定時間(如60S)啦逆,則判定為需要校正伞矩。
  4. 取出最新的那個dbnodeid和time,向有差值的數(shù)據(jù)服務(wù)器發(fā)起setkv key value time調(diào)用夏志。

軟刪除清理流程:

  1. 校正服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
  2. 索引服務(wù)器執(zhí)行開頭(區(qū)間)遍歷乃坤,返回指定的個數(shù)索引信息苛让。
  3. 校正服務(wù)器檢查每個key的軟刪除標(biāo)志,如果有湿诊,則向?qū)?yīng)的數(shù)據(jù)服務(wù)器發(fā)起delkv key調(diào)用狱杰。
均衡服務(wù)器:

主要用于自動遷移數(shù)據(jù),觸發(fā)條件:

  1. 某個數(shù)據(jù)服務(wù)器的disk占比超過平均值的20%厅须,需要往disk低于平均值最多的節(jié)點(diǎn)遷移仿畸。
  2. 某個數(shù)據(jù)的副本數(shù)低于3個,需要往disk低于平均值最多的節(jié)點(diǎn)遷移朗和。
  3. 某個數(shù)據(jù)的副本>=3個错沽,但是其中部分節(jié)點(diǎn)已經(jīng)明確不在系統(tǒng)中(即已被正式移除),需要往disk低于平均值最多的節(jié)點(diǎn)遷移眶拉。

自動遷移流程1:

  1. 均衡服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
  2. 均衡服務(wù)器向索引服務(wù)器同步詢問負(fù)載情況
  3. 均衡服務(wù)器檢查每個key的索引信息千埃,檢查是否有disk占比超過平均值20%的節(jié)點(diǎn),如果有忆植,找到disk占比最低的節(jié)點(diǎn)放可。
  4. 均衡服務(wù)器向待遷移的數(shù)據(jù)服務(wù)器讀取KV,并向目的寫入KV朝刊。
  5. 若上一步操作成功耀里,繼續(xù)刪除源的KV,若刪除失敗拾氓,寫soft刪除標(biāo)志备韧。

自動遷移流程2:

  1. 均衡服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
  2. 均衡服務(wù)器檢查每個key的索引信息,首先檢查有效副本數(shù)痪枫,即如果副本的數(shù)據(jù)服務(wù)器已經(jīng)被移除,則先擦除這部分索引叠艳。
  3. 繼續(xù)檢查副本數(shù)奶陈,如果<3,則需要執(zhí)行遷移附较,即接下的兩步吃粒。
  4. 均衡服務(wù)器向待遷移的數(shù)據(jù)服務(wù)器讀取KV,并向目的寫入KV拒课。
  5. 若上一步操作成功徐勃,繼續(xù)刪除源的KV,若刪除失敗早像,寫soft刪除標(biāo)志僻肖。

總而言之,設(shè)計一個完整的健全的分布式存儲系統(tǒng)本身就是一個艱難的任務(wù)卢鹦,由于我的時間和精力有限臀脏,以上寫得比較基礎(chǔ),權(quán)當(dāng)讀者參考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揉稚,一起剝皮案震驚了整個濱河市秒啦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搀玖,老刑警劉巖余境,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異灌诅,居然都是意外死亡芳来,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進(jìn)店門延塑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绣张,“玉大人,你說我怎么就攤上這事关带〗暮” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵宋雏,是天一觀的道長芜飘。 經(jīng)常有香客問我,道長磨总,這世上最難降的妖魔是什么嗦明? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮蚪燕,結(jié)果婚禮上娶牌,老公的妹妹穿的比我還像新娘。我一直安慰自己馆纳,他們只是感情好诗良,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鲁驶,像睡著了一般鉴裹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上钥弯,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天径荔,我揣著相機(jī)與錄音,去河邊找鬼脆霎。 笑死总处,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绪穆。 我是一名探鬼主播辨泳,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼虱岂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了菠红?” 一聲冷哼從身側(cè)響起第岖,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎试溯,沒想到半個月后蔑滓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遇绞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年键袱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片摹闽。...
    茶點(diǎn)故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹄咖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出付鹿,到底是詐尸還是另有隱情澜汤,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布舵匾,位于F島的核電站俊抵,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏坐梯。R本人自食惡果不足惜徽诲,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望吵血。 院中可真熱鬧谎替,春花似錦、人聲如沸蹋辅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽晕翠。三九已至,卻和暖如春砍濒,著一層夾襖步出監(jiān)牢的瞬間淋肾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工爸邢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留樊卓,地道東北人。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓杠河,卻偏偏與公主長得像碌尔,于是被迫代替她去往敵國和親浇辜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評論 2 355

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