CouchDB 复制忽略零星文档

CouchDB replication ignoring sporadic documents

我的应用程序有一个 CouchDB 设置 (CouchDB 2.1.1),它在很大程度上依赖于复制完整性。我们正在使用 "one db per user" 方法,使用额外的 "role" db:s 层对用户进行分组,如下图所示。

近期,我们在增加内测人数的同时,发现部分文档没有按照应有的方式复制。我们无法在文档大小、creation/update 时间、用户或其他方面看到任何模式。错误似乎偶尔发生,2-3 个成功复制的文档后跟 4-6 个未复制的文档。

服务器在这些文档上以 {"error":"not_found","reason":"missing"} 响应。

大部分(但不是全部)用户文档已复制到相应的角色数据库,但很少有人一直复制到主数据库。当使用 < 100 个文档进行测试时,这从未发生过(现在我们在数据库中有 1000-1200 个文档)。

我发现 Performance chapter in the docs 中提到的 "max open files" 设置有问题并修复了它,但非复制文档仍然没有复制。如果我打开一个文档并保存它,它会复制。

这是我目前的理论:

  1. 复制进程试图在用户上线时复制新文档
  2. 写入过程因 Linux 的 "max_open_files" 达到峰值而失败
  3. 主数据库仍然认为复制成功
  4. 在稍后的复制中,主数据库忽略那些旧文档,只尝试复制新文档

这可能是正确的吗?我能否以某种方式使 CouchDB 服务器 "double check" 所有文档和以前复制的完整性?

感谢您的宝贵时间和任何有用的意见!

我过去也遇到过类似的事情 - 在没有足够权限的情况下尝试复制文档时,复制失败了。但是,当权限问题得到解决后,您尝试复制的文档将无法复制,尽管文档上的 edit/save 解决了该问题。我想知道这是不是因为检查站? CouchDb manual 表示 "use_checkpoints" 标志:

Disabling checkpoints is not recommended as CouchDB will scan the Source database’s changes feed from the beginning.

虽然从头开始扫描听起来可能会解决问题,但禁用检查点可能会有所帮助。当时我再也没有回到那个问题,所以恐怕这不是一个正确的答案,只是一个建议。