ТЕХНИЧЕСКАЯ ДОКУМЕНТАЦИЯ

Тест Репликации Master-Master/slave в Docker

> SQL > Mysql/MariaDB
Дата обновления: 26 июля 2025 г. Дата публикации: 26 июля 2025 г. Автор: Стрекаловский Александр

Введение

Master-Master репликация в MariaDB — это метод синхронизации данных между двумя серверами, где каждый сервер является одновременно и мастером, и репликой другого.

Основные сценарии использования:
- Геораспределенные системы
- Отказоустойчивость
- Балансировка нагрузки чтениями

Преимущества и недостатки

Преимущества

✓ Высокая доступность
✓ Распределение нагрузки
✓ Географическая избыточность

Недостатки

✗ Сложность настройки
✗ Риск конфликтов данных
✗ Требовательность к ресурсам

Предварительные требования

  • Два сервера с MariaDB 10.3+
  • Сетевой доступ между серверами (порт 3306)
  • Идентичные версии MariaDB на обоих серверах
  • Достаточные дисковые ресурсы
  • Права администратора на обоих серверах

1. Подготовка docker-compose.yml

Создайте файл docker-compose.yml:

version: '3.4'

services:

  master1:
    image: mariadb:10.6
    container_name: 'master1'
    restart: always
    env_file:
      - .maria.enviroment
    volumes:
      - ./master1/config:/etc/mysql/conf.d
    command: sh -c "chmod -R 644 /etc/mysql/conf.d/*.* && docker-entrypoint.sh mysqld"

  master2:
    image: mariadb:10.6
    container_name: 'master2'
    restart: always
    env_file:
      - .maria.enviroment
    volumes:
      - ./master2/config:/etc/mysql/conf.d
    command: sh -c "chmod -R 644 /etc/mysql/conf.d/*.* && docker-entrypoint.sh mysqld"

networks:
  default:
    external: true
    name: netlamp

2. Настройка конфигурации

Создайте конфигурационные файлы для каждого сервера:

Для master1 (./master1/config/replication.cnf):

[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
log_slave_updates = 1
auto_increment_increment = 2
auto_increment_offset = 1
#Базы данных которые не реплицируем (черный список баз репликации)
binlog_ignore_db=db1
binlog_ignore_db=db2
#базы которые будут реплицироваться (Белый список баз репликации) "не работает с binlog_ignore_db"
binlog_do_db=GH1
binlog_do_db=GH2

Для master2 (./master2/config/replication.cnf):

[mysqld]
server-id = 2
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
log_slave_updates = 1
auto_increment_increment = 2
auto_increment_offset = 2

3. Запуск контейнеров

docker-compose up -d

4. Настройка репликации

На первом сервере (master1):

  1. Подключитесь к контейнеру:
docker exec -it mariadb-master1 mysql -uroot -prootpassword
  1. Создайте пользователя для репликации (если не использовали переменные окружения):
CREATE USER 'repl'@'%' IDENTIFIED BY '!ПАРОЛЬ!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
  1. Получите позицию бинарного лога:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

Запишите значения File и Position.

  1. Сделайте дамп базы (если нужно):
docker exec mariadb-master1 mysqldump -uroot -prootpassword --all-databases > master_dump.sql
  1. Разблокируйте таблицы:
UNLOCK TABLES;

На втором сервере (master2):

  1. Восстановите дамп (если делали):
docker exec -i mariadb-master2 mysql -uroot -prootpassword < master_dump.sql
  1. Настройте репликацию на master2:
CHANGE MASTER TO 
MASTER_HOST='mariadb-master1',
MASTER_USER='repl',
MASTER_PASSWORD='replpassword',
MASTER_LOG_FILE='[значение File с master1]',
MASTER_LOG_POS=[значение Position с master1];
START SLAVE;

Вернитесь на первый сервер (master1):

  1. Получите позицию бинарного лога на master2:
SHOW MASTER STATUS;
  1. Настройте репликацию на master1:
CHANGE MASTER TO 
MASTER_HOST='mariadb-master2',
MASTER_USER='repl',
MASTER_PASSWORD='replpassword',
MASTER_LOG_FILE='[значение File с master2]',
MASTER_LOG_POS=[значение Position с master2];
START SLAVE;

5. Проверка репликации

На обоих серверах выполните:

SHOW SLAVE STATUS \G

Убедитесь, что Slave_IO_Running и Slave_SQL_Running имеют значение Yes.

Дополнительные советы

  1. Для автоматической настройки можно использовать скрипты инициализации, помещенные в /docker-entrypoint-initdb.d/
  2. Для продакшена используйте Docker secrets для хранения паролей
  3. Настройте healthcheck в docker-compose для мониторинга состояния репликации
  4. Рассмотрите использование Docker Swarm или Kubernetes для оркестрации

Пример автоматической настройки

Можно создать файл init.sql в папке ./master1/config:

CREATE USER 'repl'@'%' IDENTIFIED BY 'replpassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;

И аналогичный для master2, который будет выполнен при первом запуске контейнера.