深入淺出 Paxos 算法
前言
對於 paxos 算法,真的必須承認,是一個比較複雜且難懂的算法,所以其實寫這篇也是希望能夠通過這樣的方式,強迫自己多看些資料,逼自己看看能不能夠稍微理解下 paxos 的全貌。
paxos 算法在分布式領域有著非常重要的地位,但是,眾所皆知非常難懂,且在現實工程中更加難以實現。這篇就來看看 paxos 工作的原理和工作機制。
正文
什麼是 Paxos ?
Paxos 是一個基於消息傳遞,且具有高度容錯特性的一致性算法,應用於分布式領域的一致性問題。
問題背景
在分布式系統中,常見的問題像是機器當機或是網路延遲等問題都是有可能發生的。而 Paxos 算法就是希望能解決在問題發生的分布式系統中,能夠盡快在集群內部就一個值達成一致。
這裡說的值(value),不限於某個數。像是一條日誌,一條命令等等,在不同分布式場景下,值可以是不同的含意。
Paxos 三種角色
在 paxos 算法中,有三種角色:
- Proposer
- Acceptor
- Learner
在一個集群中,任何機器上的進程都可以同時充當多個角色。
這邊引進一個新的概念,提案(propose)。最終要達成一致的 value 就在 propose 中。
注:
- 暫且認為 提案 = value,即提案只包含 value。
- 暫且認為 proposer 可以直接提出提案。
Proposer 可以 propose 一個提案,而 Accepter 可以選擇接受或者拒絕一個提案,一旦某個提案被接受(chosen),該提案中的 value 就會被選中。
在前面提到,paxos 希望做到的就是對於某個 value 達成一致。所謂一致就是指 proposer, accepter, learner 都認為同一個 value 被 chosen。那麼就來看看,三種角色分別在怎樣的情況下可以認為一個 value 被 chosen。
-
Proposer
只要 propser 提出的提案被 acceptor 接受,就可以認為該提案中的那個 value 被 chosen。(下一節開始會先假設只要一個 acceptor 接受就可以,可是稍後就會發現要一半以上的 acceptor 接受) -
Acceptor
只要 acceptor 接受了某個提案,就可以認為該提案中的那個 value 被 chosen。 -
Learner
由 acceptor 告訴 learner 哪個 value 被 chosen,learner 就認為該 value 被 chosen。
在進入 paxos 算法的推導前,再提醒下: