I am writing a Maintenance Script for MongoDB that will collect scheduled replica collection collections. Script I still look good doing the work that he must do against the Primary and Secondary nodes. However, there is a problem:
A system using the MongoDB Replica Set is a high-availability web queue from which it constantly writes and reads. Thus, even a few seconds of inactivity when calling rs.StepDown () is completely unacceptable. Is there a way to safely lower node priority without MongoExceptions from hundreds of clients?
Thanks!
ps here is the actual version of Script that should be run through a cron job at low load once a month
// 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'); }
clops source share