Mongorestore, похоже, не хватает памяти и убивает процесс монго

В текущей настройке есть два контейнера Mongo Docker, работающие на хостах A и B, с версией Mongo 3.4 и работающие в наборе реплик. Я хотел бы обновить их до версии 3.6 и увеличить число членов, чтобы контейнеры работали на хостах A, B и C. Контейнеры имеют ограничение памяти 8 ГБ и не имеют выделенного подкачки (в настоящее время) и администрируются в Rancher. Итак, мой план состоял в том, чтобы загрузить три новых контейнера, инициализировать для них набор реплик, сделать дамп из контейнера 3.4 и восстановить его в качестве мастера нового набора реплик.

Снятие дампа прошло нормально, и его размер составил около 16 ГБ. Когда я попытался восстановить его на новый мастер 3.6, восстановление началось нормально, но после того, как было восстановлено примерно 5 ГБ данных, процесс монго, похоже, был убит ОС / Rancher, и хотя сам контейнер не перезапускается, процесс MongoDB просто вылетает и перезагружается снова. Если я снова запускаю mongorestore для той же базы данных, он говорит об уникальной ошибке ключа для всех уже вставленных записей, а затем продолжает с того места, где остановился, только чтобы сделать то же самое снова после 5 ГБ или около того. Таким образом, кажется, что mongorestore загружает все записи, которые он восстанавливает в памяти.

Итак, мне нужно найти какое-то решение для этого, и:

  1. Каждый раз, когда происходит сбой, просто запускайте команду mongorestore, чтобы она продолжалась с того места, где остановилась. Вероятно, это должно сработать, но я чувствую себя немного неловко, делая это.
  2. Восстанавливайте базу данных по одной коллекции за раз, но самая большая коллекция больше 5 ГБ, поэтому она также не будет работать должным образом.
  3. Добавьте подкачку или физическую память (временно) в контейнер, чтобы процесс не был уничтожен после того, как у процесса закончится физическая память.
  4. Что-то еще, надеюсь, лучшее решение?

person mpartan    schedule 19.04.2018    source источник
comment
Значит, вы запускаете на одном хосте 3 процесса, требовательных к памяти: mongod v3.4, новый mongod v3.6 и mongorestore?   -  person Vince Bowdren    schedule 20.04.2018
comment
Теперь, когда ты так выразился... да.   -  person mpartan    schedule 20.04.2018


Ответы (6)


Поскольку кажется, что у вас не заканчивается место на диске из-за того, что mongorestore успешно продолжает работу с того места, где оно было успешно остановлено, правильным ответом является сосредоточение внимания на проблемах с памятью. У вас определенно не хватает памяти во время процесса mongorestore.

Я настоятельно рекомендую использовать пространство подкачки, так как это самый простой, надежный, наименее хакерский и, возможно, наиболее официально поддерживаемый способ решения этой проблемы.

В качестве альтернативы, если вы по какой-то причине полностью против использования пространства подкачки, вы можете временно использовать узел с большим объемом памяти, выполнить mongorestore на этом узле, разрешить его репликацию, затем отключить узел и заменить его на узел, которому выделено меньше ресурсов. Этот вариант должен работать, но может стать довольно сложным с большими наборами данных и довольно излишним для чего-то подобного.

person B. Fleming    schedule 19.04.2018
comment
Сделал это с временным увеличением памяти и добавлением пространства подкачки, и все сработало просто отлично. Также добавлен постоянный обмен, как это рекомендуется в документации Mongo. Спасибо! - person mpartan; 20.04.2018
comment
Для меня запуск mongorestore с опцией -vvv verbose заставил его по крайней мере показать «убитый» вместо молчаливого сбоя. Добавление пространства подкачки и увеличение кеша wiredTiger для соответствия сработало для меня. - person Little Brain; 03.03.2021

Увеличение размера подкачки, как указывал другой ответ, сработало для меня. Кроме того, параметр --numParallelCollections определяет количество коллекций, которые mongodump/mongorestore должны выгружать/восстанавливать параллельно. Значение по умолчанию — 4, что может потреблять много памяти.

person Hieu    schedule 15.10.2018
comment
Установка --numParallelCollections на 1 была наиболее эффективным и простым решением для моего случая: экземпляр EC2 с 1 ГБ ОЗУ. - person LucasBordeau; 06.05.2019

Просто документирую здесь свой опыт использования mongodb 4.4 в 2020 году:

Я столкнулся с этой проблемой при восстановлении коллекции размером 5 ГБ на машине с памятью 4 ГБ. Я добавил своп на 4 ГБ, который, похоже, сработал, я больше не видел сообщение KILLED.

Однако через некоторое время я заметил, что мне не хватает многих данных! Оказывается, если mongorestore исчерпает память на последнем шаге (на 100%), он не будет отображаться как убитый, НО ОН НЕ ИМПОРТИРОВАЛ ВАШИ ДАННЫЕ.

Вы хотите убедиться, что видите эту последнюю строку:

[########################]  cranlike.files.chunks  5.00GB/5.00GB  (100.0%)
[########################]  cranlike.files.chunks  5.00GB/5.00GB  (100.0%)
[########################]  cranlike.files.chunks  5.00GB/5.00GB  (100.0%)
[########################]  cranlike.files.chunks  5.00GB/5.00GB  (100.0%)
[########################]  cranlike.files.chunks  5.00GB/5.00GB  (100.0%)
restoring indexes for collection cranlike.files.chunks from metadata
finished restoring cranlike.files.chunks (23674 documents, 0 failures)
34632 document(s) restored successfully. 0 document(s) failed to restore.

В моем случае мне потребовалось 4 ГБ памяти + 8 ГБ подкачки, чтобы импортировать коллекцию GridFS размером 5 ГБ.

person Jeroen    schedule 19.12.2020
comment
Спасибо, что отметили. 0 документов, которые не удалось восстановить, должны быть там, чтобы гарантировать отсутствие потери/пропуска данных. - person Le Quang Nhan; 07.02.2021

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

  1. Запустите MongoDB 3.6 на хосте C
  2. На первичном (в настоящее время A или B) добавьте узел C в набор реплик.
  3. Узел C выполнит первоначальную синхронизацию данных; Это может занять некоторое время
  4. Как только это будет сделано, снимите узел B; в вашем наборе реплик все еще есть два рабочих узла (A и C), поэтому он будет работать непрерывно.
  5. Замените v3.4 на узле B на v3.6 и запустите снова.
  6. Когда узел B будет готов, снимите узел A.
  7. Замените v3.4 на узле A на v3.6 и запустите снова.

У вас останется тот же набор реплик, что и раньше, но теперь с тремя узлами, на которых работает версия 3.4.

PS Обязательно ознакомьтесь с документацией по Обновление набора реплик до 3.6, прежде чем начать.

person Vince Bowdren    schedule 20.04.2018

Я столкнулся с аналогичной проблемой при запуске 3 узлов на одной машине (всего 8 ГБ ОЗУ) в рамках тестирования набора реплик. размер кэша хранилища по умолчанию равен . 5 * (Общая оперативная память - 1 ГБ). Mongorestore заставлял каждый узел использовать полный размер кэша при восстановлении и потреблять всю доступную оперативную память.

Я использую ansible для шаблона этой части mongod.conf, но вы можете установить для cacheSizeGB любое разумное значение, чтобы несколько экземпляров не потребляли ОЗУ.

storage:
    wiredTiger:
        engineConfig:
            cacheSizeGB: {{ ansible_memtotal_mb /  1024 * 0.2 }}
person Johan Adami    schedule 31.03.2020

Я решил проблему OOM, используя параметр --wiredTigerCacheSizeGB mongod. Выдержка из моего docker-compose.yaml ниже:

version: '3.6'
services:
    db:
        container_name: db
        image: mongo:3.2
        volumes:
            - ./vol/db/:/data/db
        restart: always
        # use 1.5GB for cache instead of the default (Total RAM - 1GB)/2:
        command: mongod --wiredTigerCacheSizeGB 1.5
person qwertz    schedule 06.07.2020