[TOC] > [超简单mongodb 4.2分片集群搭建指南](https://blog.csdn.net/newCheng/article/details/104972150?tdsourcetag=s_pctim_aiomsg) ## 概述 ![UTOOLS1587438926980.png](http://yanxuan.nosdn.127.net/1cbcbbdc45fa3e1477dd747f5220bf26.png) ## 步骤 1. 创建配置服务器 2. 创建多个切片服务器,每个切片本身又可搭建服务服务器 3. 搭建mongos 路由服务器,用于关联配置服务器与切片服务器 ``` //连接 mongos //添加两个分片 sh.addShard("rep_shard1/10.0.4.6:27018,10.0.4.7:27018,10.0.4.8:27018") sh.addShard("rep_shard2/10.0.4.6:27019,10.0.4.7:27019,10.0.4.8:27019") //验证集群状态 sh.status() /* shards: { "_id" : "rep_shard1", "host" : "rep_shard1/10.0.4.6:27018,10.0.4.7:27018,10.0.4.8:27018", "state" : 1 } { "_id" : "rep_shard2", "host" : "rep_shard2/10.0.4.6:27019,10.0.4.7:27019,10.0.4.8:27019", "state" : 1 } */ ``` ## 概念 ### Shard Key(分片键) * **基于 Hashed 的分片**:MongoDB 会计算分片键字段值的哈希值,用以确定该文档存于哪个 chunk(参见下文 "[Chunk(块)](https://www.ibm.com/developerworks/cn/opensource/os-mongodb-sharded-cluster/index.html#1Chunk%E5%9D%97outline)"的介绍),插入效率高,如果渔获取范围数据,则效率较低。 * **基于 Ranged 的分片**:MongoDB 会将相似的值放到一个 chunk 中,查询时带上分片键的范围条件,则效率非常高 ### Chunk(块) **chunk**(块)是均衡器迁移数据的最小单元,默认大小为 64MB,取值范围为 1-1024MB。一个块只存在于一个分片,每个块由片键特定范围内的文档组成,块的范围为左闭又开即`[start,end)`。一个文档属于且只属于一个块,当一个块增加到特定大小的时候,会通过拆分点(split point)被拆分成 2 个较小的块。在有些情况下,chunk 会持续增长,超过 ChunkSize,官方称为[jumbo chunk](https://www.ibm.com/developerworks/cn/opensource/os-mongodb-sharded-cluster/Maximum-Number-of-Documents-Per-Chunk-to-Migrate),该块无法被 MongoDB 拆分,也不能被均衡器(参见下文 "[blancer(均衡器)](https://www.ibm.com/developerworks/cn/opensource/os-mongodb-sharded-cluster/index.html#1Balancer%E5%9D%87%E8%A1%A1%E5%99%A8outline)" 的介绍)迁移,故久而久之会导致 chunk 在分片服务器上分布不均匀,从而成为性能瓶颈,表现之一为 insert 数据变慢。 #### Chunk 的拆分 mongos 会记录每个块中有多少数据,一旦达到了阈值就会检查是否需要对其进行拆分,如果确实需要拆分则可以在配置服务器上更新这个块的相关元信息。 chunk 的拆分过程如下: 1. mongos 接收到客户端发起的写请求后会检查当前块的拆分阈值点。 2. 如果需要拆分,mongos 则会像分片服务器发起一个拆分请求。 3. 分片服务器会做拆分工作,然后将信息返回 mongos。 注意,相同的片键只能保存在相同的块中,如果一个相同的片键过多,则会导致一个块过大,成为 jumbo chunk,所以具有不同值的片键很重要。 迁移过程可确保一致性,并在平衡期间最大化块的可用性。 #### 修改 chunk 大小的注意事项 修改 chunk 大小需要注意以下几点: 1. chunk 的自动拆分操作仅发生在插入或更新的时候。 2. 如果减少 chunk size,将会耗费一些时间将原有的 chunk 拆分到新 chunk,并且此操作不可逆。 3. 如果新增 chunk size,已存在的 chunk 只会等到新的插入或更新操作将其扩充至新的大小。 4. chunk size 的可调整范围为 1-1024MB ### Balancer(均衡器) MongoDB 的 balancer(均衡器)是监视每个分片的 chunk 数的一个后台进程。当分片上的 chunk 数达到特定迁移阈值时,均衡器会尝试在分片之间自动迁移块,使得每个分片的块的数量达到平衡。分片群集的平衡过程对用户和应用程序层完全透明,但在执行过程时可能会对性能产生一些影响。 从 MongoDB 3.4 开始,balancer 在配置服务器副本集(CSRS)的主服务器上运行, 在 3.4 版本中,当平衡器进程处于活动状态时,主配置服务器的的 locks 集合通过修改 _id: "balancer" 文档会获取一个 balancer lock,该 balancer lock 不会被释放,是为了保证只有一个 mongos 实例能够在分片集群中执行管理任务。从 3.6 版本开始,均衡器不再需要 balancer lock。 均衡器可以动态的开启和关闭,也可以针对指定的集合开启和关闭,还可以手动控制均衡器迁移 chunk 的时间,避免在业务高峰期的时候迁移 chunk 从而影响集群性能。以下命令将均衡器的迁移 chunk 时间控制在凌晨 02 点至凌晨 06 点: