6

我是分布式系统的新手,我正在阅读“简单的 Paxos”。它引起了很多喋喋不休,我正在考虑性能影响。

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

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

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

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

还有一个包罗万象:人们是否正在采取其他与设计相关的或算法优化来解决这个问题?

4

1 回答 1

7

好问题,好见解!

它引起了很多喋喋不休,我正在考虑性能影响。

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

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

是的,我的团队在实践中也遇到过性能问题。我们维护一致的数据库和分布式锁管理器;并且最初将 Paxos 用于所有写入、一些读取和集群成员更新。

以下是我们所做的一些优化:

  • 节点尽可能将转换发送给杰出的提议者/学习者(通过 Paxos 选举),后者
    • 决定写顺序,和
    • 在等待来自先前实例的响应时进行批量转换。(但批处理过多也会导致问题。)
  • 我们曾考虑使用 multi-paxos,但最终我们做了一些更酷的事情(见下文)。

通过这些优化,我们仍然在损害性能,因此我们将服务器分成三层。底层是Paxos;它按照您的建议执行;即。仅仅决定中间层的节点成员。中间层是一个自定义的内部高速链共识协议,它为数据库进行共识和排序。(顺便说一句,链式共识可以被视为 Vertical Paxos。)顶层现在只维护数据库/锁和客户端连接。这种设计导致了几个数量级的延迟和吞吐量提高。


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

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

这两个一起让我想起了Google Spanner 论文。如果你跳过关于时间的部分,它本质上是在全局执行2PC,在分片上执行 Paxos。(IIRC。)

于 2013-05-01T22:04:42.550 回答