В большинстве руководств рекомендуют использовать mongodump/mongorestore, но для больших баз данных продуктов простои могут быть очень длиннымиКак перейти от MMAPv1 к WiredTiger с минимальным временем простоя без mongodump/mongorestore
ответ
Вы можете использовать репликацию и дополнительный сервер для этого или тот же сервер, если позволяет загрузка.
Вам нужно 3 работает MongoDB экземпляра:
- Ваш сервер вы хотите обновить (напомним, что поддержка WiredTiger так 3.0).
- Второй экземпляр MongoDB, который может быть запущен на дополнительном сервере. Репликация будет временно скопирована в базу данных.
- И третий экземпляр MongoDB является арбитром, который не хранит данные и участвует только в выборах первичного сервера. Арбитр может быть запущен на дополнительном сервере на отдельном порту.
В любом случае вам необходимо сделать резервную копию своей базы данных. Вы можете запустить «mongodump« без параметров и каталога »./dump» будет создан с дампом базы данных. Вы можете использовать параметр «--gzip» для сжатия размера результата.
mongodump --gzip
Только в случае, команда восстановления:
mongorestore --gzip
Он должен работать в том же каталоге, где «./dump» реж и «--gzip«параметр должен добавляется, если используется в «mongodump».
Начать настройку с дополнительного сервера. Моя целевая система - Linux RedHat без Интернета, поэтому я загружаю и устанавливаю MongoDB через RPM вручную. Добавить раздел в /etc/mongod.conf:
replication: oplogSizeMB: 10240 replSetName: REPLICA
Убедитесь, что чистый раздел выглядеть так, чтобы разрешить доступ с других серверов:
net: bindIp: 0.0.0.0 port: 27017
и тестирований:
service mongod start
Запустить третий экземпляр MongoDB - арбитр. Он может работать на дополнительном сервере на другом порту. Создайте временный каталог для базы данных арбитра:
mkdir /tmp/mongo chmod 777 -R /tmp/mongo
и запуск:
mongod --dbpath /tmp/mongo --port 27001 --replSet REPLICA \ --fork --logpath /tmp/mongo/db1.log
Теперь необходимо настроить главный сервер. Измените/etc/mongod.конф
replication: oplogSizeMB: 10240 replSetName: REPLICA
и перезапустить MongoDB на главном сервере:
service mongod restart
Это важно! После перезапуска операции чтения основного сервера могут быть недоступны. Я получаю следующее сообщение об ошибке:
{ "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", наши серверы являются синхронизированы.
Пока мы ждем окончания синхронизации, необходимо немного изменить клиентские приложения, чтобы они могли работать со всеми серверами в реплике.
Если вы используете 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 в клиентах после переключения ГЛАВНЫХ - СРЕДНЕЙ, но это не очень справедливо.
После синхронизации закончилась и дополнительный статус сервера установлен как ВТОРИЧНАЯ, нам нужно переключить ГЛАВНЫЙ и СРЕДНЕЙ, выполнив команду «Монго» на консоль главный сервер. Это важно, потому что команда не будет работать на дополнительном сервере.
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()
Остановите MongoDB на главном сервере
service mongod stop
и просто удалить все содержимое каталога с базой данных. Это безопасно, потому что у нас есть рабочая копия на дополнительном сервере, и в начале мы сделали резервную копию. Быть осторожен. MongoDB не создает сам каталог базы данных. Если вы удалили его, вам нужно не только восстановить
mkdir /var/lib/mongo
и настройки владельца:
chown -R mongod:mongod /var/lib/mongo
Проверить wiredTiger хранения двигатель настроен в /etc/mongod.conf. Из 3.2 используется по умолчанию:
storage: ... engine: wiredTiger ...
И запустить MongoDB:
service mongod start
Основной сервер будет получать конфигурацию из вторичного сервера автоматически и данные будут синхронизированы на хранение WiredTiger.
После завершения синхронизации переключитесь на сервер ПЕРВЫЙ. Эта операция должна выполняться на дополнительном сервере, так как теперь это PRIMARY.
cfg = rs.conf() cfg.members[0].priority = 1 cfg.members[1].priority = 0.5 cfg.members[2].priority = 0.5 rs.reconfig(cfg)
Возврат старой версии базы данных клиентов или изменить ConnectionString назад.
Теперь отключите репликацию, если необходимо. Удалить 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.
На дополнительном сервере выполнить те же действия:
- «репликации«раздел из удалить /etc/mongod.conf
- рестарт MongoDB
- уронить «местного "База данных
- повторно перезагрузить
Арбитр просто остановить и удалить:
pkill -f /tmp/mongo rm -r /tmp/mongo
- 1. MySql - создать репликацию с минимальным временем простоя
- 2. MongoDB storageEngine от MMAPv1 к wiredTiger fassert() отказ
- 3. Обновление модуля ядра с минимальным временем простоя и без перезагрузки
- 4. SQL Server: как уменьшить ширину столбца с минимальным временем простоя
- 5. Перенос данных сгенерированных MMAPv1 в WiredTiger
- 6. Как запустить таблицу OPTIMIZE с минимальным временем простоя
- 7. Как свалить кучу в окнах с минимальным временем простоя?
- 8. Обновите базу данных readonly с минимальным временем простоя
- 9. Перенастройка Redis на AWS Elasticache с минимальным временем простоя
- 10. ли WiredTiger из MongoDb имеет вопрос производительности перераспределении как MMAPv1
- 11. UIDatePicker с минимальным временем
- 12. Обновите локальную базу данных от heroku postgresql с минимальным временем простоя
- 13. AlwaysOn с TDE и временем простоя
- 14. найти медиану с минимальным временем в массиве
- 15. Как перезагрузить переменные среды в контейнере-контейнере с минимальным временем простоя?
- 16. Обновление сертификата SSL с нулевым временем простоя
- 17. Каков наилучший способ обновления базы данных mysql (5.5) до 5.6 с минимальным временем простоя
- 18. AWS Cognito: дело с временем простоя токена
- 19. Экран загрузки jQuery с минимальным временем просмотра
- 20. WiredTiger MongoDB engine ordering: Является ли «естественный порядок» эквивалентным «заказу» с двигателем WiredTiger в mongodb?
- 21. Как обновить код, работающий как демон с нулевым временем простоя?
- 22. Обновление веб-приложения nodejs websocket с нулевым временем простоя
- 23. Управление временем простоя в Jetty Websocket
- 24. Как загружать все контакты с минимальным временем в Android
- 25. как выполнить запрос выбора sql с минимальным временем выполнения
- 26. Добавление нового узла в масштабируемую систему с нулевым временем простоя
- 27. Закрыть и перейти к активности после простоя пользователя
- 28. Обновление nodejs в производстве с нулевым временем простоя
- 29. Rancher: Можем ли мы развернуть с нулевым временем простоя
- 30. как перейти от Cs3 к Flex
Является ли это вопрос? – Oisin
Пожалуйста, используйте Q & A формат Stack Overflow: Разделите вопрос и ответ (отредактируйте свой вопрос, удалите ответ с него, затем добавьте его в качестве ответа - вы можете добавить ответ на свой вопрос.) – Steeve
Спасибо. я починил это –