OPTIONS
翻译或纠错本页面

管理集群均衡过程

这篇教程描述了与均衡相关的额一般的管理方法.参见 开启分片集合的均衡 获得关于均衡的介绍.参见 集群均衡器 获得更底层的关于均衡的信息.

检查均衡状态

以下的命令用来检测均衡过程是否打开(即均衡过程是否被允许运行),这个命令不检测均衡过程是否在运行.

使用以下命令检查集群中均衡器是否打开,命令返回布尔值:

sh.getBalancerState()

检查均衡锁:

在集群中使用以下命令检查均衡过程是否在运行:

  1. 使用 mongo 连接到集群中任意一个 mongos :

  2. 使用以下命令切换到 Config Database:

    use config
    
  3. 使用以下查询返回均衡过程锁的情况:

    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" }

这个输出表明:

  • 这个均衡过程从运行于 mongos0.example.netmongos 上发起.

  • state 的值可以说明 mongos 是不是获得了锁.在2.0以后的版本,值为 2 表明存在锁,在之前的版本,值为 1 表明存在锁.

为均衡窗口设置时间表

在某些情况下,需要设定均衡过程运行的时间窗口,最典型的情况是,数据增长缓慢,均衡过程可以满足数据均衡的需要,但是均衡过程在运行的时候会对集群性能造成影响.使用以下过程为 the balancer 设置运行时间窗口:

  1. 使用 mongo 连接到集群中任意一个 mongos :

  2. 使用以下命令切换到 Config Database:

    use config
    
  3. 使用以下命令确认均衡过程不处于 stopped 状态:

    sh.setBalancerState( true )
    

    如果处于 stopped 过程或者在 activeWindow 设置的时间窗口之外,均衡过程不会开始.

  4. 在特定的记录上使用 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 } })

禁用均衡器

默认情况下,均衡器会在任意时刻运行,并在需要的时候迁移数据块.使用以下命令,短时间禁用均衡器并阻止所有数据迁移:

  1. 使用 mongo 连接到集群中任意一个 mongos :

  2. 使用以下命令禁用均衡器:

    sh.stopBalancer()
    

    如果有均衡正在运行,系统会继续将这个均衡过程运行完,之后才禁用.

  3. 运行以下命令,如果返回为 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 )

开启均衡过程

在禁用均衡过程之后,使用以下命令将其重新打开:

  1. 使用 mongo 连接到集群中任意一个 mongos :

  2. 使用以下命令之一启用均衡器.

    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 ,表明集合当前的均衡是启用的,但是之前被禁用过.在下次均衡器运行时,集合的均衡会开始进行.

  • 如果操作没有返回数据,表明均衡过程是启用的且从没被禁用过.在下次均衡器运行时,集合的均衡会开始进行.