一 定义
1 基本单位为chunk,chunk中包含数条doc记录.chunk默认大小是64M,写满后就生成新的chunk,我们可以打个比方.mongodb是一所学校,chunk是班级,初始时候只有一个班级,doc记录则相当于学生,片键是指根据什么样的规则分配学生到班级,初始只有一个班级,随着入学的学生越来越多,会演变成越来越多的班级.每个办公楼就相当于分片成员,move chunk就相当于调度班级的成员在办公楼之间移动,对于mongo而言,chunk就是基本单位
二 负责进程
1 3.2 版本 balancer 在 mongos 4.0 版本 balancer 在 config moveChunk 过程和删除数据的逻辑基本没有差
2 一个分片不能同时参与多个块的迁移。要从一个分片迁移多个块,平衡器一次迁移一个块。。最后,本次检测出的迁移任务完成以后才开始下次 balancer 过程。
3 balancer 过程中,会对集合做一次随机排序,当有多个集合的数据需要均衡时,迁移时也是随机的,并不是迁移完一个集合开始下一个集合。
三 拆分阈值
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 } })