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

Dan*_*Dan 6 distributed-computing paxos

我是分布式系统的新手,我正在读"简单的Paxos".它创造了很多喋喋不休,我正在考虑性能影响.

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

  1. 你肯定需要做出哪些决定才能达成共识?我唯一想到的就是决定是从网络添加还是删除一个节点(或一组节点?).这似乎是矢量时钟工作所必需的.另一个我不太确定是在决定写入同一位置的命令,但是这应该由一位通过Paxos选出的领导者完成吗?

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

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

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

Mic*_*uff 6

好问题,好的见解!

它创造了很多喋喋不休,我正在考虑性能影响.

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

你肯定需要做出哪些决定才能达成共识?我唯一想到的就是决定是从网络添加还是删除一个节点(或一组节点?).这似乎是矢量时钟工作所必需的.另一个我不太确定是在决定写入同一位置的命令,但是这应该由一位通过Paxos选出的领导者完成吗?

是的,性能是我的团队在实践中看到的问题.我们维护一致的数据库和分布式锁管理器; 和orignally使用Paxos进行所有写入,一些读取和集群成员资格更新.

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

  • 节点尽可能地将转换发送给Distinguished Proposer/Learner(通过Paxos选出),
    • 决定写订单,和
    • 等待来自先前实例的响应的批处理转换.(但是过多配料也会造成问题.)
  • 我们曾考虑使用多个paxos,但我们最终做了一些更酷的事情(见下文).

通过这些优化,我们仍然在为性能而受到伤害,因此我们将服务器分为三层.底层是Paxos; 它做你的建议; 即 仅决定中间层的节点成员资格.中间层是一个定制的高速链共识协议,它对数据库达成共识和排序.(顺便说一句,链式共识可以被视为垂直Paxos.)顶层现在只维护数据库/锁和客户端连接.这种设计导致了几个数量级的延迟和吞吐量的提高.


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

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

这两个让我想起了Google Spanner的论文.如果你跳过关于时间的部分,它基本上是全局2PC和碎片上的Paxos.(IIRC).