【问题标题】:mongodb oplog replay ops on missing documentsmongodb oplog 对丢失文档的重播操作
【发布时间】:2017-11-27 09:15:15
【问题描述】:

我们的一个客户每小时创建一次 mongo 转储并将它们发送给我们。然后,我们重放 oplog。但是,客户决定不再发送所有转储,而只发送紧急情况下调试所需的转储。但是,我担心的是,不发送所有内容会导致我们的本地镜像不一致。

我的主要问题如下:当您重放包含丢失文档的更新操作的操作日志时会发生什么?它会出错还是忽略操作?

为了更好地解释我的意思,这里有一个例子:

  • 客户端在 2017 年 11 月 27 日使用{_id: 1} 创建条目
  • 同一条目于 2017 年 11 月 28 日首次更新
  • 客户端通过 oplog 发送仅包含 2017 年 11 月 28 日之后的操作
  • 我们在本地重放 oplog

{_id: 1} 条目的更新操作会发生什么?会出错吗?会不会因为没有文档需要更新这样的_id而被忽略?

附:目前使用的是 mongo 2.4

【问题讨论】:

    标签: mongodb mongodb-oplog


    【解决方案1】:

    但是,我担心的是,不发送所有内容会导致我们的本地镜像不一致。

    这是正确的。不发送所有内容意味着您的副本不再是镜子,而更像是一个叉子。换句话说,它可能对故障排除/复制目的毫无用处。

    oplog 应用程序假定数据库处于某种状态以使其工作。将 oplog 应用于随机状态几乎没有意义,而且它从来没有被设计成这样工作。即使它没有因断言错误而崩溃,数据库也处于未定义状态。

    您可以在https://github.com/mongodb/mongo/wiki/Replication-Internals 中阅读有关 MongoDB 复制内部结构的更多信息

    附:目前使用的是 mongo 2.4

    注意: MongoDB 2.4 非常旧,不再受支持。撰写本文时最新的 MongoDB 版本是 3.4.10。请考虑升级到受支持的版本。

    【讨论】:

    • 对于 db 的不一致我们真的无能为力。但是,我的实际问题是应用 oplog 是否会因缺少文档而工作或崩溃。找不到任何相关文档。正在更新 mongodb 但无法立即更新
    • @XeniaSis 它会崩溃
    • @XeniaSis 澄清一下,某些 oplog 操作会导致数据库崩溃,例如更新已删除集合中的文档。 oplog 幂等性大概可以应付一些文件丢失的情况,但不能保证。
    【解决方案2】:

    如果客户在上次转储后向您发送了所有 oplog,则不会缺少任何会阻止 oplog 应用的信息,因为所有信息(插入、更新、删除)都在 oplog 中。

    是的。 2.4版太老了……

    【讨论】:

    • 问题是客户不会发送所有转储,如我的问题所述
    • 您需要一个(完整的)转储,然后是所有 oplog。没关系,如果那个转储是一个月前的,如果你在那之后收到了所有的 oplog。
    • 我想你误解了我的问题
    猜你喜欢
    • 1970-01-01
    • 2017-03-04
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    • 2016-09-15
    相关资源
    最近更新 更多