mongodb 系列~ chunk原理
一 定义
1 基本单位为chunk,chunk中包含数条doc记录.chunk默认大小是64M,写满后就生成新的chunk
2 存在chunk超过64M的情况,单条doc记录大小超过64M,被称为big chunk,需要手动进行拆分
二 负责进程
3.2 版本 balancer 在 mongos 4.0 版本 balancer 在 config moveChunk 过程和删除数据的逻辑基本没有差
三 拆分阈值
4.0 以上版本,chunks 数量差距大于 2 的时候就会发生迁移, balance 认为是不均衡的,会发生迁移.我们可以发现,高版本mongo会产生更加频繁的迁移,可能消耗更多的资源
四 拆分流程
1 原分片开始启动moveChunk命令,在移动的过程中,所有的操作还会指向原来的分片
2 目标分片开始创建所需要的索引,在3.0以后,moveChunk需要在移动之前,目标分片中存在所有的索引,可以理解为先在目标分片中创建这个索引。
3 目标分片开始向原分片请求数据,并复制数据
4 当数据全部写入到目标分片中,目标分片连接并更新config数据库对应的块信息
5 原分片将这部分块数据进行异步删除。
五 迁移-性能影响
1 moveChunk 可能对系统的负载产生影响,主要是删除数据阶段的影响,一般迁移中的插入数据影响较小;
六 平衡器设置
创建窗口期,平时关闭balance,在业务低峰期开启(move chunk的消耗资源很大,建议这样做)
use config
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )
取消时间窗口设置:
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })