MongoDB分片组件说明
MongoDB分片组件说明
一个 MongoDB 分片集群由以下三个组件构成,缺一不可:
- shard:用于存放我们的mongodb数据的,保证数据的高可用性和一致性,所以通常情况下,我们推荐将其部署为我们的副本集(Replica Set)模式,并且最少部署 2 个分片。副本集(Replica Set)的部署可以参考我之前写的MongoDB副本集部署。
- mongos:又称为route,充当查询路由器,提供客户端应用程序和分片集群之间的接口。应用程序直接连接 mongos 即可,可以部署一个或多个。
- config servers:配置服务器存储集群的元数据和配置(包括权限认证相关)。从 MongoDB 3.4 开始,必须将配置服务器部署为副本集(CSRS,全称是 Config Servers Replica Set)。
MongoDB 分片集群的架构图如下所示,该图片引用自 MongoDB 官网文档。
分片(sharding)是MongoDB的一种集群特性,用于满足海量数据的存储和访问需求,简单来说就是将数据按照预定的某种规则(片键)分布存储在集群中的多台机器(shard)上,通过查询路由(query router)和配置服务(config server)来为应用提供透明的操作方式,就像在操作单一数据库一样。
各个shard上的存储单元chunk是由某部分范围片键多个文档组成为了获得最佳的分片效果,必须选择一个合适的片键:既能够保证数据的均匀分布、分散写入,又能在大部分业务查询条件下缩小分片范围以保证查询效率。
片键在创建后无法再更改,片键必须是集合的索引,如果是空集合则自动创建,同时不允许无片键的文档插入集合。
chunk
chunk(块),这东西存在于shard中,是用来存放我们的数据的。这里又不得不说它的两个概念,分裂和迁移!
分裂:当chunk的大小超过配置的chunk size时,MongoDB的后台进程就会对其进行切分,从而避免chunk过大的情况,chunk size的默认值为64M。
迁移:该工作由MongoDB的后台进程balancer负责,balancer(均衡器)会定期监测各个shard上的chunk,如果chunk分裂为了多个小chunk,各个shard上chunk数量不均衡,就会触发chunk在shard间的迁移。
chunk的影响
当我们的chunk迁移恰好遇到业务高峰或者积累了大量的chunk迁移时,对于我们系统的性能影响还是比较大的,可能会直接影响到我们业务上的读写效率。
那如何去尽量规避呢?
1.指定在规定时间点可以进行chunk迁移(或者关闭balancer),来合理避开业务的高峰期。
2.设置合理的分片键,保证chunk分布均匀,减少chunk迁移的操作。
3.预分片提前分裂,减少chunk的迁移。
chunk和balancer的相关操作可以查看我之前写的MongoDB分片集群使用说明,其中有介绍了部分关于chunk和balancer的操作。