jjzjj

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

coder 2023-11-04 原文

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

背景:

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

有一些 NodeJS 微服务在后台运行 tailing the OpLogs不同分片的 ReplicaSets 以触发对数据更改的进一步处理。现在,如果某些数据得到更新,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 读取/更新文档以进行进一步处理

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

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

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

有关具有复合索引的分片集群上的 MongoDB Oplog 游标的更多相关文章

  1. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  6. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  7. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

  8. ruby-on-rails - 在 RSpec 中,如何以任意顺序期望具有不同参数的多条消息? - 2

    RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)

  9. ruby-on-rails - 协会的 Rails 索引 - 2

    我发现自己需要这个。假设cart是一个包含用户列表的模型。defindex_of_itemcart.users.each_with_indexdo|u,i|ifu==current_userreturniendend获取此类关联索引的更简单方法是什么? 最佳答案 indexArray上的方法与您的index_of_item方法相同,例如cart.users.index(current_user)返回数组中第一个对象的索引==给obj。如果未找到匹配项,则返回nil。 关于ruby-on-

  10. ruby-on-rails - 具有同名的模块和类 - 2

    我有一个模块stat存在于目录结构中:lib/stat_creator/stat/在lib/stat_creator/stat.rb中,我在lib/stat_creator/stat/目录中有我需要的文件,以及:moduleStatCreatormoduleStatendend当我使用该模块时,我将这些类称为StatCreator::Stat::Foo.new现在我想要一个存在于应用程序中的根Stat类。我在app/models中制作了我的Stat类,并在routes.rb中进行了设置。但是,如果我转到Rails控制台并尝试在应用程序/模型中使用Stat类,例如:Stat.by_use

随机推荐