Я пишу сценарий обслуживания для MongoDB, который будет сжимать коллекции из набора реплик по расписанию. Сценарий, который у меня есть, выглядит хорошо, выполняя работу, которую он должен выполнять против основного и дополнительного узлов. Однако есть проблема:
Система, использующая набор реплик MongoDB, представляет собой веб-очередь высокой доступности, которая постоянно записывается и читается. Таким образом, даже несколько секунд простоя при вызове rs.StepDown () абсолютно недопустимы. Есть ли способ безопасного демонтажа первичного узла без исключений MongoException от сотен клиентов?
Спасибо!
p.s. Вот актуальная версия скрипта, которая должна запускаться через 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');
}