MongoDB Oplog光标位于具有复合索引的分片集群上

MongoDB Oplog光标位于具有复合索引的分片集群上,mongodb,indexing,tail,Mongodb,Indexing,Tail,有了OpLog游标,是否可以在更新操作中获得除默认索引之外的另一个索引 背景: 我有一个分片集群,其中一个复合索引作为分片键。此复合密钥的一部分用于确定用于存储数据的碎片集(也称为) 有一些NodeJS微服务在不同碎片的复制集的后台运行,以触发对数据更改的进一步处理。现在,如果一些数据得到更新,OpLog中返回的唯一索引就是默认的_id,这迫使我查询整个集群以获得复合索引的第二部分,从而在进一步处理中利用整个shard键 该应用程序是非常写密集型的,意味着每次更新都需要在整个集群上进行一次额外的

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

背景:

我有一个分片集群,其中一个复合索引作为分片键。此复合密钥的一部分用于确定用于存储数据的碎片集(也称为)

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

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

谢谢你的意见

与MongoDB 3.2一样,不包括与文档相关的分片键或二级索引的详细信息。oplog不是为您的用例设计的;我建议在MongoDB问题跟踪器中观看/投票

现在,如果一些数据得到更新,OpLog中返回的唯一索引就是默认的_id,这迫使我在整个集群中查询复合索引的第二部分,以便在进一步处理中利用整个shard键

有一些NodeJS微服务在后台运行,跟踪不同碎片复制集的oplog,以触发对数据更改的进一步处理。现在,如果一些数据得到更新,OpLog中返回的唯一索引就是默认的_id,这迫使我在整个集群中查询复合索引的第二部分,以便在进一步处理中利用整个shard键

对于分片集群,您必须跟踪每个分片上的oplog,就像您正在做的那样。但是,对于您的用例,
\u id
和shard key有一个有用的属性:两者都是

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

因此,建议尝试的方法是:

  • 碎片上的oplog跟踪发现感兴趣的更新文档的
    \u id
  • 查询文档的本地分片(按
    \u id
    )以查找分片键字段
  • 使用shard键通过
    mongos
    读取/更新文档以进行进一步处理
您应该进行测试,看看这是否真的对您的部署产生了可测量的性能差异,但是这种方法将支持针对单个碎片的查询,而不是针对所有碎片的分散/聚集查询


显而易见的警告:除了通过从您在oplog中观察到更新的本地碎片获取文档来欺骗发现碎片密钥之外,您肯定希望通过
mongos

处理碎片集群的所有查询和更新,这实际上是一个比我想象的更好的解决方法。我在想,每次向集群写入相关更新时,只需将碎片复合索引的第二部分+当前时间戳重写到不同的字段。这将导致碎片密钥的第二部分(与时间戳连接)在相关的oplog更新中弹出。。。