【问题标题】:Index on ts field in oplog.rs is not updatedoplog.rs 中 ts 字段的索引未更新
【发布时间】:2013-03-01 14:59:25
【问题描述】:

我有一个应用程序通过查询 ts 字段来读取 mongodb 2.2 副本集中的 oplog.rs 集合。

我在 ts 字段上添加了一个索引,但是在将新条目插入 oplog 时它不会更新。

我错过了什么?我在 mongodb 文档中找不到任何关于不支持上限集合索引的内容(相反),并且我找不到任何关于 oplog 特殊的信息。

谢谢

【问题讨论】:

  • 您如何确定索引没有正确更新?
  • 我通过以自然(插入)顺序读取 oplog 条目与使用 ts 字段读取来组合信息。插入新数据后,我得到不一致的结果。如果我手动更新 ts 索引,我会得到正确的结果。
  • 您正在阅读带有尾光标或普通光标的 oplog 条目?
  • 是的,在 ts 上的查找正在使用定制的光标。
  • 为了澄清,当我删除 ts 上的索引时,一切都按预期工作。

标签: mongodb


【解决方案1】:

如您所见,local.oplog.rs*.system.profile 等系统集合不支持二级索引。在 MongoDB 2.4 和更早版本中,索引似乎已经创建,但实际上从未更新。如果您尝试使用不受支持的更改(例如尝试创建其他索引)直接更新系统集合,较新版本的 MongoDB(2.6+)会返回错误。

oplog.rs 集合绝对是“特殊的”,因为它的预期用途仅用于复制。复制内部在此基础上对 oplog 的预期操作做出了一些假设。例如,复制只需要插入 oplog 条目 - 与您自己创建的上限集合不同,oplog 条目从不更新。

如果应用程序需要关注插入到 oplog 中的新条目,或使用 $natural order 进行查找,则应用程序应使用 tailable cursor 读取 oplog。

tailable cursor tutorial 更详细地介绍了用法,但有几点需要特别注意:

  • Tailable 游标不使用索引并按自然顺序返回文档。
  • 因为可尾游标不使用索引,查询的初始扫描可能很昂贵;但是,在最初用尽游标后,随后对新添加文档的检索成本很低

【讨论】:

    【解决方案2】:

    我错过了什么?我在 mongodb 文档中找不到任何关于不支持上限集合索引的内容(相反),并且我找不到任何关于 oplog 特殊的信息。

    您的问题对于您当前实施的具体方式有点模糊。但是,似乎不是索引没有更新,而是您没有收到更新通知,因为 MongoDB 还没有发布/订阅功能:https://jira.mongodb.org/browse/SERVER-3385

    您可以在此集合 (http://docs.mongodb.org/manual/tutorial/create-tailable-cursor/) 上使用可尾光标来实际获取长时间的更新。

    【讨论】:

    • 应用程序偶尔会通过查询 ts 字段从 oplog 中读取,并返回过时的结果。当我手动重新索引时,它按预期工作。
    • @Sammaye:仅供参考,问题实际上在于oplog.rs 是一个“特殊”的封顶集合,仅用于复制。复制内部执行忽略索引的快速插入(因为正常复制和可尾游标不需要/不需要)。在 MongoDB 2.4 中,不会更新额外的索引。未来对使用索引的 PubSub 或可尾游标的支持可能会改变这一点。
    • @Stennie 这是文档中需要提及的内容,因为我刚刚完全阅读完所有复制部分,但我找不到提及插入到 oplog 忽略索引构建的内容。
    • 同意,但不确定手册中的确切位置。不建议修改任何系统集合,除非您遵循记录的过程,例如调整 oplog 的大小。关于在哪里查找警告有什么建议吗?
    • @Stennie 这确实是一个难题:docs.mongodb.org/manual/core/replication-internals/… 可能有用吗?
    猜你喜欢
    • 2015-05-10
    • 2015-08-26
    • 2013-08-03
    • 2022-11-29
    • 1970-01-01
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多