ceph mon中的paxos應用

2021-08-17 21:28:49 字數 1192 閱讀 5376

最近聽到分布式系統中用paxos的地方不少,比如最近螞蟻金服的oceanbase都提到使用了paxos,而筆者最近也在可以理解paxos和其工程使用,注意到ceph中的mon元件也是用paxos來實現mon集群的一致性,所以閱讀和分析了其**,但本文僅僅分析paxos類本身的**,至於paxos持久化日誌的底層實現,以及mon上層的業務類如何使用paxos,這個是後續的工作。

最開始,幾個mon啟動起來,並且建立連線之後,會開始競選leader,其實paxos協議是允許多個leader,但在系統正常的情況下,沒有必要有多個leader,多個leader各自執行自己的流程,會增加整個系統的負載。而競選的主要依據就是每個mon都有乙個全域性唯一的數字rank,所以這個數字中肯定存在最小的,競選的流程類似於paxos協商值時候的prepare階段,rank最小的mon會競選成功成為leader,不成功的就是peon。

然後就可以對外面提過來的value或者之前嘗試commit過的value進行協商,commit了。

需要說明的是:

為了系統的可靠性,在發出op_collect和op_begin之後,leader都會設定超時器,來超時重試。

peon上的lease_timeout超時器,如果超時,會認為之前的leader死亡,會清除執行中的一些臨時變數,重新發起選舉和初始化。所以leader需要定時傳送op_lease訊息,更新peon的lease time。

leader和peon會持久化一些訊息過程中幾個重要的值,比如accepted_pn, first_committed,last_committed等,用來:

1) 執行過程中需要一些資料,比如peon需要比較accepted_pn來決定是不是要accept新的pn(proposer number),

而這些資料是應該被持久化的。

2) 在重試或者mon重啟之後,恢復之前協商中但沒有commit的值。

3)leader根據peon返回的first_committed,last_committed,來確定是不是需要把一些已經記錄了日誌

但沒有commit的值,commit掉,或者把peon上面連日誌都沒有但已經被大多數accept的值同步給peon。

paxos工程中的運用 multi paxos

上篇介紹了paxos的理論知識 要在實際工程運用大多數使用multi paxos協議,原因是樸素paxos每次提議都執行完整paxos協議代價過大 3次網路互動,2 次本地持久化,因此,multi paxos引入leader概念,較少paxos的prepare互動,較少樸素paxos每次提議互動過多...

Spring中transaction的應用

spring框架的事務基礎架構 將預設地 只 在丟擲執行時和unchecked exceptions時才標識事務回滾 當出現異常,都可以進行回滾,可以在catch塊中使用下面一行 這種方法是手工進行設定事務回滾 transactionaspectsupport.currenttransactions...

Spring中FactoryBean的應用

factorybean介面定義了以下3個介面方法 object getobject 返回有factorybean建立的bean例項,如果issingleton 返回true,則該例項會放到spring容器的單例項快取池中。boolean issingleton 確定由factorybean建立bea...