今天和大家分享的是一個中小型分布式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):
圖示如下:
注冊服務(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è)置索引流程:
- 僅寫庫捆愁。
刪除索引流程:
- 對于軟刪除,寫標(biāo)志窟却。
- 對于硬刪除昼丑,刪對應(yīng)索引項,如果索引項全部為空夸赫,清除記錄菩帝。
獲取索引流程:
- 讀庫,組織響應(yīng)茬腿。
安排索引流程:
- 對存活的dbnode節(jié)點(diǎn)按disk排序呼奢,返回指定的個數(shù),并組織響應(yīng)切平。
設(shè)置數(shù)據(jù)服務(wù)器負(fù)載流程:
- 僅更新內(nèi)存表握础。
獲取數(shù)據(jù)服務(wù)器負(fù)載表流程:
- 讀取內(nèi)存表,組織響應(yīng)悴品。
多點(diǎn)同步流程:
- 略禀综。
數(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流程:
- 寫庫。
- 同步向索引服務(wù)器寫索引梢夯。
- 若索引寫入失敗言疗,則刪庫。
- 返回結(jié)果颂砸。
小概率異常:若第2步返回失敗噪奄,第3步停電,數(shù)據(jù)有多沾凄。
解決辦法:建一個binlog文件梗醇,處理原子異常。
讀KV流程:
- 讀庫撒蟀。
- 如果讀取失敗叙谨,同步向索引服務(wù)器刪除索引。
- 返回結(jié)果保屯。
刪KV流程:
- 刪庫手负。
- 同步向索引服務(wù)器刪除索引。
- 返回結(jié)果姑尺。
上報負(fù)載流程:
- 定時上報disk竟终、cpu負(fù)載。
訪問服務(wù)器:
訪問服務(wù)器不涉及存儲切蟋,是純邏輯服務(wù)器统捶。
接口列表:
寫KV
命令格式:setkv key value
讀KV
命令格式:getkv key
刪KV
命令格式:delkv key
寫KV流程:
- 訪問服務(wù)器接收setkv key value請求。
- 訪問服務(wù)器向索引服務(wù)器同步詢問getidx key。
- 索引服務(wù)器查詢key的索引記錄喘鸟,取出dbnodeid列表匆绣,列表按time降序、cpu升序什黑,排除非存活的節(jié)點(diǎn)崎淳。
- 訪問服務(wù)器接收返回結(jié)果,如果列表為空愕把,或者列表數(shù)量太小如1拣凹,訪問服務(wù)器可以再向索引服務(wù)器同步詢問安排索引planidx key 3。
- 索引服務(wù)器考慮dbnode節(jié)點(diǎn)的disk恨豁、cpu嚣镜,給出建議的dbnodeid列表,但排除非存活的節(jié)點(diǎn)圣絮。
- 訪問服務(wù)器接收返回結(jié)果祈惶,向這些數(shù)據(jù)服務(wù)器列表發(fā)起setkv key value請求(建議并發(fā),如果不好弄扮匠,串行也可以)。
- 每個數(shù)據(jù)服務(wù)器接收setkv key value請求凡涩,先寫存儲棒搜,再寫索引,串行進(jìn)行活箕,若失敗則回滾力麸,返回操作結(jié)果。
- 訪問服務(wù)器接收返回結(jié)果育韩,統(tǒng)計寫入成功的數(shù)量克蚂,并根據(jù)策略決定最終操作結(jié)果,響應(yīng)給請求者筋讨。
讀KV流程:
- 訪問服務(wù)器接收getkv key請求埃叭。
- 訪問服務(wù)器向索引服務(wù)器同步詢問getidx key。
- 索引服務(wù)器查詢key的索引記錄悉罕,取出dbnodeid列表赤屋,列表按time降序、cpu升序壁袄,排除非存活的節(jié)點(diǎn)类早。
- 訪問服務(wù)器接收返回結(jié)果,如果列表為空嗜逻,返回失敗給請求者涩僻。
- 非空,訪問服務(wù)器繼續(xù)向列表順序串行向數(shù)據(jù)服務(wù)器發(fā)起getkv key請求。
- 數(shù)據(jù)服務(wù)器接收getkv key請求逆日,讀存儲嵌巷,可能找不到或異常,返回操作結(jié)果屏富。
- 訪問服務(wù)器接收返回結(jié)果晴竞,并轉(zhuǎn)發(fā)給請求者。
刪KV流程:
- 訪問服務(wù)器接收delkv key請求狠半。
- 訪問服務(wù)器向索引服務(wù)器同步詢問getidx key噩死。
- 索引服務(wù)器查詢key的索引記錄,取出dbnodeid列表神年,列表按time降序已维、cpu升序,但不排除非存活的節(jié)點(diǎn)已日。
- 訪問服務(wù)器接收返回結(jié)果垛耳,如果列表為空,返回成功給請求者飘千。
- 非空堂鲜,訪問服務(wù)器繼續(xù)按列表順序串行向數(shù)據(jù)服務(wù)器串行發(fā)起delkv key請求。
- 每個數(shù)據(jù)服務(wù)器接收delkv key請求护奈,刪存儲缔莲,再硬刪索引,串行進(jìn)行霉旗,若失敗則回滾痴奏,返回操作結(jié)果。
- 訪問服務(wù)器收集結(jié)果厌秒,對操作失敗的節(jié)點(diǎn)執(zhí)行軟刪除秃嗜。
- 若執(zhí)行到這一步痢缎,訪問服務(wù)器總是返回成功被去。
校正服務(wù)器:
兩個功能:
- 對同一個key的多個dbnodeid更新時間差值太大的進(jìn)行校驗概疆。
- 對key下dbnodeid有軟刪除標(biāo)志的進(jìn)行索引進(jìn)行數(shù)據(jù)清理。
版本差值校正流程:
- 校正服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
- 索引服務(wù)器執(zhí)行開頭(區(qū)間)遍歷岛马,返回指定的個數(shù)索引信息棉姐。
- 校正服務(wù)器檢查每個key的索引時差,如果超過一定時間(如60S)啦逆,則判定為需要校正伞矩。
- 取出最新的那個dbnodeid和time,向有差值的數(shù)據(jù)服務(wù)器發(fā)起setkv key value time調(diào)用夏志。
軟刪除清理流程:
- 校正服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
- 索引服務(wù)器執(zhí)行開頭(區(qū)間)遍歷乃坤,返回指定的個數(shù)索引信息苛让。
- 校正服務(wù)器檢查每個key的軟刪除標(biāo)志,如果有湿诊,則向?qū)?yīng)的數(shù)據(jù)服務(wù)器發(fā)起delkv key調(diào)用狱杰。
均衡服務(wù)器:
主要用于自動遷移數(shù)據(jù),觸發(fā)條件:
- 某個數(shù)據(jù)服務(wù)器的disk占比超過平均值的20%厅须,需要往disk低于平均值最多的節(jié)點(diǎn)遷移仿畸。
- 某個數(shù)據(jù)的副本數(shù)低于3個,需要往disk低于平均值最多的節(jié)點(diǎn)遷移朗和。
- 某個數(shù)據(jù)的副本>=3個错沽,但是其中部分節(jié)點(diǎn)已經(jīng)明確不在系統(tǒng)中(即已被正式移除),需要往disk低于平均值最多的節(jié)點(diǎn)遷移眶拉。
自動遷移流程1:
- 均衡服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
- 均衡服務(wù)器向索引服務(wù)器同步詢問負(fù)載情況
- 均衡服務(wù)器檢查每個key的索引信息千埃,檢查是否有disk占比超過平均值20%的節(jié)點(diǎn),如果有忆植,找到disk占比最低的節(jié)點(diǎn)放可。
- 均衡服務(wù)器向待遷移的數(shù)據(jù)服務(wù)器讀取KV,并向目的寫入KV朝刊。
- 若上一步操作成功耀里,繼續(xù)刪除源的KV,若刪除失敗拾氓,寫soft刪除標(biāo)志备韧。
自動遷移流程2:
- 均衡服務(wù)器向索引服務(wù)器同步詢問seekidx ""/key 10000
- 均衡服務(wù)器檢查每個key的索引信息,首先檢查有效副本數(shù)痪枫,即如果副本的數(shù)據(jù)服務(wù)器已經(jīng)被移除,則先擦除這部分索引叠艳。
- 繼續(xù)檢查副本數(shù)奶陈,如果<3,則需要執(zhí)行遷移附较,即接下的兩步吃粒。
- 均衡服務(wù)器向待遷移的數(shù)據(jù)服務(wù)器讀取KV,并向目的寫入KV拒课。
- 若上一步操作成功徐勃,繼續(xù)刪除源的KV,若刪除失敗早像,寫soft刪除標(biāo)志僻肖。
總而言之,設(shè)計一個完整的健全的分布式存儲系統(tǒng)本身就是一個艱難的任務(wù)卢鹦,由于我的時間和精力有限臀脏,以上寫得比較基礎(chǔ),權(quán)當(dāng)讀者參考。