【问题标题】:Cloudant replication skips some documentsCloudant 复制会跳过一些文档
【发布时间】:2017-10-25 20:58:52
【问题描述】:

我正在将我们的数据从一个 Cloudant 实例移动到另一个实例。作为一种移动数据的好方法,我创建了用于连续复制的复制文档。他们中的大多数都复制了所有文档(正如预期的那样,我没有使用任何过滤器),但有些跳过了几个文档。

有问题的 2 个数据库都只存储新文档(没有更新,没有删除)。在调查了更大的数据库(>30 Mio 文档)后,我注意到只有在特定日期之后创建的文档才会被跳过。自该日期以来的大多数天数会丢失大约 1/3 的已创建文档。 有时我注意到复制文档中的错误通常会很快再次消失,并且状态会切换回“已触发”。

worker_died 错误消息报告为{[{<<"error">>,<<"too_large">>}, {<<"reason">>,<<"the request entity is too large">>}]}。 源数据库没有任何问题的迹象。

我该如何解决这个问题?

【问题讨论】:

    标签: couchdb database-replication cloudant


    【解决方案1】:

    听起来您正在从较旧的专用或计量 Cloudant 帐户复制到 IBM Bluemix Public 上的较新实例。在较旧的实例上,最大请求大小为 64M,而在较新的实例上,此限制减少到 1M。这种差异可能是问题所在。

    在复制期间,文档在写入源时会进行批处理。如果您的文档本身小于 1M,您应该能够调整批量大小以压缩到 1M 请求限制大小之下。批量大小默认为 500,但可以使用 worker_batch_size 参数更改;见

    https://console.bluemix.net/docs/services/Cloudant/api/advanced_replication.html#performance-related-options

    如果您的某些文档大于 1M,那么您就不走运了。

    【讨论】:

    • 感谢您的回复。我没有意识到专用 Cloudant 实例会使用不同的批量大小。我用worker_batch_size=1 盯着另一个复制。它可能会运行几天,但如果结果正确,我可以忍受。
    【解决方案2】:

    谢谢,xpqz,你把我引向了正确的方向。 仅减少 worker_batch_size 并不能解决问题,因为我们有一些大于 1MB 的文档。 添加另一个过滤器以跳过所有大于 1MB 的文档后,所有较小的文档都被复制。 不幸的是,Cloudant 不会跳过较大的文档并继续前进,但它会一遍又一遍地重试复制同一个大文档,因此之后的所有文档都不会被复制。

    • 使用大小过滤器创建 dd:

      "filters": {"doc_size": "function(doc, req){\r\n if (JSON.stringify(doc).length > 1048575 ) {\r\n return false;\r\n } \r\n 返回真;\r\n}"}

    • 向复制文档添加过滤器:

      "过滤器": "/doc_size",

    【讨论】:

    • 欢迎接受这个答案,以便帮助他人。谢谢!
    猜你喜欢
    • 2023-03-29
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 2012-05-12
    • 2020-04-10
    • 1970-01-01
    相关资源
    最近更新 更多