如果有一个oplog游标,是否可以在更新操作中获取除默认id之外的另一个索引?
背景:
我有一个切分集群,其中有一个复合索引作为切分键。这个复合键的一部分用于确定使用哪一组碎片来存储数据(也称为Tag Aware Sharding
有一些nodejs微服务运行在不同碎片的复制集的后台tailing the OpLogs中,以触发对数据更改的进一步处理。现在,如果更新了一些数据,oplog中返回的唯一索引就是默认的id,这将迫使我查询整个集群以获取复合索引的第二部分,以便在进一步处理中利用整个shard键。
应用程序是非常写密集型的,意味着每次更新都要在整个集群上进行一次额外的查询。如果我能在update操作中得到整个复合索引,我就可以避免这个查询。
谢谢你的意见!

最佳答案

在MongoDB 3.2中,replication oplog不包括与文档相关的Shard键或辅助索引的详细信息。oplog不是为您的用例而设计的;我建议您在mongodb问题跟踪器中观看/upvotingSERVER-13932: Change Notification Stream API
现在,如果更新了一些数据,oplog中返回的唯一索引就是默认的id,这将迫使我查询整个集群以获取复合索引的第二部分,以便在进一步处理中利用整个shard键。
有一些nodejs微服务在后台运行,跟踪不同碎片复制集的oplog,以触发对数据更改的进一步处理。现在,如果更新了一些数据,oplog中返回的唯一索引就是默认的id,这将迫使我查询整个集群以获取复合索引的第二部分,以便在进一步处理中利用整个shard键。
对于一个碎片集群,你必须在每个碎片上跟踪oplog,就像你正在做的那样。但是,对于您的用例,_id和shard键有一个有用的属性:它们都是immutable
我不确定您的microservices是如何配置来聚合更新的,但是如果您看到一个insert或update,并且您希望了解有关该文档的shard键的更多信息,那么您只需要查询一个shard:您刚刚观察到的更新该文档的shard。
因此,建议尝试的方法是:
oplog跟踪shard发现感兴趣的更新文档的_id
查询本地shard for document(通过_id)以查找shard key字段
使用shard键通过mongos读取/更新文档以进行进一步处理
您应该测试一下这是否真的对您的部署带来了可测量的性能差异,但是这种方法将支持针对单个碎片的查询,而不是分散/聚集到所有碎片。
明显的警告:除了通过从oplog中观察到更新的本地shard获取文档来发现shard密钥的欺骗之外,您肯定希望通过mongos来处理您的shard集群的所有查询和更新。

09-11 17:59