我对使用 Paxos 算法感到困惑。似乎 Paxos 可以用于这样的场景:多个服务器(一个集群,我假设每个服务器都有 3 个角色,proposer、acceptor、leaner)需要保持相同的命令序列以实现一致性和备份。我假设有一些客户端向该服务器发送命令(客户端可能并行发送)。每次命令由一个 Paxos 实例分派到多个服务器时。
- 不同的客户端可以向不同的提议者发送不同的命令,对吧?
如果是这样,来自某个客户端的一个命令将引发一个 Paxos 实例。所以,
- 多个 Paxos 实例可以同时运行?
如果是这样,client-A 向proposer-A 发送“A += 1”命令,client-B 几乎同时向proposer-B 发送“B += 2”命令,我想看到每个服务器都收到了 2命令,“A += 1”和“B += 2”。
然而,
给定 5 个服务器,比如 S1-S5,S1 发送命令“A += 1”和 S5 发送命令“B += 1”,S2 承诺 S1 但是 S3,S4 承诺 S5,所以最后 S3、S4、S5 得到“B + = 1" 但 S1,S2 什么都没有,因为承诺的数量不是多数。似乎 Paxos 根本没有帮助。我们在所有 5 台服务器上都没有得到预期的“A += 1”和“B += 2”?
所以我猜在Paxos的实际应用中,不允许并行Paxos实例?如果是这样,如何避免并行 Paxos 实例,如果我们允许多个客户端和多个提议者,我们似乎仍然需要一个中心化服务器来标记是否有一个 Paxos 正在运行。
另外,我对提议者编号有疑问。我在互联网上搜索,有人声称以下
是一个解决方案:5 个服务器,给定相应的索引 k(0-4),每个服务器使用数字 5*i + k 来表示该服务器的第“i”个提案。
对我来说,这似乎完全不符合要求,因为 server-1 的第一个提案编号始终为 1,而 server-4 的第一个提案编号始终为 4,但是 server-4 可能比 server-1 更早提出提案,但它是提案数字更大。