【问题标题】:MongoDB MaintenanceMongoDB 维护
【发布时间】:2012-01-17 13:18:01
【问题描述】:

我正在为 MongoDB 编写一个维护脚本,它将按计划从副本集中压缩集合。到目前为止,我的脚本看起来不错,可以完成预期对主节点和辅助节点执行的工作。但是有一个问题:

使用 MongoDB 副本集的系统是一个高可用性的网络队列,不断地被写入和读取。因此,即使调用 rs.StepDown() 时的几秒钟停机时间也是绝对不能接受的。有没有办法从数百个客户端安全地降级一个没有 MongoExceptions 的主节点?

谢谢!

附言这是脚本的实际版本,应该每月在低负载时间通过 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');
}

【问题讨论】:

    标签: mongodb maintenance database


    【解决方案1】:

    有没有办法从数百个客户端安全地降级一个没有 MongoExceptions 的主节点?

    。 MongoDB 没有任何形式的“预期转换”“维护转换”

    执行此压缩循环是正确的做法。但是您将不得不等待维护窗口来压缩主节点。

    ... 是一个高可用性的网络队列。

    您是否为此使用Capped Collections?封顶集合不需要压缩。上限集合中的对象无法调整大小,但这对于 Queue 对象通常不是问题。

    虽然不是理想的解决方案,但它可能会解决您的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-05-19
      • 2011-06-15
      • 2018-12-05
      • 1970-01-01
      • 2014-12-13
      • 1970-01-01
      • 2017-06-10
      相关资源
      最近更新 更多