2018 年更新:
Mysql High Availability使用paxos: https ://mysqlhighavailability.com/the-king-is-dead-long-live-the-king-our-homegrown-paxos-based-consensus/
现实世界的例子:
Cassandra 使用 Paxos来确保连接到不同集群节点的客户端可以通过在写入操作中添加“IF NOT EXISTS”来安全地执行写入操作。Cassandra 没有主节点,因此可以在多个节点上同时发出两个冲突的操作。当使用 if-not-exists 语法时,使用 paxos 算法对机器之间的操作进行排序,以确保只有一个成功。然后,客户端可以使用它来存储具有到期租约的权威数据。只要大多数 Cassandra 节点启动,它就会工作。因此,如果您将密钥空间的复制因子定义为 3,则 1 个节点可能会失败,如果是 5,则 2 个节点可能会失败,依此类推。
对于正常写入,Caassandra 允许不同节点接受多个冲突的写入,这些节点可能暂时无法通信。在这种情况下,不使用 Paxos,因此当同一键同时发生两次写入时,可能会丢失数据。Cassandra 内置了特殊的数据结构,不会丢失仅插入的数据。
扑克和 Paxos:
正如其他答案所指出的,扑克是回合制的并且有规则。如果您允许一个主服务器和多个副本,那么主服务器仲裁下一个操作。假设用户首先单击“检查”按钮,然后改变主意并单击“折叠”。这些是相互冲突的命令,只有第一个应该被接受。浏览器不应该让他们按下第二个按钮,当他们按下第一个按钮时它将禁用它。由于涉及金钱,主服务器也应该执行规则,并且每回合只允许每位玩家执行一项操作。当主人在游戏中崩溃时,问题就来了。哪个副本可以成为主副本,您如何强制只有一个副本成为主副本?
处理选择新主服务器的一种方法是使用外部强一致性服务。我们可以使用 Cassandra为主节点创建租约。副本可以在主服务器上超时并尝试获取租约。由于 Cassandra 使用 Paxos,因此它具有容错性;即使 Cassandra 节点崩溃,您仍然可以读取或更新租约。
在上面的例子中,扑克大师和副本最终是一致的。主服务器可以发送心跳,以便副本知道它们仍然连接到主服务器。这是快的,因为消息在一个方向流动。当主服务器崩溃时,副本中可能会出现争用条件,试图成为主服务器。在那个时候使用 Paxos 可以让您始终如一地确定哪个节点现在是主节点的结果。这需要节点之间的额外消息来确保单个主节点的共识结果。