1

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

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

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

  • 客户{_id: 1}在 2017-11-27创建条目
  • 相同条目于 2017-11-28 首次更新
  • 客户端通过 oplog 发送仅包含 2017-11-28 向前的操作
  • 我们在本地重播 oplog

使用 输入的更新操作会发生什么{_id: 1}?会出错吗?由于没有使用此类_id 更新的文档,它会被忽略吗?

PS目前使用mongo 2.4

4

2 回答 2

1

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

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

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

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

PS目前使用mongo 2.4

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

于 2017-11-28T03:17:12.857 回答
0

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

是的。2.4版太老了……

于 2017-11-28T04:11:13.343 回答