目錄
- 啟動流程
- 選舉主節(jié)點(diǎn)
- 選舉集群元信息
- allocation 過程
- 主分片
- 副分片
- index recovery
- 主分片 recovery
- 副分片 recovery
- 參考文獻(xiàn)
- 目前大部分內(nèi)容參考自elasticsearch 集群啟動流程
流程圖
啟動流程
選舉主節(jié)點(diǎn)
主要思路是對節(jié)點(diǎn) ID 排序,取最大值做 master罢防,每個節(jié)點(diǎn)都運(yùn)行這個流程晃跺。由此產(chǎn)生三個制約條件:
- 參選人數(shù)需要過半缺猛,達(dá)到quorum后就選出了臨時的主哼勇。為什么是臨時的?每個節(jié)點(diǎn)運(yùn)行排序取最大值的算法,結(jié)果不一定相同。舉個栗子澎嚣,集群有5臺主機(jī),節(jié)點(diǎn) ID 分別是:1瘟芝,2,3褥琐,4锌俱,5.當(dāng)產(chǎn)生網(wǎng)絡(luò)分區(qū)或者節(jié)點(diǎn)啟動速度差異較大,節(jié)點(diǎn)1 看到的節(jié)點(diǎn)列表是:1敌呈,2贸宏,3,4磕洪,選出4吭练;節(jié)點(diǎn)2看到的節(jié)點(diǎn)列表:2,3析显,4鲫咽,5,選出5。結(jié)果就不一致了由此產(chǎn)生第二條限制分尸。
- 得票數(shù)須過半锦聊。某節(jié)點(diǎn)被選為主,須判斷加入他的節(jié)點(diǎn)數(shù)過半箩绍,才確認(rèn) master 身份孔庭。解決第一個問題。
- master 節(jié)點(diǎn)材蛛,當(dāng)探測到節(jié)點(diǎn)離開事件圆到,須判斷當(dāng)前節(jié)點(diǎn)數(shù)是否過半。如果不到quorum卑吭,則放棄 master 身份芽淡,重新加入集群。如果不這么做陨簇,有可能導(dǎo)致腦裂吐绵。這樣的話沒有一個節(jié)點(diǎn)會接受索引或搜索的請求,讓所有的客戶端馬上發(fā)現(xiàn)這個問題河绽。
選舉集群元信息
master節(jié)點(diǎn)讓各節(jié)點(diǎn)把其各自存儲的元信息發(fā)過來己单,根據(jù)版本號確定最新的元信息,然后把這個信息廣播下去耙饰,這樣纹笼,集群的所有節(jié)點(diǎn)都有了最新的元信息。
- 為了集群一致性苟跪,參與選舉的元信息數(shù)量需要過半廷痘,Master 發(fā)布集群信息是的成功規(guī)則也是過半。
- 在選舉過程中件已,不接受新節(jié)點(diǎn)的加入請求笋额。集群元信息選舉完畢后,Master 發(fā)布首次集群狀態(tài)篷扩,然后開始選舉 shard 級元信息兄猩。當(dāng)分配主分片時,主節(jié)點(diǎn)檢查磁盤中存儲的 allocation ID 是否會在集群狀態(tài)in-sync allocations 集合中出現(xiàn)鉴未,只有在這個集合中找到了枢冤,此分片才有可能被選為主分片。如果活躍副本中的主分片掛了铜秆,in-sync 集合中的活躍分片會被提升為主分片淹真,確保集群的寫入可用性不變
allocation 過程
主分片
master向所有節(jié)點(diǎn)發(fā)起分片請求,Master 等待所有的請求返回回來连茧,正常情況下他有就有了這個 shard 的信息核蘸,然后根據(jù)某種策略(主節(jié)點(diǎn)在選擇哪個節(jié)點(diǎn)作為主分片方面有很大的靈活性巍糯,會將集群均衡和其他約束如分片感知及過濾器考慮在內(nèi))選一個分片做主。
- 給每個 shard 都設(shè)置一個 UUID值纱,然后在集群級的元信息中記錄鳞贷,哪個 shard 是最新的,因?yàn)?es 是先寫主分片虐唠,再由主分片節(jié)點(diǎn)轉(zhuǎn)發(fā)請求去寫副分片搀愧,所以主分片所在節(jié)點(diǎn)肯定是最新的,如果他轉(zhuǎn)發(fā)失敗了疆偿,就要求 Master 刪除那個節(jié)點(diǎn)咱筛。
- es5中,主分片是通過集群級元信息中記錄的“最新主分片的列表”來確定主分片的:匯報(bào)信息中存在杆故,并且這個表中也存在迅箩。
選副分片
主分片選舉完成后,從上一個過程匯總的 shard 信息中選擇一個副本做副分片处铛。如果匯總信息中不存在饲趋,分配一個全新副本的操作依賴延遲配置項(xiàng)決定。
index.unassigned.node_left.delayed_timeout
索引恢復(fù)
主分片索引恢復(fù)(非阻塞)
主分片的 recovery 不會等待其副分片分配成功才開始 recovery撤蟆,這些未刷盤數(shù)據(jù)可以從 translog 恢復(fù)奕塑,每次刷盤完畢,translog 都會被清空家肯,因此把 translog 中的數(shù)據(jù)全部重放龄砰,建立 lucene 索引,如此完成主分片的 recovery讨衣。
副分片索引恢復(fù)(非阻塞)
副分片需要恢復(fù)成與主分片一致换棚,同時,恢復(fù)期間允許新的索引操作反镇。因此在主分片所在節(jié)點(diǎn)固蚤,調(diào)用 lucene 接口把 shard 做快照。從主分片恢復(fù)到副本分片主要有兩個階段(在主分片節(jié)點(diǎn)執(zhí)行):
- 對比分段信息,如果 syncid 相同且 doc 數(shù)量相同,則跳過歹茶,否則復(fù)制整個分段
- 將當(dāng)前 translog 做快照,發(fā)送所有的 translog operation 到對端節(jié)點(diǎn),不限速
問題關(guān)注
- 分片完整性 第一階段執(zhí)行期間如果 lucene commit夕玩,清除 translog 怎么辦,translog 模塊被修改為支持多個文件,同時引入 translog.view 的概念辆亏,創(chuàng)建 view 可以獲取到后續(xù)的所有操.
- 數(shù)據(jù)一致性, 新增過程中同時副本數(shù)據(jù)在恢復(fù),寫流程中做異常處理,通過版本號來過濾掉過期操作