【问题标题】:sh.startBalancer(timeout, interval) meaning of parameters?sh.startBalancer(timeout, interval) 参数的含义?
【发布时间】:2016-06-30 21:14:45
【问题描述】:

在 mongo db 命令中 sh.startBalancer(timeout, interval) 根据文档: timeout integer 要等待的毫秒数。 interval integer 等待每个周期休眠的毫秒数。 有人可以详细解释一下参数的含义。运行 sh.startBalancer() 时相同的默认值是什么?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    sh.startBalancer(timeout, interval) 会做两件事:

    1. 更新 config.settings {_id: 'balancer'} 文档,以允许平衡器运行。
    2. 每隔'interval'毫秒检查是否已获取分布式锁,表明平衡器正在运行。它将一直执行到指定的“超时”毫秒,此时此方法将断言。

    即使您达到了超时,config.settings 更新仍将保持在启用平衡器的位置。

    如果您有兴趣查看代码,可以运行不带括号和参数的 sh.startBalancer,对其调用的函数执行相同操作。以下是针对 MongoDB 3.2.6 的:

    > sh.startBalancer
    function (timeout, interval) {
        sh.setBalancerState(true);
        sh.waitForBalancer(true, timeout, interval);
    }
    
    > sh.setBalancerState
    function (onOrNot) {
        sh._getConfigDB().settings.update(
        {_id: "balancer"}, {$set: {stopped: onOrNot ? false : true}}, true);
    }
    
    > sh.waitForBalancer
    function (onOrNot, timeout, interval) {
    
        // If we're waiting for the balancer to turn on or switch state or
        // go to a particular state
        if (onOrNot) {
            // Just wait for the balancer lock to change, can't ensure we'll ever see it
            // actually locked
            sh.waitForDLock("balancer", undefined, timeout, interval);
        } else {
            // Otherwise we need to wait until we're sure balancing stops
            sh.waitForBalancerOff(timeout, interval);
        }
    
    }
    
    > sh.waitForDLock
    function (lockId, onOrNot, timeout, interval) {
        // Wait for balancer to be on or off
        // Can also wait for particular balancer state
        var state = onOrNot;
        var configDB = sh._getConfigDB();
    
        var beginTS = undefined;
        if (state == undefined) {
            var currLock = configDB.locks.findOne({_id: lockId});
            if (currLock != null)
                beginTS = currLock.ts;
        }
    
        var lockStateOk = function() {
            var lock = configDB.locks.findOne({_id: lockId});
    
            if (state == false)
                return !lock || lock.state == 0;
            if (state == true)
                return lock && lock.state == 2;
            if (state == undefined)
                return (beginTS == undefined && lock) ||
                    (beginTS != undefined && (!lock || lock.ts + "" != beginTS + ""));
            else
                return lock && lock.state == state;
        };
    
        assert.soon(
            lockStateOk,
            "Waited too long for lock " + lockId + " to " +
                (state == true ? "lock" : (state == false ? "unlock" : "change to state " + state)),
            timeout,
            interval);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2019-06-23
      • 1970-01-01
      • 2011-08-17
      • 2013-08-30
      • 1970-01-01
      相关资源
      最近更新 更多