仅针对本地MongoDB分片数据进行查询

时间:2014-08-16 23:19:33

标签: mongodb

我有一个分片集合,带有分片键"用户ID"。我想执行一个查询,而不是传递分片键,我只是将查询限制为只有本地mongos分片上的数据。

这可能/可取吗?

此外,它可以与findAndModify一起使用吗?这将允许我对本地文档执行原子更新,而无需在查询中指定分片键。

修改 如下面的一些答案和评论中所述,我对mongos与mongod的理解有点偏差。我现在感谢mongos没有保存本地数据。

3 个答案:

答案 0 :(得分:1)

mongos是否有任何"本地"数据?

没有。每个mongos守护进程routes queries to your shards并不存储任何数据,因此没有" local"由mongos存储的文档。 mongos接口提供整个分片群集的逻辑视图,并且与特定分片没有亲缘关系。

根据您发送给mongos的查询/命令类型,查询将为:

  • 定向:如果查询使用分片键,则发送到特定分片
  • 已定位:如果查询包含多个分片键值(或使用复合分片键的前缀子集),则发送到适用的分片
  • 分散/收集:如果查询未使用分片键,则发送到所有分片

我应该直接从分片中读取吗?

没有。技术上可能直接从分片中读取数据,但绝对不值得推荐,因为您可以获得不一致的数据视图。例如,如果正在进行迁移,则数据将暂时存在于供体分片和目标分片上。同样,由于迁移失败,文档副本可能是orphaned

通过mongos的查询可以正确地将查询定向到相应的分片,并根据sharded cluster metadata过滤结果。

我可以在没有基于分片键的查询的情况下对分片集合使用findAndModify()吗?

没有。对于分片收藏,findAndModify() requires a query based on the shard key。分片键可以保证所请求的文档仅存在于一个分片上。

我是否可以在不经过mongos的情况下更新分片集合?

没有。对分片集合的所有更新都必须经过mongos

答案 1 :(得分:0)

请注意,这样做是不明智的,因为到共享群集的流量应该通过mongos服务。

话虽如此,如果您在分片实例上本地执行查询,则可以查询分片本身。

我从来没有试过以编程方式做到这一点,但它可能值得一试 您可以直接登录运行分片的计算机,并在那里打开一个mongo shell(如果您从未在其上创建本地用户/密码,我相信您可以在没有凭据的情况下连接,否则,该特定分片上的mongod进程必须拥有自己的用户/通行证(因为通过mongos创建的那些在mongod分片中无法识别。

由于每个分片仅知道自己的数据文件,例如,您将在其中一个集合上运行count()操作,您将看到结果只是实际集合大小的一部分。

答案 2 :(得分:0)

你混淆英语后,你的问题有点模糊:

  

我只是将查询限制为仅限本地mongos分片上的数据。

该分片实际上是一个mongod进程,而不是mongos进程,但是如果每个分片都有一个mongos,那么你的英语就有意义了,在这种情况下你有意义想直接发送到可以查询其本地mongos数据的分片上的mongod

如果您正考虑绕过mongos,那么@Stennies评论会回答您的问题,但如果您的英语意味着其他内容,那么我不相信mongos有一个命令切换允许您直接目前没有分片键的查询。