天天看點

分布式系統之中心副本控制協定(Primary-secondary協定)

最近又把之前接觸過一段時間的分布式系統及相關算法拾了起來,繼續研究研究。大體将分布式涉及的一些基本原理及算法進行了了解掌握之後,又沿着從簡到繁的次序依次記錄了下來。

1. 副本協定

簡單來講,副本控制協定是按照指定的流程控制副本資料進行讀寫行為的協定,使副本滿足一定的可用性和一緻性要求的分布式協定。一般來說,副本協定需要滿足:容錯性、可用性和一緻性(強一緻性、會話一緻性、最終一緻性)。

按照副本協定是否含有中心節點,可将協定劃分為兩大類:“中心化副本控制協定”和“去中心化副本控制協定”。

2. 中心副本控制協定 (Primary-secondary協定)

基本思路:由一個中心節點協調副本資料的更新、維護副本之間的一緻性。所有的副本相關的控制交由中心節點完成,将分布式并發控制問題轉化為一個單機并發控制問題,需要解決“寫寫”、“讀寫”等并發沖突。總所周知,中心化的分布式系統存在單點故障問題,系統的可用性依賴于中性化節點,當中心節點異常,系統将整體不可用。

接下來,我們介紹一種常用的Primary-secondary中性化副本控制協定,在後面的關于Quorum的文章中,我們還會提及到該協定。

Primary-secondary協定中副本被分為兩大類,其中僅有一個副本作為primary副本,其他為secondary副本。其協定需要解決四大問題:

資料更新流程、資料讀取方式、Primary副本的确定和切換、資料同步

2.1 資料更新流程

1. 資料更新由primary節點協調完成。
2. 外部節點将更新操作發給primary節點
3. primary節點進行并發控制(确定并發更新操作先後順序)
4. primary節點将更新操作發送給secondary節點
5. primary根據secondary節點的執行情況決定是都更新成功并傳回外部節點
           

在實踐當中,primary節點将同時發送N個副本給secondary,出口帶寬僅為總帶寬1/N,primary節點成為了系統吞吐瓶頸。為了解決這個問題,在一些系統(GFS,HDFS)中,使用接力的方式同步資料,即primary将更新發送給第一個secondary副本,該secondary副本發送給下一個secondary副本,以此類推。(該處就是HDFS中資料分發模型的使用原因)

2.2 資料讀取方式

針對最終一緻性,系統讀取任意副本都可以滿足需求。

針對會話一緻性,系統可以為副本設定版本号,每次更新對版本号進行遞增操作,使用者讀取副本時驗證版本号,進而保證使用者讀到的資料單調遞增。

Primary-secondary較難實作強一緻性,下面介紹幾種解決方案:

1. 始終隻讀primary副本,secondary不提供讀服務,可以實作強一緻性。

此處所說的primary實作中副本與機器并不綁定,而是将資料分段,以資料段為機關維護副本,将primary副本分散到叢集中。

例: 資料分為資料段a,b,c,每個資料段有2個副本,僅有一個primary副本,有3台機器X、Y、Z。那麼資料段配置設定可以為:X【a(primary),b】、Y【b(primary),c】、Z【c(primary)、a】

2. 由primary控制節點secondary節點的可用性。當primary更新secondary副本不成功時,primary将該secondary副本标記為不可用,進而使用者不再讀取該不可用副本。在一個确定的時間,某secondary副本要麼更新到與primary一緻的狀态,要麼被标記為不可用。這種方式依賴于一個中心中繼資料管理系統,記錄副本的狀态資訊。

3. 基于Quorum機制選擇primary,這部分内容将在另一篇文章中介紹。

2.3 Primary副本的确定和切換

切換副本的難點有兩個方面:

1. 如何确定primary節點是一個異常節點
2. 切換primary如何不影響副本的一緻性(保證新舊primary副本保持一緻)
           

針對問題1,将在另一篇文章中介紹基于Lease機制的确定節點狀态方法;針對問題2,同樣也在另一篇文章中介紹基于Quorum機制确定新primary的方法。

分布式系統中發現節點異常需要一定的探測時間,該時間一般為10秒級别(利用Lease機制确定節點狀态);是以,primary-backup類副本協定的最大缺點就是primary副本切換帶來的停服務問題。

2.4 資料同步

primary-secondary協定一般都會遇到secondary副本與primary不一緻的問題。

該問題可能由以下三種狀況導緻:

1. 由于網絡分化異常,secondary上的資料落後于primary上的資料
2. secondary上的資料有可能是髒資料,需要被丢棄
3. secondary是新增加的副本,沒有資料
           

針對第一種狀況,可以通過回放primary記錄檔進行實作,進而使節點狀态達到一緻;針對第二種情況,通常從設計階段就盡量避免分布式協定産生髒資料,如果一定存在髒資料,可以直接丢棄髒資料副本,然後将問題轉化為第三種情況;針對第三種情況,可以使用檢查點或者快照方式較快速完成同步,然後通過日志方式與目前副本狀态達成一緻。

在這一篇文章中,我們大體介紹了Primary-secondary協定,并針對其四大問題進行了依次解決,部分問題的解決方案放到了後面的文章進行細緻的講述。

參考:

  • 《分布式系統原理介紹》

繼續閱讀