MongoDB Техническое обслуживание - PullRequest
4 голосов
/ 17 января 2012

Я пишу сценарий обслуживания для 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');
}

1 Ответ

5 голосов
/ 18 января 2012

Существует ли способ безопасного демонтажа первичного узла без исключений MongoException от сотен клиентов?

Нет .MongoDB не имеет никакой формы «упреждающего переключения» или «технического обслуживания переключения» .

Выполнение этого цикла уплотнений является правильным решением,Но вам придется подождать, пока окно обслуживания не сожмет первичку.

... - это веб-очередь высокой доступности.

Используете ли вы Закрытые коллекции для этого?Закрытые коллекции не нуждаются в сжатии.Размер объектов в закрытой коллекции не может быть изменен, но обычно это не проблема для объектов Queue.

Хотя это не идеальное решение, оно может решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...