MongoDB реплика с docker-compose

Решил поделиться способом поднятия реплики с помощью docker-compose. Сам пример будут максимально приближен к боевым.

Для полноценной реплики нам понадобиться три сервера с CentOS. На все три сервера надо поставить Docker, Docker Compose и по желанию git:

Создайте папку, назовем ее mongo со следующей структурой:

Структура проекта реплики MongoDB

Подробности:

  1. Папка backups тут предполагается хранить бекапы 
  2. Папка config — файлы настроек:
    1. Файл mongo-keyfile это файл ключа аутентификации между членами реплики. В этом руководстве мы будем использовать сертификат сгенерированный openssl, но для боевых серверов рекомендуется использовать сертификат x.509.   Генерация: openssl rand -base64 756 > mongo-keyfile 
    2. Файл replica.yml это конфиг MongoDB:

3. Папка data — файлы базы данных

   4. Файл docker-compose.yml:

     5.  Файл Dockerfile:

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

Далее выбираем, какой сервер будет у нас главным, возьмем по порядку mongo1. Заходим, переходим в папку с нашим проектом:

Тут мы запустили Doker и пошли смотреть логи если все хорошо и MongoDB успешно запущен, подключаемся к mongo:

Переключаемся в базу admin

Запускаем инициализацию реплики:

Задаем админа:

Отключаем от MongoDB Ctrl+c. Затем подключаемся заново но уже под пользователем admin:

Запускаем команду rs.conf() в разделе members будет указана одна запись это наш текущий сервер, обратите внимание на поле host, сейчас скорей всего какая-то абракадабра типа  «67e2affc55a6:27017» это последствия запуска MongoDB в контейнере. Признаюсь долго не разбирался, как автоматом подставлять правильный host, может вы знаете? Оставьте комментарий если это так. Продолжим. Поправим конфиг:

Все, теперь идем на другие сервера запускаем docker-compose up -d и смотрим логи docker-compose logs -f. Затем возвращаемся на главный сервер подключаемся к MongoDB под нашим пользователем.

Готово, если звезды сошлись, реплика должна успешно заработать 🙂

По поводу подключения можно почитать здесь