ES資料模型
阿新 • • 發佈:2019-12-31
上篇我們分析了ES叢集是如何選主,簡單回顧一下就是優化了Bully演演算法,從而試圖避免出現資料不一致,那麼今天我們繼續分析資料是如何在叢集中儲存的。
我們知道ES的資料副本是基於主從模式的,即一個資料分片包含了一個主分片和多個副本分片,那麼主從模式是怎麼工作的呢?繼續往下看。
幾個術語
在介紹ES的主從模式之前,我們需要先了解幾個關鍵的術語:
- Replica Group: 一個互為副本的資料集合稱為副本組。副本組裡面只有一個副本是主資料(Primary),其他事從資料(Secondary)。
- Configuration : 配置資訊描述了一個副本組有哪些副本,Primary是誰,在哪個節點上面等資訊。
- Configuration Version:配置資訊版本號,每次發生變更時會遞增。
- Serial Number:代表寫操作順序,每次寫操作都會遞增,由主副本維護,簡稱SN。
- Prepared List:寫操作的準備序列,儲存來自外部請求的列表,將請求按照SN排序,向列表中加入的寫操作的SN必須大於已有的最大SN,每個副本上面都有一個Prepared List
- Committed List :寫操作的提交系列。
資料寫入流程
寫入流程概述起來就是所有的請求都會路由到主分片上,然後再進行副本同步,詳細的步驟如下:
- 客戶端寫請求到達協調節點,然後經過初步的校驗,然後將請求路由到主分片上面;
- 到達主分片後,會再次進行驗證,然後在主分片上面執行寫請求;
- 操作成功後,主分片會把請求併發的同步到所有的in-syn的副本分片上;
- 主副本等所有的副本分片寫操作成功並回復,然後返回給協調節點;
- 協調節點收到回覆後再給客戶端回覆。
以上就是正常的寫入流程,那麼思考一下,整個流程中如果發生故障應該怎麼處理呢?
- 主分片異常 如果主分片發生異常,那麼主分片會把寫請求告知到Master節點,Master會把請求重新路由到新的主分片上面。
- 副本分片異常 如果副本分片發生異常,那麼主分片首先會向Master進行確認,Master會將這個異常的分片從in-sync-replica中移除,然後告知主分片,後期Master會指導新建新的副本分片,並進行資料同步。
主分片和副本分片的資料同步
這裡就簡單的介紹一下主備模式的資料副本策略
- 寫請求到達主節點後,會生成一個SN(寫入序列號,可以理解為事務ID),然後通過SN構造一個UpdateRequest,將這個UpdateRequest存入自己本地的prepare list
- 將UpdateRequest傳送到從節點,從節點收到後同樣先插入到prepare list,然後回覆ACK給主節點;
- 主節點收到所有的從節點回復後,然後將此UpdateRequest發放入committed list,同時committed list後移一位;
- 主節點向所有的從節點傳送commit請求,告訴他們當前committed list的位置,然後從節點對此進行同步
經過以上4步,就能基本保證主備資料的一致性
主備之間的異常檢測
租約機制: 主副本定期向備副本獲取租約
可能出現的異常及解決方式:
- 如果主節點在一定時間(lease period)內未收到來自某個副本節點的租約回覆,則告訴配置管理器(Master),將其移除,同時自己也將降級,不在作為主節點;
- 如果副本節點在一定時間(grace period)內沒有收到來自主節點的租約請求,則告訴配置管理器,將主節點移除,然後將自己提升為主節點,多個從節點競爭提升則哪個先執行成功,哪個從節點就提升為主節點
理論上講,在沒有時鐘漂移的情況下,只要grace period >= lease period 就會保證,主節點先感知到租約失效,因此保證了新主節點生成時,舊主節點已經失效,不會出現腦裂現象。
這些在ES中的體現:
主備節點就是ES中的主副分片
配置管理器就是ES中的Master節點
prepare list 對應local checkpoint
committed list 對應 global checkpoint
ES中每個副本都有一個本地操作序列號和全域性操作序列號,主分片負責全域性操作序列號的推進,本地維護本地操作序列號
複製程式碼
最後
以上就是對ES資料模型的簡單分析了,後面會將圖文補上。