4.1. 理论¶
在我们继续之前,我们需要一些理论。
正如您在 etc/default.ini
中看到的,有一个名为 [cluster]
的部分
[cluster]
q=2
n=3
q
- 分片的数量。n
- 每个文档的副本数量。副本。
在创建数据库时,您可以使用请求发送自己的值,从而覆盖 default.ini
中的默认值。
具有相同修订版本的文档的副本数量,必须在 CouchDB 返回 200
之前读取,等于文档总副本数量的一半加一。对于在返回 201
的写入之前需要保存文档的节点数量也是如此。如果节点数量少于该数量,则返回 202
。读取和写入数量都可以通过请求分别指定为 r
和 w
参数。
我们现在将重点关注分片和副本。
分片是数据库的一部分。它可以被复制多次。分片的副本越多,您就可以越容易地进行横向扩展。如果您有 4 个副本,这意味着此特定分片的全部 4 个副本将最多存在于 4 个节点上。每个节点最多只能拥有每个分片副本的一个副本。自 3.0.0 版本以来,CouchDB 的默认值为 q=2
和 n=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 个节点。