4.1. 理论

在我们继续之前,我们需要一些理论。

正如您在 etc/default.ini 中看到的,有一个名为 [cluster] 的部分

[cluster]
q=2
n=3
  • q - 分片的数量。

  • n - 每个文档的副本数量。副本。

在创建数据库时,您可以使用请求发送自己的值,从而覆盖 default.ini 中的默认值。

具有相同修订版本的文档的副本数量,必须在 CouchDB 返回 200 之前读取,等于文档总副本数量的一半加一。对于在返回 201 的写入之前需要保存文档的节点数量也是如此。如果节点数量少于该数量,则返回 202。读取和写入数量都可以通过请求分别指定为 rw 参数。

我们现在将重点关注分片和副本。

分片是数据库的一部分。它可以被复制多次。分片的副本越多,您就可以越容易地进行横向扩展。如果您有 4 个副本,这意味着此特定分片的全部 4 个副本将最多存在于 4 个节点上。每个节点最多只能拥有每个分片副本的一个副本。自 3.0.0 版本以来,CouchDB 的默认值为 q=2n=3,这意味着每个数据库(和辅助索引)被分成 2 个分片,每个分片有 3 个副本,总共 6 个分片副本文件。对于仅托管具有这些默认值的单个数据库的 CouchDB 集群,最多可以使用 6 个节点进行横向扩展。

副本增加了容错能力,因为某些节点可以脱机而不会导致整个系统崩溃。

  • n=1 所有节点都必须处于联机状态。

  • n=2 任何 1 个节点都可以脱机。

  • n=3 任何 2 个节点都可以脱机。

  • 等等

计算机偶尔会宕机,系统管理员也会偶尔在愤怒中拔掉网线,因此使用 n<2 等同于自找麻烦。n 的值过高会增加服务器和复杂性,而不会带来任何实际好处。最佳值是 n=3

假设我们有一个具有 3 个副本和 4 个分片的数据库。这将使我们最多拥有 12 个节点:4*3=12。

我们可以丢失任何 2 个节点,仍然可以读取和写入所有文档。

如果我们丢失更多节点会发生什么?这取决于我们的运气。只要每个分片的至少一个副本在线,我们就可以读取和写入所有文档。

因此,如果我们非常幸运,最多可以丢失 8 个节点。