通常来说,MongoDB会自动处理数据均衡。
1.1 集群分片的块的均衡
注意,均衡器只使用块的数量,而非数据大小,来作为衡量分片间是否均衡的指标。
1.2 均衡器
1、执行所有数据库管理操作前,都应关闭均衡器
>sh.setBalancerState(flase) --不可用
>sh.stopBalancer() 停止Balancer
>sh.startBalancer() 开启Balancer
均衡器关闭后,系统则不会在进入均衡状态。
到那时给命令不能立即终止正在进行中的均衡过程:迁移过程通常无法立即停止。
2、查看config.locks集合,一查看均衡器过程是否仍在进行中
>db.locks.find({"_id":"balancer"})["state"]
0表示关闭
3、均衡器会增加系统负载
目标分片必须查询源分片中的所有文档,将文档插入目标分片的块中,源分片最后必须删除这些文档。
在以下两种情况下,迁移会导致性能问题
(1)使用热点片键可保证定期迁移(因为所有的新块都是创建在热点上的)。系统必须有能力
处理源源不断写入到热点分片上的数据。
(2)向集群中添加新分片时,均衡器会试图为该分片写入数据,从而触发一些列的迁移过程。
4、可以在config.settings集合中为数据均衡指定一个时间窗口
如指定了均衡时间窗口,则应该对其进行严密监控,以确保mongos确实只在指定的时间内做均衡。
执行下列更新语句,均衡则只会在下午1点到4点间发生
>db.settings.update({"_id":"balancer"},
{"$set":{"activeWindow":{"start":"13:00","stop":"16:00"}}},
true