避免在分布式系统中过度使用共识协议



我是分布式系统的新手,我正在阅读"简单Paxos"。这引起了很多争论,我正在考虑性能影响。

假设您正在构建一个全球分布式数据库,其中有几个位于不同位置的小型集群。尽量减少跨站点通信的数量似乎很重要。

  1. 哪些决定是你绝对需要使用共识的?我唯一确定的问题是决定是否从网络中添加或删除一个节点(或一组节点?)。这似乎是矢量时钟工作的必要条件。另一个我不太确定的是决定对同一位置的写入顺序,但这应该由通过Paxos选举的领导者来完成吗?

  2. 最好避免让所有节点在系统中一起做决策。每个本地集群中的几个节点是否可以参与跨集群决策,并且所有本地节点使用本地Paxos进行通信,以确定跨站点问题的本地答案?假设网络不饱和,延迟是相同的,但跨站点的网络流量会少得多。

  3. 假设您可以按行拆分数据库的表,并将每个行子集分配给一个节点子集。选择一组节点来包含系统中所有机器上使用Paxos的每个数据子集,然后仅在这些节点之间运行Paxos来处理该数据子集的所有操作,这是否正常?

还有一个笼统的问题:人们是否正在做其他与设计相关的或算法优化来解决这个问题?

好问题,好见解!

这会引起很多争论,我正在考虑性能影响。

假设您正在构建一个全球分布式数据库,其中有几个位于不同位置的小型集群。尽量减少跨站点通信的数量似乎很重要。

哪些决策是你绝对需要使用共识的?我唯一确定的问题是决定是否从网络中添加或删除一个节点(或一组节点?)。这似乎是矢量时钟工作的必要条件。另一个我不太确定的是决定对同一位置的写入顺序,但这应该由通过Paxos选举的领导者来完成吗?

是的,我的团队在实践中也看到了性能问题。我们维护一个一致的数据库&分布式锁管理器;并且最初使用Paxos进行所有写操作,一些读操作和集群成员更新。

下面是我们做的一些优化:

  • 尽可能地,节点将转换发送给杰出的提议者/学习者(通过Paxos选出)
    • 决定写顺序,和
    • 在等待前一个实例的响应时批处理转换。(但是批量处理过多也会造成问题。)
  • 我们曾经考虑过使用多paxos,但我们最终做了一些更酷的事情。

通过这些优化,我们仍然会影响性能,所以我们将服务器分成三层。底层是Paxos;它按照你的建议去做;即仅决定中间层的节点隶属关系。中间层是自定义的高速链共识协议,它实现了共识。为数据库排序。(顺便说一句,链共识可以被视为垂直Paxos。)顶层现在只维护数据库/锁&客户端连接。这种设计导致了几个数量级的延迟和吞吐量的提高。


避免让系统中的所有节点一起做出决策是很好的。每个本地集群中的几个节点是否可以参与跨集群决策,并且所有本地节点使用本地Paxos进行通信,以确定跨站点问题的本地答案?假设网络不饱和,延迟将是相同的,但跨站点的网络流量将会轻得多。

假设您可以按行拆分数据库的表,并将每个行子集分配给一个节点子集。选择一组节点来包含系统中所有机器上使用Paxos的每个数据子集,然后仅在这些节点之间运行Paxos来处理该数据子集的所有操作,这是否正常?

这两件事一起让我想起了谷歌扳手纸。如果你跳过时间部分,它本质上是在全局上做2PC,在分片上做Paxos。(这个)。

最新更新