翻译或纠错本页面

FAQ:MongoDB 分片

如果你在这里没有找到你寻找的答案, 请检查 常见 问题列表 或发布你的问题到 MongoDB 用户邮件列表.

  • Shard Keys and Considerations for Shard Key Selection
  • Query Routing
  • 如果你的数据集适合在单一的服务器上部署,你应该以一个无分片的方式开始部署。

  • 从一个无分片的数据库转换到 分片集群 是简单并且无缝的。所以在你的数据集比较小情况下配置分片只有微弱的优势。

  • 尽管如此,所有的生产环境部署都应当使用 复制集 来提供高可用性和灾难恢复。

Is sharding appropriate for a new deployment?

若分片和复制一同使用,则在每个 分片 上部署 副本集

我可以在一个集合分片后更改片键吗?

不可以。

在MongoDB中,目前不自动支持集合分片后修改片键。这个事实凸显了选择一个好的 片键 的重要性。如果你 一定要 在集合分片后更改片键,最好的办法是:

  • 从MongoDB中导出所有的数据到外部存储格式。

  • 删除原始的分片集合。

  • 使用更理想的片键配置分片。

  • 预分裂 片键区间以确保初始均匀分布。

  • 还原转储的数据到MongoDB。

参见

See shardCollection, sh.shardCollection(), the Shard Key, 部署一个集群, and SERVER-4000 以获得更多信息.

Why are my documents not distributed across the shards?

在当前的实现方法中,所有 分片集合 中的数据库都有一个”主分片 shard。”该数据库中所有的非共享集合将驻留在相同的分片中。

In addition, MongoDB cannot move a chunk if the number of documents in the chunk exceeds a certain number. See Maximum Number of Documents Per Chunk to Migrate and Indivisible Chunks.

分片必须明确的在集合上启用。在一个集合上启用分片之后,MongoDB将分配不同范围中的集合数据到集合中不同的分片上。分片集自动通过数据迁移范围调整分片之间的不平衡的数据,从一个分片到其他的分片。

如果客户端在数据块迁移的过程中更新文档会发生什么?

mongos 将这个操作分发到 “旧的” 分片,在那个分片上它会立即成功完成。然后在:term:分片集 更新那个数据块的 “所有权” ,即有效的完成迁移过程之前,分片 mongod 实例会复制这个更改到 “新的” 分片

What does writebacklisten in the log mean?

如果 分片 无法访问或者不可用,查询将会返回一个错误信息。

然而,客户端可以设定 partial 查询位,它会从所有的有效分片返回结果,无论给定的分片是否可用。

如果分片响应过慢, mongos 将仅会等待这个分片返回结果。

Each mongos instance maintains a pool of connections to the members of the sharded cluster. Client requests use these connections one at a time; i.e. requests are not multiplexed or pipelined.

在:term:分片集 <sharded cluster> 中的 分片 分布查询的确切方法依赖于查询的性质和分片集的配置。考虑这样的一个分片集合,使用 片键 user_id, 它具有 last_login and email 属性:

To return aggregated statistics related to all of the outgoing connection pools used by the mongos, connect a mongo shell to the mongos with , and run the connPoolStats command:

db._adminCommand("connPoolStats");

mongos 基于分片集的元数据确定在哪个分片或包含相关数据的分片组,直接引导至需要的分片或分片组中查询,并将这些结果返回到客户端。