CouchDB复制忽略零星文件

时间:2019-02-08 15:19:18

标签: couchdb couchdb-2.0

我为我的应用程序提供了一个CouchDB设置(CouchDB 2.1.1),它在很大程度上依赖于复制完整性。我们正在使用“每个用户一个数据库”的方法,并在“角色”数据库的另一层添加了db:s,将用户分组如下图所示。

最近,在增加Beta测试人员的数量的同时,我们发现某些文档并未得到应有的复制。我们无法看到文档大小,创建/更新时间,用户或其他方面的任何模式。错误似乎偶尔发生,其中2-3个成功复制了文档,然后是4-6个未复制了文档。

服务器在这些文档上回复{"error":"not_found","reason":"missing"}

大多数(但不是全部)用户文档已被复制到相应的Role DB,但很少将其复制到Master DB。使用<100个文档进行测试时从未发生过这种情况(现在数据库中有1000-1200个文档)。

我发现Performance chapter in the docs中提到的“最大打开文件数”设置存在问题,并已解决,但是未复制的文档仍然无法复制。如果我打开文档并保存,它将复制。

这是我目前的理论:

  1. 复制过程试图在用户在线时复制新文档
  2. 由于Linux的“ max_open_files”达到峰值,写入过程失败
  3. 主数据库仍然认为复制成功
  4. 在以后的复制中,主数据库将忽略那些旧文档,而仅尝试复制新文档

这是正确的吗?能否以某种方式使CouchDB服务器“仔细检查”所有文档和以前复制的完整性?

感谢您的时间和任何有益的评论!

Couch replication schema

1 个答案:

答案 0 :(得分:2)

过去,我经历过类似的事情-当尝试在没有足够权限的情况下复制文档时,复制将失败,这是应该做的。但是,解决了权限问题后,尽管对文档进行编辑/保存解决了该问题,但是您无法复制尝试复制的文档。我想知道这是否归因于检查站? CouchDb manual说到“ use_checkpoints”标志:

  

不建议禁用检查点,因为CouchDB会扫描   源数据库的更改从头开始。

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