3

假设我有 X 服务器的动态网络(随着时间的推移不固定),在仅附加数据库中具有所有事件的相同副本。现在我想支持在这 10 台服务器中的任何一台服务器上创建新事件,并让它们达成共识,复制事件并产生完全相同的事件顺序。我知道这是一个常见问题,并且有一些算法应该处理这样的事情。但我并没有完全掌握它们,我对特别是与事件溯源有关的共识有一些疑问。

我假设服务器永远无法完全确定它认为已达成共识的值真的是最终成为“正确”值的值吗?我基于这样一个事实,即新服务器可以随时加入网络并倾斜平衡以支持另一个价值。这也可能在很久以后发生。但是在这种情况下,服务器应该如何处理一个新的“正确”值呢?在事件溯源中,添加补偿事件以进行更正是正常的,但这些补偿事件是否也必须复制到所有服务器?为了确保所有服务器都具有完全相同的事件,我的意思是。

如果不添加补偿事件而只是“弹出”已经提交的事件,我猜我们不必复制这些事件,但我们会遇到其他问题。如果(错误地)提交的事件在事件总线上发送出去,以便其他服务可以对它们做出反应,我们不能只是将它们从我们的事件数据库中弹出而不搞砸。

还是在短时间内达成共识后,真正承诺一个价值会更好?然后冷冷对待所有新的/迟到的服务器?还是让他们接受结果?如果新服务器连接到它自己的网络,该网络比第一个更大,并且它们都已就另一个值达成共识,该怎么办?

4

1 回答 1

3

我不知道你的分布式系统背景是什么,但是已经建立了共识算法(例如 Raft、Paxos、Viewstamped Replication 等),它们可以在不影响已提交事件的情况下处理从集群中添加和删除服务器。

通常,您不会应用事件,直到它们被多数人提交,特别是因为(如您所提到的)某些应用的事件将具有外部可见性(例如,您从 ATM 机中释放 500 美元)。因此,为了让服务器应用事件,它必须知道该事件已被提交。此外,当服务器被添加到系统中时,它们必须与已经提交的事件保持同步,并且它们不能选择不同的值。如果他们可以选择不同的值,系统将不再提供安全性。我建议阅读Raft纸。Raft 是一种可能适合你的共识算法,算法不难理解。Raft 专门处理添加和删除服务器(参见第 6 节)。您还可以使用 Raft 的实现。

还有其他算法支持弱一致性和撤消操作,例如Bayou。您选择的算法最终取决于您的应用程序的需求。

于 2017-11-21T01:13:56.573 回答