管理集群均衡过程¶
这篇教程描述了与均衡相关的额一般的管理方法.参见 开启分片集合的均衡 获得关于均衡的介绍.参见 集群均衡器 获得更底层的关于均衡的信息.
参见
检查均衡状态¶
以下的命令用来检测均衡过程是否打开(即均衡过程是否被允许运行),这个命令不检测均衡过程是否在运行.
使用以下命令检查集群中均衡器是否打开,命令返回布尔值:
sh.getBalancerState()
检查均衡锁:¶
在集群中使用以下命令检查均衡过程是否在运行:
使用以下命令切换到 Config Database:
use config
使用以下查询返回均衡过程锁的情况:
db.locks.find( { _id : "balancer" } ).pretty()
命令返回类似以下的文档:
{ "_id" : "balancer",
"process" : "mongos0.example.net:1292810611:1804289383",
"state" : 2,
"ts" : ObjectId("4d0f872630c42d1978be8a2e"),
"when" : "Mon Dec 20 2010 11:41:10 GMT-0500 (EST)",
"who" : "mongos0.example.net:1292810611:1804289383:Balancer:846930886",
"why" : "doing balance round" }
这个输出表明:
为均衡窗口设置时间表¶
在某些情况下,需要设定均衡过程运行的时间窗口,最典型的情况是,数据增长缓慢,均衡过程可以满足数据均衡的需要,但是均衡过程在运行的时候会对集群性能造成影响.使用以下过程为 the balancer 设置运行时间窗口:
使用以下命令切换到 Config Database:
use config
使用以下命令确认均衡过程不处于 stopped 状态:
sh.setBalancerState( true )
如果处于 stopped 过程或者在 activeWindow 设置的时间窗口之外,均衡过程不会开始.
在特定的记录上使用 update() 可以更改均衡器运行的时间窗口.
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "<start-time>", stop : "<stop-time>" } } }, true )
将 <start-time> 与 <end-time> 替换成要开始和结束运行均衡过程的时间(如 HH:MM) ,这个时间由每个 mongos 根据所处的时区处理.如果你的 mongos 处于不同的时区,使用通用的时间(比如 GMT)来保证时间被正确解释.
举例,以下的命令将会使均衡器只在本地时间 6AM 到 11PM之间运行.
db.settings.update({ _id : "balancer" }, { $set : { activeWindow : { start : "23:00", stop : "6:00" } } }, true )
注解
设定的均衡时间窗口必须足以将当天 所有 写入的数据均衡完成.
由于数据写入的速度随着使用方式与业务端的活跃度而变化,保证设定的时间窗口足以将当天写入的数据均衡完成是很重要的.
在设置了 activeWindow 不要再使用 sh.startBalancer() 方法.
删除均衡时间窗口¶
如果你已经 设置了均衡时间窗口 ,现在想移除时间窗口,使均衡器一直运行,要按照以下的操作进行:
use config
db.settings.update({ _id : "balancer" }, { $unset : { activeWindow : true } })
禁用均衡器¶
默认情况下,均衡器会在任意时刻运行,并在需要的时候迁移数据块.使用以下命令,短时间禁用均衡器并阻止所有数据迁移:
使用以下命令禁用均衡器:
sh.stopBalancer()
如果有均衡正在运行,系统会继续将这个均衡过程运行完,之后才禁用.
运行以下命令,如果返回为 false` 可以确认均衡过程被禁用:
sh.getBalancerState()
为确认在禁用均衡过程之后,没有还在运行的均衡过程,可以使用以下命令:
use config while( sh.isBalancerRunning() ) { print("waiting..."); sleep(1000); }
注解
如果要在不提供 sh.stopBalancer() 方法或者 sh.setBalancerState() 方法的驱动中禁用均衡过程,可以在 config 数据库中使用以下命令禁用:
db.settings.update( { _id: "balancer" }, { $set : { stopped: true } } , true )
开启均衡过程¶
在禁用均衡过程之后,使用以下命令将其重新打开:
使用以下命令之一启用均衡器.
在 mongo 终端中,执行:
sh.setBalancerState(true)
在不提供 sh.startBalancer() 方法的驱动中,可以更改 config 数据库将均衡过程打开:
db.settings.update( { _id: "balancer" }, { $set : { stopped: false } } , true )
在备份过程中禁用均衡过程¶
如果在进行 备份 期间MongoDB歉意了数据块,可能造成不一致的备份结果.因此在备份期间要保证均衡过程一定不能运行.
如果在均衡过程运行中禁用均衡过程,当前的数据块迁移会继续运行,结束后之后来的均衡过程不再运行.
在开始备份操作之前,要确认均衡过程没有在进行.使用以下命令确认均衡过程没有在进行:
!sh.getBalancerState() && !sh.isBalancerRunning()
在备份结束之后,可以将均衡过程重新打开.
在集合上禁用均衡过程¶
使用 sh.disableBalancing() 禁止某个特定的集合上的均衡过程.在数据导入导出期间,也许有需要禁用某个特定集合上的均衡过程.
在禁用某个集合上的均衡过程时,MongoDB不会终端进行中的均衡.
要禁用某个集合上的均衡过程,使用 mongo 终端连接到一个 mongos 并使用 sh.disableBalancing() 方法.
示例
sh.disableBalancing("students.grades")
sh.disableBalancing() 使用集合的完整 namespace 作为参数.
在集合上开启均衡过程¶
可以使用 sh.enableBalancing() 为特定的集合开启分片.
在开启了集合的均衡之后,MongoDB并不会 立刻 开始均衡数据.不过,如果集合中的数据是不均衡的,MongoDB可以分发数据使得数据更均衡.
在一个集合上开启均衡,需要使用 mongo 连接到一个 mongos 并执行 sh.enableBalancing() 命令:
示例
sh.enableBalancing("students.grades")
sh.enableBalancing() 方法的参数为集合的完整的 namespace .
确认均衡是启用的还是禁用的¶
要确认一个集合的均衡是否启用,可以检查 config 数据库中的 collections 集合,找到相应的 namespace 记录,查看 noBalance 字段.
db.getSiblingDB("config").collections.findOne({_id : "students.grades"}).noBalance;
操作将返回记录空的错误,``true`` 或者 false,或者没有结果:
空错误表明集合的namespace不正确.
返回 true ,表明均衡过程被禁用.
如果返回值是 false ,表明集合当前的均衡是启用的,但是之前被禁用过.在下次均衡器运行时,集合的均衡会开始进行.
如果操作没有返回数据,表明均衡过程是启用的且从没被禁用过.在下次均衡器运行时,集合的均衡会开始进行.