主题
Paxos 算法
Paxos 算法是基于消息传递的分布式一致性算法,很多大型的网络技术公司和开源框架都采用 Paxos 算法作为其各自的底层解决方案,比如 Chubby 、 Megastore 以及 MySQL Group Replication 。 Paxos 算法运行在服务器发生宕机故障的时候,能够保证数据的完整性,不要求可靠的消息传递,可容忍消息丢失、延迟、乱序以及重复,保证服务的高可用性。
底层实现
保证分布式系统下数据的一致性操作,本质是协调运行在不同的网络服务器上的线程服务,使这些服务就某一个特定的数据执行一致性的变更操作。在整个 Paxos 算法的实现过程中,将参与算法的集群中的全部服务器,分成三种角色:提议者(Proposer)、决策者(Acceptor)、决策学习者(Learner)。
三种角色
Paxos 通过协调不同服务器上的线程或服务,使它们就某个数据的变更操作达成一致。算法中,集群的服务器被分为以下三种角色:
提议者(Proposer)
提出提案(Proposal),包含提案编号(Proposal ID)和提议值(Value)。决策者(Acceptor)
接收提案并参与决策。一个提案需要获得超过半数 Acceptor 的认可才能被批准。学习者(Learner)
从 Proposer 和 Acceptor 学习已批准的提案,并同步状态。
在 Paxos 算法中,当处理来自客户端的事务性会话请求的过程时,首先会触发一个或多个服务器进程,就本次会话的处理发起提案。当该提案通过网络发送到集群中的其他角色服务器后,这些服务器会就该会话在本地的执行情况反馈给发起提案的服务器。发起提案的服务器会在接收到这些反馈信息后进行统计,当集群中超过半数的服务器认可该条事务性的客户端会话操作后,认为该客户端会话可以在本地执行操作。
Paxos 算法采用多副本的处理方式,即存在多个副本,每个副本分别包含提案者、决策者以及学习者。下图演示了三种角色的服务器之间的关系。
事务处理过程
Paxos 的运行分为三个阶段:提案准备阶段、事务处理阶段和数据同步阶段。
1. 提案准备阶段(Prepare Phase)
- Proposer 向所有 Acceptor 发送 Prepare 请求,附带提案编号。
- Acceptor 对请求做出响应:
- 如果编号比已处理的提案编号高,承诺(Promise)不再接受更低编号的提案,并返回已接受的提案(如果有)。
- 否则,拒绝该请求。
2. 事务处理阶段(Accept Phase)
- Proposer 根据准备阶段的反馈,选择提案值,并向 Acceptor 发送 Accept 请求。
- Acceptor 根据承诺决定是否接受提案:
- 如果提案编号符合之前的承诺,接受该提案。
- 否则,拒绝提案。
当提案获得超过半数 Acceptor 的批准后,提案被认为已被接受。
3. 数据同步阶段(Learn Phase)
- 已批准的提案由 Proposer 通知所有 Learner。
- Learner 从 Acceptor 获取最终决议,并同步数据,完成一致性处理。
总结
优点
- 强一致性:即使在节点故障或网络分区时,仍能保持一致性。
- 高容错性:容忍消息丢失、延迟和乱序等问题。
- 灵活性:支持动态扩展和节点变更。
缺点
- 实现复杂:逻辑设计和实现难度较大。
- 高延迟:多次通信增加了事务完成的时间。
Paxos 算法通过角色分工和阶段处理,在分布式系统中实现了可靠的数据一致性保障。尽管算法复杂,但其强一致性和容错能力使其成为分布式系统的核心解决方案之一。