2017-01-31 4 views
0

В большинстве руководств рекомендуют использовать mongodump/mongorestore, но для больших баз данных продуктов простои могут быть очень длиннымиКак перейти от MMAPv1 к WiredTiger с минимальным временем простоя без mongodump/mongorestore

+0

Является ли это вопрос? – Oisin

+0

Пожалуйста, используйте Q & A формат Stack Overflow: Разделите вопрос и ответ (отредактируйте свой вопрос, удалите ответ с него, затем добавьте его в качестве ответа - вы можете добавить ответ на свой вопрос.) – Steeve

+0

Спасибо. я починил это –

ответ

0

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

  1. Вам нужно 3 работает MongoDB экземпляра:

    • Ваш сервер вы хотите обновить (напомним, что поддержка WiredTiger так 3.0).
    • Второй экземпляр MongoDB, который может быть запущен на дополнительном сервере. Репликация будет временно скопирована в базу данных.
    • И третий экземпляр MongoDB является арбитром, который не хранит данные и участвует только в выборах первичного сервера. Арбитр может быть запущен на дополнительном сервере на отдельном порту.
  2. В любом случае вам необходимо сделать резервную копию своей базы данных. Вы можете запустить «mongodump« без параметров и каталога »./dump» будет создан с дампом базы данных. Вы можете использовать параметр «--gzip» для сжатия размера результата.

    mongodump --gzip 
    

    Только в случае, команда восстановления:

    mongorestore --gzip 
    

    Он должен работать в том же каталоге, где «./dump» реж и «--gzip«параметр должен добавляется, если используется в «mongodump».

  3. Начать настройку с дополнительного сервера. Моя целевая система - Linux RedHat без Интернета, поэтому я загружаю и устанавливаю MongoDB через RPM вручную. Добавить раздел в /etc/mongod.conf:

    replication: 
        oplogSizeMB: 10240 
        replSetName: REPLICA 
    

    Убедитесь, что чистый раздел выглядеть так, чтобы разрешить доступ с других серверов:

    net: 
        bindIp: 0.0.0.0 
        port: 27017 
    

    и тестирований:

    service mongod start 
    
  4. Запустить третий экземпляр MongoDB - арбитр. Он может работать на дополнительном сервере на другом порту. Создайте временный каталог для базы данных арбитра:

    mkdir /tmp/mongo 
    chmod 777 -R /tmp/mongo 
    

    и запуск:

    mongod --dbpath /tmp/mongo --port 27001 --replSet REPLICA \ 
        --fork --logpath /tmp/mongo/db1.log 
    
  5. Теперь необходимо настроить главный сервер. Измените/etc/mongod.конф

    replication: 
        oplogSizeMB: 10240 
        replSetName: REPLICA 
    

    и перезапустить MongoDB на главном сервере:

    service mongod restart 
    
  6. Это важно! После перезапуска операции чтения основного сервера могут быть недоступны. Я получаю следующее сообщение об ошибке:

    { "ok" : 0, "errmsg" : "node is recovering", "code" : 13436 } 
    

    Так как можно быстрее Вам нужно подключиться к MongoDB на главном сервере с помощью «Монго» консоль и выполните следующую команду, чтобы настроить репликацию:

    rs.initiate(
    { 
        _id: "REPLICA", 
        members: [ 
        { _id: 0, host : "<IP address of main server>:27017", 
           priority: 1.0 }, 
        { _id: 1, host : "<IP address of additional server>:27017", 
           priority: 0.5 }, 
        { _id: 2, host : "<IP address of additional server(the arbiter)>:27001", 
           arbiterOnly : true, priority: 0.5 } 
        ] 
    } 
    ) 
    

    После этой операции будут доступны все действия с MongoDB и начнется синхронизация данных.

    Я не рекомендую использовать rs.initiate() на главном сервере без параметров, как и в большинстве учебников, потому что имя главного сервера будет настроен по умолчанию как имя-DNS от /и т.д./имя хоста. Это не очень удобно для меня, потому что я использую IP-адреса для связи в своих проектах.

    Чтобы проверить ход выполнения синхронизации можно вызвать из «Монго» консоль:

    rs.status() 
    

    Результат Пример:

    { 
        "set" : "REPLICA", 
        "date" : ISODate("2017-01-19T14:30:34.292Z"), 
        "myState" : 1, 
        "term" : NumberLong(1), 
        "heartbeatIntervalMillis" : NumberLong(2000), 
        "members" : [ 
         { 
          "_id" : 0, 
          "name" : "<IP address of main server>:27017", 
          "health" : 1.0, 
          "state" : 1, 
          "stateStr" : "PRIMARY", 
          "uptime" : 165, 
          "optime" : { 
           "ts" : Timestamp(6377323060650835, 3), 
           "t" : NumberLong(1) 
          }, 
          "optimeDate" : ISODate("2017-01-19T14:30:33.000Z"), 
          "infoMessage" : "could not find member to sync from", 
          "electionTime" : Timestamp(6377322974751490, 1), 
          "electionDate" : ISODate("2017-01-19T14:30:13.000Z"), 
          "configVersion" : 1, 
          "self" : true 
         }, 
         { 
          "_id" : 1, 
          "name" : "<IP address of additional server>:27017", 
          "health" : 1.0, 
          "state" : 5, 
          "stateStr" : "STARTUP2", 
          "uptime" : 30, 
          "optime" : { 
           "ts" : Timestamp(0, 0), 
           "t" : NumberLong(-1) 
          }, 
          "optimeDate" : ISODate("1970-01-01T00:00:00.000Z"), 
          "lastHeartbeat" : ISODate("2017-01-19T14:30:33.892Z"), 
          "lastHeartbeatRecv" : ISODate("2017-01-19T14:30:34.168Z"), 
          "pingMs" : NumberLong(3), 
          "syncingTo" : "<IP address of main server>:27017", 
          "configVersion" : 1 
         }, 
         { 
          "_id" : 2, 
          "name" : "<IP address of additional server (the arbiter)>:27001", 
          "health" : 1.0, 
          "state" : 7, 
          "stateStr" : "ARBITER", 
          "uptime" : 30, 
          "lastHeartbeat" : ISODate("2017-01-19T14:30:33.841Z"), 
          "lastHeartbeatRecv" : ISODate("2017-01-19T14:30:30.158Z"), 
          "pingMs" : NumberLong(0), 
          "configVersion" : 1 
         } 
        ], 
        "ok" : 1.0 
    } 
    

    После «stateStr» дополнительного сервера будет заменен от "STARTUP2" до "SECONDARY", наши серверы являются синхронизированы.

  7. Пока мы ждем окончания синхронизации, необходимо немного изменить клиентские приложения, чтобы они могли работать со всеми серверами в реплике.

    • Если вы используете ConnectionString, вы должны заменить его чем-то вроде:

      mongodb://<IP address of main server>:27017,<IP address of additional server>:27017,<IP address of additional server (the arbiter)>:27001/?replicaSet=REPLICA 
      
    • Если вы используете C++ наследство Монго-CXX-водитель, как я, вы должны использовать Монго :: DBClientReplicaSet вместо mongo :: DBClientConnection и список всех трех серверов в параметрах соединения, включая арбитр.

    • Существует третий вариант - вы можете просто изменить IP сервер MongoDB в клиентах после переключения ГЛАВНЫХ - СРЕДНЕЙ, но это не очень справедливо.

  8. После синхронизации закончилась и дополнительный статус сервера установлен как ВТОРИЧНАЯ, нам нужно переключить ГЛАВНЫЙ и СРЕДНЕЙ, выполнив команду «Монго» на консоль главный сервер. Это важно, потому что команда не будет работать на дополнительном сервере.

    cfg = rs.conf() 
    cfg.members[0].priority = 0.5 
    cfg.members[1].priority = 1 
    cfg.members[2].priority = 0.5 
    rs.reconfig(cfg) 
    

    Затем проверьте состояние сервера, выполнив:

    rs.status() 
    
  9. Остановите MongoDB на главном сервере

    service mongod stop 
    

    и просто удалить все содержимое каталога с базой данных. Это безопасно, потому что у нас есть рабочая копия на дополнительном сервере, и в начале мы сделали резервную копию. Быть осторожен. MongoDB не создает сам каталог базы данных. Если вы удалили его, вам нужно не только восстановить

    mkdir /var/lib/mongo 
    

    и настройки владельца:

    chown -R mongod:mongod /var/lib/mongo 
    
  10. Проверить wiredTiger хранения двигатель настроен в /etc/mongod.conf. Из 3.2 используется по умолчанию:

    storage: 
        ... 
        engine: wiredTiger 
        ... 
    

    И запустить MongoDB:

    service mongod start 
    

    Основной сервер будет получать конфигурацию из вторичного сервера автоматически и данные будут синхронизированы на хранение WiredTiger.

  11. После завершения синхронизации переключитесь на сервер ПЕРВЫЙ. Эта операция должна выполняться на дополнительном сервере, так как теперь это PRIMARY.

    cfg = rs.conf() 
    cfg.members[0].priority = 1 
    cfg.members[1].priority = 0.5 
    cfg.members[2].priority = 0.5 
    rs.reconfig(cfg) 
    
  12. Возврат старой версии базы данных клиентов или изменить ConnectionString назад.

  13. Теперь отключите репликацию, если необходимо. Удалить 2 сервера репликации из главного сервера:

    rs.remove("<IP address of additional server>:27017") 
    rs.remove("<IP address of additional server (the arbiter)>:27001") 
    

    Удалить все раздел «репликации» из /и т.д./mongod.Conf и перезапустить MongoDB:

    service mongod restart 
    

    После этого мы получим предупреждение при подключении через «Монго» Консоль:

    2017-01-19T12:26:51.948+0300 I STORAGE [initandlisten] ** WARNING: mongod started without --replSet yet 1 documents are present in local.system.replset 
    2017-01-19T12:26:51.948+0300 I STORAGE [initandlisten] **   Restart with --replSet unless you are doing maintenance and no other clients are connected. 
    2017-01-19T12:26:51.948+0300 I STORAGE [initandlisten] **   The TTL collection monitor will not start because of this. 
    

    Чтобы избавиться от него, вам нужно удалить базу данных « местный ". Существует только одна коллекция «startup_log» в этой базе данных в состоянии по умолчанию, так что вы можете сделать это без страха через «Монго» консольного

    use local 
    db.dropDatabase() 
    

    и перезапустить MongoDB:

    service mongod restart 
    

    Если вы удалите «local» перед «репликацией» раздел от /etc/mongod.conf, это im восстановлен. Поэтому я не мог перезапустить только один MongoDB.

  14. На дополнительном сервере выполнить те же действия:

    • «репликации«раздел из удалить /etc/mongod.conf
    • рестарт MongoDB
    • уронить «местного "База данных
    • повторно перезагрузить
  15. Арбитр просто остановить и удалить:

    pkill -f /tmp/mongo 
    rm -r /tmp/mongo 
    
Смежные вопросы