MongoDB分片
在本页面
数据库系统的数据集或应用的吞吐量比较大的情况下,会给单台服务器的处理能力带来极大的挑战。例如,高查询率会耗尽服务器的CPU资源。工作的数据集大于系统的内存压力、磁盘驱动器的I/O容量。
解决系统增长的方法有两种:垂直扩展和水平扩展。
垂直扩展 通过增加单个服务器的能力来实现,例如使用更强大的CPU,增加更多的内存或存储空间量。由于现有技术的局限性,不能无限制地增加单个机器的配置。此外,云计算供应商提供可用的硬件配置具有严格的上限。其结果是,垂直扩展有一个实际的最大值。
_水平扩展_是通过将系统数据集划分至多 台机器,并根据需要添加服务器来提升容量。虽然单个机器的总体速度或容量可能不高,但每台机器只需处理整个数据集的某个子集,所以可能会提供比单个高速大容量服务器更高的效率,而且机器的数量只需要根据数据集大小来进行扩展,与单个机器的高端硬件相比,这个方案可以降低总体成本。不过,这种方式会提高基础设施部署维护的复杂性。
下图描述了分片集群中各组件的交互:
Diagram of a sample sharded cluster for production purposes. Contains exactly 3 config servers, 2 or more ``mongos`` query routers, and at least 2 shards. The shards are replica sets.
- 在4.2及更早版本中,分片键字段必须在每个文档中存在一个分片集合。
- 在MongoDB 4.2和更低版本中,无法在分片后更改分片键的选择。
文档的分片键值决定了其在各个分片中的 分布。
- 在MongoDB 4.0和更早版本中,文档的分片键字段值是不可变的。
将配置服务器和分片作为副本集进行部署可提高可用性。
即使一个或多个分片副本集变得完全不可用,分片群集也可以继续提供部分的读取或写入服务。也就是说,虽然停机期间无法访问不可用分片中的数据子集,但是针对可用分片执行读取或写入操作仍然可以成功。
鉴于分片集群基础架构的要求和复杂性,您需要仔细地制定计划、执行和维护。
分片后,MongoDB不会提供任何方法来对分片集群进行分片。
注意如果您与MongoDB签订了有效的支持合同,请考虑与您的客户代表联系,以获取分片集群计划和部署方面的帮助。
Diagram of a primary shard. A primary shard contains non-sharded collections as well as chunks of documents from sharded collections. Shard A is the primary shard.
Diagram of applications/drivers issuing queries to mongos for unsharded collection as well as sharded collection. Config servers not shown.
提示
使用哈希索引解析查询时,MongoDB会自动计算哈希值,不需要应用程序来计算。
Diagram of the hashed based segmentation.
Diagram of the shard key value space segmented into smaller ranges or chunks.
Zones区域可以改善跨多个数据中心的分片集群的数据局部性。
在分片集群中,您可以根据分片键创建分片数据的区域。您可以将每个区域与集群中的一个或多个分片相关联。分片节点可以与任何数量的区域相关联。在分片集群中(已开启均衡器),MongoDB仅迁移到与区域相关的分片节点覆盖的块。
Diagram of data distribution based on zones in a sharded cluster
选择分片键时,应考虑将来可能使用的区域。
提示从MongoDB 4.0.3开始,在对空集合或不存在的集合进行分片_之前_设置区域和区域范围可以更快地设置区域分片。
- 集合必须具有索引,且该索引的前缀是分片键
- 索引必须具有
{ locale: "simple" }
排序规则
使用排序规则创建新集合时,请在分片集合之前确保满足这些条件。
注意
从MongoDB 3.6开始,变更流可用于副本集和分片集群。更改流允许应用程序访问实时的数据更改,避免使用tail oplog带来的复杂性和风险。应用程序可以使用变更流来订阅一个或多个集合上的所有数据变更信息。
在提交事务之前,在事务外部看不到在事务中进行的数据变更。
但是,当事务写入多个分片时,并非所有外部读取操作都需要等待已提交事务的结果在所有分片上可见。例如,如果提交了一个事务,并且在分片A上可以看到写1,但是在分片B上仍然看不到写2,在外部读取时设置读关注为[
"local"
](https://docs.mongodb.com/v4.2/reference/read-concern-local/#readconcern."local"),则可以读取写1的结果而看不到写2的结果。有关详细信息,请参见:
译者:桂陈

MongoDB中文社区—MongoDB爱好者技术交流平台
资源列表推荐 | 资源入口 |
---|---|
MongoDB中文社区官网 | |
微信服务号 ——最新资讯和优质文章 | Mongoing中文社区(mongoing-mongoing) |
微信订阅号 ——发布文档翻译内容 | MongoDB中文用户组(mongoing123) |
官方微信号 —— 官方最新资讯 | MongoDB数据库(MongoDB-China) |
MongoDB中文社区组委会成员介绍 | |
MongoDB中文社区翻译小组介绍 | |
MongoDB中文社区微信技术交流群 | 添加社区助理小芒果微信(ID:mongoingcom),并备注 mongo |
MongoDB中文社区会议及文档资源 | |
MongoDB中文社区大咖博客 | |
MongoDB白皮书 | |
MongoDB初学者教程-7天入门 | |
社区活动邮件订阅 |
最近更新 1yr ago