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

标签 mongodb indexing tail

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

背景:

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

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

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

感谢您的任何意见!

最佳答案

在 MongoDB 3.2 中,replication oplog不包括与文档相关的分片键或二级索引的详细信息。 oplog 并不是为您的用例而设计的;我建议观看/投票SERVER-13932: Change Notification Stream API在 MongoDB 问题跟踪器中。

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.

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

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

因此建议尝试的方法是:

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

您应该进行测试,看看这是否确实会对您的部署产生可衡量的性能差异,但这种方法可以实现针对单个分片的查询,而不是分散/聚集到所有分片。

明显的警告:除了通过从您在 oplog 中观察到更新的本地分片中获取文档来发现分片键之外,您绝对希望分片集群的所有查询和更新通过 mongos 进行处理。

关于具有复合索引的分片集群上的 MongoDB Oplog 游标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36866165/

相关文章:

linux - 如何杀死使用nodejs ssh2执行的尾部进程?

mongodb - MongoDB 文本索引的词干提取无法正常工作

java - 列表中的 2 个对象并按最大值排序

shell - grep 从下到上,不带 tac

mongodb - 使用go mongo-driver查找对象数组中对象的匹配字段

Java/安卓 : SQLite or file for indexing?

linux - 如何将前 N 个字节从文本文件移动到另一个文本文件

python - 将 mongoengine 查询集转换为 json 文件

javascript - 在 mongo 中查找上周创建的对象

mongodb - $geoIntersect 似乎将多边形查询限制为 180° 宽度,为什么?