Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb分片集合索引信息存储在哪里?_Mongodb_Indexing_Sharding - Fatal编程技术网

mongodb分片集合索引信息存储在哪里?

mongodb分片集合索引信息存储在哪里?,mongodb,indexing,sharding,Mongodb,Indexing,Sharding,让我们假设一个具有shard key的shard集合名为skey 还有另一个索引键,但不是名为ikey的切分键 如果查询是这样的 db.collection.find({"ikey": "something"}) 它将搜索所有碎片中的文档,因为它不是碎片密钥 在这一点上,mongos怎么知道应该在碎片上搜索它?索引信息存储在哪里?配置服务器?或者每个分片mongod服务器?索引存储在单个分片上。这适用于切分键和所有其他索引 mongos为每个分片保存所谓的分片密钥范围缓存。密钥范围存储在配置服

让我们假设一个具有shard key的shard集合名为skey 还有另一个索引键,但不是名为ikey的切分键

如果查询是这样的

db.collection.find({"ikey": "something"})
它将搜索所有碎片中的文档,因为它不是碎片密钥


在这一点上,mongos怎么知道应该在碎片上搜索它?索引信息存储在哪里?配置服务器?或者每个分片mongod服务器?

索引存储在单个分片上。这适用于切分键和所有其他索引

mongos为每个分片保存所谓的分片密钥范围缓存。密钥范围存储在配置服务器上,mongos实例在某些情况下会与配置服务器联系,以检索这些密钥范围及其关联的碎片。键范围基本上是一个分片键值字典和具有相应分片键值的文档所在的分片的名称

因此,如果您通过shard key进行查询,mongos可以识别保存数据的shard,并将查询发送到保存具有定义的key范围的数据的shard。然后碎片将数据返回给mongos,mongos将在必要时对返回的数据进行排序


Mongos知道它必须将查询发送到所有碎片,因为查询不包含相应集合的碎片密钥。

谢谢,您能给我一些与此问题相关的文档链接吗?阅读您的答案后,我有一个详细问题。让我们考虑一下计数,如果计数被索引,那么存储在shard1的1,3值和存储在shard2的2,4值。如果计数键不是碎片键,则可能会发生这种情况。然后,存储每个碎片的范围是什么?碎片1上的1和3,碎片2上的2和4。详情请参阅