【发布时间】:2016-06-30 21:14:45
【问题描述】:
在 mongo db 命令中 sh.startBalancer(timeout, interval) 根据文档: timeout integer 要等待的毫秒数。 interval integer 等待每个周期休眠的毫秒数。 有人可以详细解释一下参数的含义。运行 sh.startBalancer() 时相同的默认值是什么?
【问题讨论】:
标签: mongodb
在 mongo db 命令中 sh.startBalancer(timeout, interval) 根据文档: timeout integer 要等待的毫秒数。 interval integer 等待每个周期休眠的毫秒数。 有人可以详细解释一下参数的含义。运行 sh.startBalancer() 时相同的默认值是什么?
【问题讨论】:
标签: mongodb
sh.startBalancer(timeout, 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);
}
【讨论】: