clo*_*ops 4 database maintenance mongodb
我正在为MongoDB编写一个维护脚本,它将按计划从副本集中压缩集合.到目前为止,我所拥有的脚本看起来很好,正在完成预期对主节点和辅助节点执行的工作.但是有一个问题:
使用MongoDB副本集的系统是一个高可用性Web队列,它不断被写入和读取.因此,即使调用rs.StepDown()几秒钟的停机时间也是绝对不可接受的.有没有办法安全地降级数百个客户端没有MongoExceptions的主节点?
谢谢!
ps这里是脚本的实际版本,应该在每月一次的低负载时间通过cron-job运行
// assuming we are a replica set ;-)
if(rs.isMaster().setName){
try {
//check if the script is run against a master
if(rs.isMaster().ismaster){ //if so, step down as master
print("Connected to a PRIMARY node")
print("Will try to step down as primary");
rs.stepDown();
// after stepdown connections are dropped. do an operation to cause reconnect:
rs.isMaster();
// now ready to go.
// wait for another node to become primary -- it may need data from us for the last
// small sliver of time, and if we are already compacting it cannot get it while the
// compaction is running.
var counter = 1;
while( 1 ) {
var m = rs.isMaster();
if( m.ismaster ) {
print("ERROR: no one took over during our stepDown duration. we are primary again!");
assert(false);
}
if( m.primary ){ // someone else is, great
print("new master host is: "+m.primary);
break;
}
print("waiting "+counter+" seconds");
sleep(1000);
counter++;
}
}else{
print("Connected to a SECONDARY node");
print("Going into Recovery Mode and Compacting");
}
// someone else is primary, so we are ready to proceed with a compaction
print(" ");
print("Compacting...");
print("- queue");
printjson( db.runCommand({compact:"queue"}) );
print(" ");
} catch(e) {
print(" ");
print("ACHTUNG! Exception:" + e);
print(" ");
}
}else{
print('This script works with replica sets only');
}
Run Code Online (Sandbox Code Playgroud)
有没有办法安全地降级数百个客户端没有MongoExceptions的主节点?
不.MongoDB没有任何形式的"预期转换"或"维护转换".
做这个压缩循环是正确的做法.但您必须等待维护窗口来压缩主要维护.
...是一个高可用性的Web队列.
你是否使用Capped Collections?加盖的集合不需要压缩.无法调整封顶集合中的对象的大小,但这通常不是Queue对象的问题.
虽然不是理想的解决方案,但可以解决您的问题.