4.2 版本 [ 4.0集群切片增加不会转义数据 ]
最后更新于:2022-04-02 03:59:57
[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 点:
';