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

Where the mongodb sharded collection index info stored?

假设一个分片集合的分片键名为 "skey" 还有另一个索引但不是分片键,名为 "ikey"

如果这样查询,

db.collection.find({"ikey": "something"})

它将在所有分片中搜索文档,因为它不是分片键。

此时,mongos 如何知道应该跨分片搜索它?该索引信息存储在哪里?配置服务器?或每个分片 mongod 服务器?

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

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

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

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