Назад | Перейти на главную страницу

Как безопасно использовать fsyncLock () при резервном копировании одного mongod

Я прочитал в официальной документации MongoDB:

важно: db.fsyncLock () может блокировать чтение, включая те, которые необходимы для проверки аутентификации. Предупреждение: при вызове db.fsyncLock () убедитесь, что соединение остается открытым, чтобы разрешить последующий вызов db.fsyncUnlock (). Закрытие соединения может затруднить снятие блокировки.

В худшем случае я использую fsyncLock (), который блокирует базу данных, но затем я внезапно теряю соединение с базой данных из-за временного сбоя сети. В этом случае я не могу повторно подключиться, потому что fsyncLock () блокирует считыватель. Моя база данных будет заблокирована навсегда.

Сейчас я подумываю о том, чтобы закрыть mongodb, чтобы сделать резервную копию. Какое самое безопасное решение для резервного копирования для одного монгода?

Какое самое безопасное решение для резервного копирования для одного монгода?

Два варианта:

  1. Использовать mongodump против бега mongod. Он не будет блокировать, но вызовет некоторую блокировку чтения и общий шум при резервном копировании ваших баз данных. Обычно это не имеет большого значения, если у вас нет большого количества конфликтов за базу данных.
  2. В зависимости от вашей файловой системы сделайте снимки файловой системы и выполните mongodump --dbpath против этих файлов.

На самом деле у вас должен быть набор реплик и резервное копирование на вторичный.

В зависимости от вашей настройки решение может быть разным.

Предлагаю вам прочитать Резервное копирование и восстановление главу документации mongo, чтобы решить, как это реализовать.

Если вы решите реализовать решение «Снимок файловой системы», которое я предпочитаю другим, вы можете смягчить сетевые проблемы, выполнив db.fsyncLock () и db.fsyncUnlock () непосредственно из процедуры, которая будет выполняться на сервере, где mongo это работает.

Например, на сервере * NIX вы должны иметь возможность сделать правильный снимок, выполнив сценарий, подобный этому:

#!/bin/sh
mongo admin --eval "printjson(db.fsyncLock())"
# create file system snapshot
mongo admin --eval "printjson(db.fsyncUnlock())"
# make the backup of entire snapshot
# release the snapshot

Запустив этот скрипт непосредственно на сервере, где находится mongo, монго клиент подключится к серверу, используя TCP-соединение с 127.0.0.1, и ваши сетевые проблемы исчезнут.