Мастер-мастер репликация MySql на Docker

Вы когда-нибудь задумывались, почему Docker так популярен? Docker позволяет легко развернуть необходимое вам окружение в считанные минуты и по мере необходимости добавлять в ваше окружение нужный функционал и быстро его разворачивать практически на любой “машине”*.

В этой статье я собираюсь показать как настроить Master-Master репликацию между двумя Docker контейнерами Mysql.

Требования к железу для установки докер (eng): https://docs.docker.com/datacenter/ucp/1.1/installation/system-requirements/

Инструкция по установке, где вы можете посмотреть как установить Docker для вашей ОС: https://docs.docker.com/engine/installation/

Шаг 1 — Подготовка структуры папок и конфигураций mysql

Прежде всего мы создадим структуру каталогов, как показано ниже, для каждого, отдельно взятого mysql сервера.

~/server#/backup — Тут будут лежать необходимые нам sql файлы

~/server#/data — Точка входа, откуда будем монтировать данные. При каждом перезапуске, в этом каталоге будут сохраняться данные.

~/server#/log — Логи mysql сервера

~/server#/conf.d — Каталог будет содержать файлы конфигурации.

Конфигурация mySQL:

~/server1/conf.d/server1.cnf:

~/server1/backup/initdb.sql

~/server2/conf.d/server2.cnf

~/server2/backup/initdb.sql

 

Шаг 2 — Запуск Docker контейнеров с нашими конфигурациями

После того как мы сделали все нужные нам приготовления мы можем запустить контейнеры с серверами.

Запускаем первый контейнер:

Запускаем второй контейнер:

После запуска каждой нужно немного подождать пока все сервисы внутри контейнера запустятся. Также, обратите внимание, что мы связали контейнер mysql2 с контейнером mysql1 во время запуска командой docker run.

Шаг 3 — Свяжем контейнер mysql1 с контейнером mysql2

Решение скорее экспериментальное, так как, в момент запуска mysql1 у нас еще нет контейнера mysql2. Но в статьях на stackoverflow было найдено решение которое позволило связать mysql1 с mysql2 внутри интерфейса docker0. Главное, что докер просто создает запись хоста в связанном контейнере. Сделаем тоже самое только руками. Следует отметить что при перезапуске контейнеров их IP адреса могут меняться и вам придется пройти эту процедуру еще раз.

Итак. Мы возьмем IP контейнера mysql2 и потом сделаем запись в hosts файл в контейнере  mysql1.

Проверим соединение между двумя контейнерами:

Если все пингуется то можно переходить к следующему шагу.

Шаг 4 — Создание пользователя для репликации и проверка лога

Mysql1 — нужно подключится и выполнить скрипт /backup/initdb.sql

 

Mysql2 — та же операция что и для mysql1


Шаг 5 — Установка источника репликации для контейнеров

Mysql1:

Mysql2:

 

Шаг 6 — Тестирование Master-Master репликации

Для того чтобы протестировать репликацию просто создадим таблицу в контейнере mysql1 и посмотрим появиться ли таблица в контейнере mysql2, а затем удалим таблицу из mysql2 и посмотрим что бы она была удалена из mysql1.

Создадим таблицу:

Посмотрим появилась ли она в mysql2:

Должны увидеть примерно следующее:

Удалим таблицу в mysql2:

И посмотрим результат команды show tables в контейнере mysql1:

Если все шаги пройдены и у вас нет таблиц то можно сказать что репликация Master — Master в mysql работает.

Источники:

P.S. Хотите больше статей по докеру или mysql? пишите в комментариях какие темы вас больше всего интересуют.

P.S.S. В планах написать статью о том как мы внедряли у себя на проекте Docker. (стек: микросервисы на Java, фронт на Symfony + Elasticsearch + Socket.io + …)

Leave a Reply

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