面试题答案
一键面试Paxos协议核心设计理念
- 基于多数派决策:Paxos协议通过让超过半数的节点达成一致来做出决策。这样即使部分节点出现故障,只要多数节点正常工作,系统依然能达成一致性。例如,在一个由5个节点组成的系统中,只要3个及以上节点同意某个值,这个值就会被选定。
- 多轮交互协商:协议通过多轮的消息交互,逐步达成一致。在每一轮中,提议者(Proposer)向接受者(Acceptor)发送提议,接受者根据一定规则决定是否接受提议。
- 安全性和活性:安全性保证一旦某个值被选定,后续不会再选定其他值;活性则确保只要有足够多的节点正常工作,最终能选定一个值。
解决分布式一致性问题的方式
- 提议的提出:提议者生成一个带有编号的提议,提议中包含要确定的值。提议者会向所有接受者发送Prepare请求,请求中包含提议编号。
- Prepare阶段:接受者接收到Prepare请求后,如果提议编号大于它已经响应过的所有Prepare请求的编号,就会回复一个Promise消息,承诺不再接受编号小于该提议编号的提议,并告知提议者它已经接受过的编号最大的提议(如果有)。
- Accept阶段:提议者收到多数接受者的Promise回复后,根据Promise消息中的信息决定提议的值(如果有接受过的提议,则选择其中编号最大的提议的值;否则可自由选择提议的值),然后向这些接受者发送Accept请求,请求中包含提议编号和选定的值。
- 接受提议:接受者接收到Accept请求,如果提议编号不小于它已经响应过的Prepare请求的编号,就会接受该提议,并向所有学习者(Learner)发送Accepted消息。
- 学习选定值:学习者接收到多数接受者的Accepted消息后,就可以确定被选定的值。
简单分布式场景中Paxos协议运行流程示例
假设存在一个简单的分布式系统,由3个节点A、B、C组成,要通过Paxos协议确定一个字符串值。
- 提议提出:提议者(假设是节点A)生成提议编号为1,值为“Hello”,向节点B和C发送Prepare(1)请求。
- Prepare阶段:节点B和C接收到Prepare(1)请求,由于这是它们第一次收到Prepare请求,都回复Promise(1, null)给节点A,承诺不再接受编号小于1的提议,且目前没有接受过任何提议。
- Accept阶段:节点A收到节点B和C的Promise回复后,发送Accept(1, “Hello”)请求给节点B和C。
- 接受提议:节点B和C接收到Accept(1, “Hello”)请求,由于提议编号1符合要求,都接受该提议,并向所有学习者(这里节点A、B、C既是提议者、接受者,也是学习者)发送Accepted(1, “Hello”)消息。
- 学习选定值:节点A、B、C都接收到多数(2个)的Accepted(1, “Hello”)消息,从而确定被选定的值为“Hello” 。