use*_*220 22 algorithm distributed consensus paxos
有人可以给我一份Paxos的实际用例列表.这是需要达成共识的真正问题,是更大问题的一部分.
以下是Paxos的用例吗?
假设有两个客户在扑克服务器上互相玩扑克.扑克服务器被复制.我对Paxos的理解是,它可以用来保持代表当前扑克之手的内存数据结构的一致性.也就是说,确保所有副本具有完全相同的内存状态.
但为什么Paxos必要?假设需要处理新卡.如果一切正常,运行相同代码的每个副本将生成相同的卡.为什么客户端不能从所有复制的服务器请求最新状态,并选择最多出现的卡.因此,如果一台服务器出现错误,客户端仍然可以通过选择多数来获得正确的状态.
Ezr*_*och 13
您假设所有服务器彼此同步(即,具有相同的状态),因此当服务器需要选择下一张卡时,每个服务器将选择完全相同的卡(假设您的代码是确定的).
但是,服务器的状态还取决于用户的操作.例如,如果用户决定加息50美元 - 您的服务器需要在某处存储该信息.现在,假设你的服务器对网络客户端回答"确定"(我假设一个基于网络的扑克游戏),然后服务器崩溃了.您的其他服务器可能没有关于50 $加注的信息,并且您的系统将不一致(从某种意义上说,客户认为50美元加价,而幸存的服务器不知道它).
请注意,多数人在这里没有帮助,因为数据丢失了.此外,假设主服务器加上另一个主服务器而不是主服务器崩溃,则获得了50美元的加注数据.在这种情况下,使用多数甚至可能更糟糕:如果您从两台服务器获得数据的响应,您将认为执行了50美元的加薪.但是如果其中一个失败了,那么你就不会占多数,而你会认为加薪没有.
通常,Paxos可用于以容错方式复制状态机."状态机"可以被认为是具有某种初始状态的算法,并且它根据从外部(即,web-客户端)接收的消息确定性地推进状态.
更准确地说,Paxos应被视为分布式日志,您可以在此处阅读更多相关信息:了解Paxos - 第1部分
2018 年更新:
Mysql高可用使用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:
正如其他答案一样,扑克是回合制的并且有规则。如果您允许一个主节点和多个副本,那么主节点会仲裁下一个操作。假设用户首先单击“检查”按钮,然后改变主意并单击“折叠”。这些是冲突的命令,只有第一个应该被接受。浏览器不应该让他们按下第二个按钮,当他们按下第一个按钮时会禁用它。由于涉及金钱,主服务器也应该执行规则,并且每回合每个玩家只允许一个动作。当大师在游戏过程中崩溃时,问题就来了。哪个副本可以成为主副本,您如何强制只有一个副本成为主副本?
处理选择新 master 的一种方法是使用外部强大的一致服务。我们可以使用 Cassandra为主节点创建租约。副本可以在主服务器上超时并尝试租用。因为 Cassandra 使用的是 Paxos,所以它是容错的;即使 Cassandra 节点崩溃,您仍然可以读取或更新租约。
在上面的例子中,扑克主副本和副本最终是一致的。master 可以发送心跳,以便副本知道它们仍然连接到 master。由于消息向一个方向流动,因此速度很快。当 master 崩溃时,试图成为 master 的副本中可能存在竞争条件。在那个时候使用 Paxos 可以让你对哪个节点现在是主节点的结果有很强的一致性。这需要节点之间的额外消息来确保单个主节点的共识结果。
现实生活中的用例:
| 归档时间: |
|
| 查看次数: |
8704 次 |
| 最近记录: |