首页 > 解决方案 > 在 CouchDb 中为 _find 和 MapReduce 查询读取 quorum

问题描述

CouchDb文档指出,默认情况下,对单个文档的读取和写入都是仲裁读取和写入(例如r=2w=2在 3 副本系统中)。

但是,文档_find说 r “默认为 1,在这种情况下返回在索引中找到的文档。如果设置为更高的值,则每个文档在返回之前至少从那么多副本中读取......”它我不是 100% 清楚,但这到底意味着什么。如果我运行_findr=2在单个节点的索引中找到一个文档,我认为很明显它还会从第二个节点获取该文档并将最新的返回给我。但是,我认为它仍然只检查一个节点上的索引,因此无法保证健康集群中的一致性。

例如,假设我有一个健康的 3 节点集群,没有网络分区。该集群中的数据库有一个 Mango 索引,其中包括字段foo,我通过 查询_find所有带有foo=bar. 假设最初的文档X具有价值foo=baz,因此X不应返回。现在,我更新X设置foo=bar并使用w=2. 然后我立即重新运行我_find的 with r=2。如果仅在一个节点上查询索引X,那么即使使用r=2. 也一样r=2仅意味着在一个节点的索引中找到的文档也将在第二个节点上查找,或者这是否意味着 2 个节点上的索引将运行查询并合并它们的结果。

此外,似乎相同的索引和r=1默认值可能适用于 JavaScript MapReduce 视图,但我没有看到这种情况的等效文档。MapReduce 视图查询是否默认为r=1or r=2

标签: couchdbcouchdb-mango

解决方案


我在 CouchDb Slack 上发布了指向上述内容的链接并得到了回复

map/reduce 视图(由 _view 访问)是 r=1 并且为 _find 提到的 r 参数我认为仅指我们获取文档的时间,而不是查询本身运行的时间,但我对此不是 100% 确定的。

这不是一个确定的答案,所以我没有将其标记为正确,但它绝对是我之前拥有的更多信息。


推荐阅读