3.4 漫畫分布式共識算法
?? 人物介紹
- 小明:對分布式共識算法好奇的開發者
- 架構師老王:分布式系統專家,精通各種共識算法
?? 共識算法概述
小明:“老王,分布式系統中為什么需要共識算法?”
架構師老王:“想象一下,你有多個服務器需要就某個決定達成一致,比如選出一個領導者,或者確認一個事務是否提交。在網絡不可靠、節點可能故障的環境下,如何保證所有正常節點能達成一致呢?這就是共識問題!”
共識算法的核心問題
分布式系統挑戰|+-----------------+-----------------+| | |網絡分區 節點故障 拜占庭故障(Network (Crash (ByzantinePartition) Failure) Failure)| | |消息延遲/丟失 節點宕機 惡意節點
?? Paxos算法詳解
小明:“聽說Paxos是最經典的共識算法?”
架構師老王:“沒錯!Paxos是Lamport在1990年提出的,雖然理解起來比較復雜,但它是很多其他算法的基礎。”
Paxos基本概念
/*** Paxos角色定義*/
public class PaxosRoles {// 提議者 - 提出提案public static class Proposer {private int proposalId;private String value;public void prepare(Set<Acceptor> acceptors) {// Phase 1: Prepare階段proposalId = generateUniqueId();for (Acceptor acceptor : acceptors) {PrepareResponse response = acceptor.receivePrepare(proposalId);// 處理響應...}}public void accept(Set<Acceptor> acceptors, String proposalValue) {// Phase 2: Accept階段for (Acceptor acceptor : acceptors) {acceptor.receiveAccept(proposalId, proposalValue);}}}// 接受者 - 接受提案public static class Acceptor {private int maxProposalId = -1;private int acceptedProposalId = -1;private String acceptedValue = null;public PrepareResponse receivePrepare(int proposalId) {if (proposalId > maxProposalId) {maxProposalId = proposalId;return new PrepareResponse(true, acceptedProposalId, acceptedValue);}return new PrepareResponse(false, -1, null);}public AcceptResponse