КатегорииLinuxMongoDBАдминистрирование

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

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

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

sudo yum install -y yum-utils \
   device-mapper-persistent-data \
   lvm2; \
 sudo yum-config-manager \
   --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo; \
 sudo yum install -y docker-ce; \
 sudo systemctl enable docker; \
 sudo systemctl start docker; \ 
 sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose; \
 sudo chmod +x /usr/local/bin/docker-compose; \
 sudo yum install -y git;

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

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

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

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

security:
  keyFile: /mongo-keyfile # Ключ авторизации

replication:
  replSetName: rep0 # Название реплики, можно любое

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

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

version: '3.1'

services:
  mongo_replica:
    build:
      context: ./
      dockerfile: Dockerfile
    command: mongod --config /etc/mongo/replica.yml # запуск
    volumes: # мапим папки и файл конфига
      - ./config/replica.yml:/etc/mongo/replica.yml
      - ./data:/data/db
      - ./backups:/backups
    ports:
      - 27017:27017 # задаем порт
    extra_hosts: # тут мы задаем /etc/hosts для Docker
      - "mongo1:195.201.218.210" # задайте
      - "mongo2:195.201.218.211" # ip ваших
      - "mongo3:195.201.218.212" # серверов

     5.  Файл Dockerfile:

# задаем версию MongoDB
FROM mongo:4.0

WORKDIR / # будем работать в корне

# Копируем ключ авторизации и задаем права
COPY ./config/mongo-keyfile .
RUN chmod 400 mongo-keyfile
RUN chown mongodb:mongodb mongo-keyfile

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

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

docker-compose up -d
docker-compose logs -f

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

docker-compose exec mongo_replica mongo

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

use admin

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

rs.initial()

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

db.createUser({"user": "admin", "pwd": "password", "roles":[{"role": "root", "db": "admin"}]})

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

docker-compose exec mongo_replica mongo -u admin -p password --authenticationDatabase admin

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

cfg = rs.conf();
cfg.members[0].host = "mongo1:27017";
rs.reconfig(cfg);

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

rs.add("mongo2")
rs.add("mongo3")

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *