Тест Репликации 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):
- Подключитесь к контейнеру:
docker exec -it mariadb-master1 mysql -uroot -prootpassword
- Создайте пользователя для репликации (если не использовали переменные окружения):
CREATE USER 'repl'@'%' IDENTIFIED BY '!ПАРОЛЬ!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
- Получите позицию бинарного лога:
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;
Запишите значения File и Position.
- Сделайте дамп базы (если нужно):
docker exec mariadb-master1 mysqldump -uroot -prootpassword --all-databases > master_dump.sql
- Разблокируйте таблицы:
UNLOCK TABLES;
На втором сервере (master2):
- Восстановите дамп (если делали):
docker exec -i mariadb-master2 mysql -uroot -prootpassword < master_dump.sql
- Настройте репликацию на 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):
- Получите позицию бинарного лога на master2:
SHOW MASTER STATUS;
- Настройте репликацию на 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.
Дополнительные советы
- Для автоматической настройки можно использовать скрипты инициализации, помещенные в
/docker-entrypoint-initdb.d/ - Для продакшена используйте Docker secrets для хранения паролей
- Настройте healthcheck в docker-compose для мониторинга состояния репликации
- Рассмотрите использование Docker Swarm или Kubernetes для оркестрации
Пример автоматической настройки
Можно создать файл init.sql в папке ./master1/config:
CREATE USER 'repl'@'%' IDENTIFIED BY 'replpassword';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
И аналогичный для master2, который будет выполнен при первом запуске контейнера.