1. 程式人生 > 程式設計 >ES資料模型

ES資料模型

上篇我們分析了ES叢集是如何選主,簡單回顧一下就是優化了Bully演演算法,從而試圖避免出現資料不一致,那麼今天我們繼續分析資料是如何在叢集中儲存的。
我們知道ES的資料副本是基於主從模式的,即一個資料分片包含了一個主分片和多個副本分片,那麼主從模式是怎麼工作的呢?繼續往下看。

幾個術語

在介紹ES的主從模式之前,我們需要先了解幾個關鍵的術語:

  • Replica Group: 一個互為副本的資料集合稱為副本組。副本組裡面只有一個副本是主資料(Primary),其他事從資料(Secondary)。
  • Configuration : 配置資訊描述了一個副本組有哪些副本,Primary是誰,在哪個節點上面等資訊。
  • Configuration Version:配置資訊版本號,每次發生變更時會遞增。
  • Serial Number:代表寫操作順序,每次寫操作都會遞增,由主副本維護,簡稱SN。
  • Prepared List:寫操作的準備序列,儲存來自外部請求的列表,將請求按照SN排序,向列表中加入的寫操作的SN必須大於已有的最大SN,每個副本上面都有一個Prepared List
  • Committed List :寫操作的提交系列。

資料寫入流程

寫入流程概述起來就是所有的請求都會路由到主分片上,然後再進行副本同步,詳細的步驟如下:

  1. 客戶端寫請求到達協調節點,然後經過初步的校驗,然後將請求路由到主分片上面;
  2. 到達主分片後,會再次進行驗證,然後在主分片上面執行寫請求;
  3. 操作成功後,主分片會把請求併發的同步到所有的in-syn的副本分片上;
  4. 主副本等所有的副本分片寫操作成功並回復,然後返回給協調節點;
  5. 協調節點收到回覆後再給客戶端回覆。

以上就是正常的寫入流程,那麼思考一下,整個流程中如果發生故障應該怎麼處理呢?

  • 主分片異常 如果主分片發生異常,那麼主分片會把寫請求告知到Master節點,Master會把請求重新路由到新的主分片上面。
  • 副本分片異常 如果副本分片發生異常,那麼主分片首先會向Master進行確認,Master會將這個異常的分片從in-sync-replica中移除,然後告知主分片,後期Master會指導新建新的副本分片,並進行資料同步。

主分片和副本分片的資料同步

這裡就簡單的介紹一下主備模式的資料副本策略

  1. 寫請求到達主節點後,會生成一個SN(寫入序列號,可以理解為事務ID),然後通過SN構造一個UpdateRequest,將這個UpdateRequest存入自己本地的prepare list
  2. 將UpdateRequest傳送到從節點,從節點收到後同樣先插入到prepare list,然後回覆ACK給主節點;
  3. 主節點收到所有的從節點回復後,然後將此UpdateRequest發放入committed list,同時committed list後移一位;
  4. 主節點向所有的從節點傳送commit請求,告訴他們當前committed list的位置,然後從節點對此進行同步

經過以上4步,就能基本保證主備資料的一致性

主備之間的異常檢測

租約機制: 主副本定期向備副本獲取租約
可能出現的異常及解決方式:

  1. 如果主節點在一定時間(lease period)內未收到來自某個副本節點的租約回覆,則告訴配置管理器(Master),將其移除,同時自己也將降級,不在作為主節點;
  2. 如果副本節點在一定時間(grace period)內沒有收到來自主節點的租約請求,則告訴配置管理器,將主節點移除,然後將自己提升為主節點,多個從節點競爭提升則哪個先執行成功,哪個從節點就提升為主節點

理論上講,在沒有時鐘漂移的情況下,只要grace period >= lease period 就會保證,主節點先感知到租約失效,因此保證了新主節點生成時,舊主節點已經失效,不會出現腦裂現象。

這些在ES中的體現:

主備節點就是ES中的主副分片
配置管理器就是ES中的Master節點
prepare list 對應local checkpoint 
committed list 對應 global checkpoint

ES中每個副本都有一個本地操作序列號和全域性操作序列號,主分片負責全域性操作序列號的推進,本地維護本地操作序列號
複製程式碼

最後

以上就是對ES資料模型的簡單分析了,後面會將圖文補上。