Skip to the content.

Quorum

通过每个决定都需要多数人通过来避免两组服务器各自做决定。

问题

在分布式系统中,一个服务器无论何时做什么操作,它都需要确保在崩溃之际都要把操作的结果给到客户端。这是通过给集群中其它服务器备份来实现的。但是这又会导致一个问题:在原始服务器能够完全识别更新之前, 要有多少服务器确认复制呢。如果原始服务器等待太多的复制(各节点),那这样势必会响应延迟 —— 这会降低系统的活性。但是如果又不等待足够的复制,那么更新数据就会丢失 —— 安全故障。关键就是要在系统性能和系统持续性上做个平衡

解决方案

集群同意当大多数节点确认更新时接收这个更新。我们把这个数字称为法定人数(number of quorum)。所以如果集群中有 5 个节点,那么我们就需要 3 个法定人数(对于一个有 n 个节点的集群,quorum = n/2 + 1)

quorum 也表明了有多少失败可以容忍 —— 它是集群大小减去 quorum。5 个节点的集群可以容忍 2 个节点失败。通常,如果我们想要容忍 ‘f’ 故障,我们就需要一个 2f +1 大小的集群。

思考下面给出的例子需要的 quorum:

决定在集群中的服务器的数量

集群只有在大多数服务器运行的情况下才能工作。在正在数据复制的系统中,有两个点需要考虑:

思考以下两个因素,实际上大多数基于仲裁的系统有一个三到五个节点的集群。一个 5 个节点的集群能容忍 2 个故障,数据写吞吐量可以达到每秒几千个请求。

这里有关于如何选择基于故障容忍数量以及合适的高效的吞吐量的服务器数量的例子。吞吐量列显示的是近似的相对吞吐量,突出显示吞吐量如何随着服务器数量的增加而下降。数字因系统的不同而不同。作为例子,读者可以参考在 Raft Thesis 以及 Zookeeper 原始论文实际发表的吞吐量。

服务器数量 仲裁 容忍故障数 吞吐量
1 1 0 100
2 2 0 85
3 2 1 82
4 3 1 57
5 3 2 48
6 4 2 41
7 4 3 36

例子

原文链接

https://martinfowler.com/articles/patterns-of-distributed-systems/quorum.html