分布式存储:为什么冗余副本默认是3个而不是2个?

distributed storage: why the redundant copy is 3 by default instead of 2?

在分布式存储中,为了避免数据灾难,我们需要数据的多副本。 但是,为什么总复制数量默认为3而不是2?

两个副本将节省近 50% 的存储需求。

选择3份的主要原因是什么?

因为与冗余度的显着改善相比,成本增加并不显着。

当使用两份数据时,它们不同你选择哪个版本?第三个充当决胜局。

至于为什么它们会不同,如果一台计算机停机了一点——或者即使它们不能相互通信——它们的数据也会不同,除非系统停止接受写入。但是,如果有三台计算机,如果其中一台发生故障或与其他计算机分离,另外两台仍然可以接受数据,而不必担心第一段中的情况。 (除非你有相关的故障,你仍然应该计划。)


更新。通常,您会发现分布式算法使用 Quorum-based 系统来确保写入。在大多数情况下,它是 简单多数,这意味着至少 ceil(n/2) 个节点必须具有该值才能持久写入。之后,您可以保证没有任何东西可以取消写入该值,因为您无法获得 ceil(n/2) 更多节点来推翻该决定。在双节点系统中ceil(n/2) = 2;因此,如果其中一个节点出现故障,您将无法再接受写入。但是在三节点系统中,ceil(n/2) = 2仍然存在,所以一个节点可以宕机,系统仍然可以接受写入。

实际上这是一个耐用性、成本和延迟的问题。您在系统中投入的节点越多,您就越有可能不会丢失数据。一个节点相当短暂;两个节点的短暂性略低。三个节点就不错了,很多系统也就止步于此了。但是需要更高耐用性的系统将需要 5、7 或 9 个节点。

我在 Internet 上最可靠的系统之一工作,我们在仲裁中使用 5 个节点,最多还有 16 个节点作为热备份。对我们来说,与所需的耐用性相比,成本很小;出于延迟考虑,我们选择在仲裁中使用 5 个节点,并使用备份来稍微提高持久性并承受仲裁的一些读取压力。

添加到迈克尔的 在这个问题中,选择了三个,因为它提供了一个非常简单的容错级别。这在存在拜占庭故障时称为 't fault-tolerance',其中 t 为 1。也就是说,在不关闭系统的情况下,最多可以 stale/corrupt/wrong 这些数据副本中的 1 个。

t 通常是事先选择作为相关系统的 SLA,或者通过经验证据。给定一个值 t 需要 2*t+1 个副本来处理容错。