- 常见问题 >
- FAQ:MongoDB 分片
FAQ:MongoDB 分片¶
这篇文档回答了关于使用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 基于分片集的元数据确定在哪个分片或包含相关数据的分片组,直接引导至需要的分片或分片组中查询,并将这些结果返回到客户端。