MongoDB 具有复合索引的分片集群上的 Oplog 游标

MongoDB Oplog Cursor on Sharded Cluster with Compound Index

有一个OpLog游标,是否可以在更新操作中获取除默认_id之外的另一个索引?

背景:

我有一个分片集群,使用复合索引作为分片键。此复合键的一部分用于确定哪一组分片用于存储数据(也称为 Tag Aware Sharding

在不同分片的 ReplicaSets 的后台 tailing the OpLogs 中有一些 NodeJS 微服务 运行 来触发对数据更改的进一步处理。现在,如果某些数据被更新,OpLog 中返回的唯一索引是默认的 _id,这迫使我第二次查询整个集群复合索引的一部分,以在进一步处理中利用整个分片键。

该应用程序的写入非常密集,意味着每次更新都要对整个集群进行一次额外查询。如果我能在更新操作中得到整个复合索引,我就可以避免这个查询。

感谢任何意见!

截至 MongoDB 3.2,MongoDB 问题跟踪器中的 replication oplog does not include details of the shard key or secondary indexes relating to a document. The oplog wasn't designed for your use case; I would suggest watching/upvoting SERVER-13932: Change Notification Stream API

Now if some data gets updated, the only index returned in the OpLog is the default _id, which forces me to query the whole cluster for the second part of the compound index to leverage the whole shard key in further processing.

There are some NodeJS Microservices running in the background tailing the OpLogs of the ReplicaSets of the different shards to trigger further processing on data changes. Now if some data gets updated, the only index returned in the OpLog is the default _id, which forces me to query the whole cluster for the second part of the compound index to leverage the whole shard key in further processing.

对于分片集群,您必须在每个分片上跟踪操作日志,正如您正在做的那样。但是,对于您的用例,有一个有用的 属性 of _id 和分片键:两者都是 immutable.

我不确定您的微服务是如何配置来聚合更新的,但是如果您看到一个插入或更新,并且您想要了解有关该文档的分片键的更多信息,您只需要查询一个分片:您刚刚观察到的那个正在更新该文档。

因此建议的尝试方法是:

  • 分片上的 oplog 尾部发现 _id 个更新的感兴趣文档
  • 查询文档的本地分片(按 _id)以查找分片键字段
  • read/update 文档通过 mongos 使用分片键
  • 进一步处理

您应该进行测试,看看这是否真的会对您的部署产生可衡量的性能差异,但这种方法将使查询针对单个分片而不是 scatter/gather 所有分片。

明显警告: 除了通过从您在操作日志中观察到更新的本地分片中获取文档来欺骗发现分片键之外,您肯定需要所有查询和更新通过 mongos.

处理您的分片集群