Вопрос или проблема
Чтобы понять репликацию mariadb, я создал следующие контейнеры docker:
docker run -e TZ=America/Denver --name mariadb1 --network=camino_nw -e MARIADB_SERVER_ID=1 -e MARIADB_LOG_BIN=mysql-bin -e MARIADB_LOG_BASENAME=mariadb1 -e MARIADB_BINLOG_FORMAT=mixed -p 127.0.0.1:53301:3306 -v /home/jcz/Documents/dockerMariadbData1:/var/lib/mysql:z -e MARIADB_ROOT_PASSWORD=S3cretPw -d mariadb:latest
docker run -e TZ=America/Denver --name mariadb2 --network=camino_nw -e MARIADB_SERVER_ID=2 -e MARIADB_LOG_BIN=mysql-bin -e MARIADB_LOG_BASENAME=mariadb2 -e MARIADB_BINLOG_FORMAT=mixed -p 127.0.0.1:53302:3306 -v /home/jcz/Documents/dockerMariadbData2:/var/lib/mysql:z -e MARIADB_ROOT_PASSWORD=S3cretPw -d mariadb:latest
docker run -e TZ=America/Denver --name mariadb3 --network=camino_nw -e MARIADB_SERVER_ID=3 -e MARIADB_LOG_BIN=mysql-bin -e MARIADB_LOG_BASENAME=mariadb3 -e MARIADB_BINLOG_FORMAT=mixed -p 127.0.0.1:53303:3306 -v /home/jcz/Documents/dockerMariadbData3:/var/lib/mysql:z -e MARIADB_ROOT_PASSWORD=S3cretPw -d mariadb:latest
Мастером является mariadb1, и для него я выполнил:
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'S3cretPw';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
Для каждого из узлов-реплик mariadb2 и mariadb3 я выполнил:
CHANGE MASTER TO MASTER_HOST='mariadb1', MASTER_USER='replication_user', MASTER_PASSWORD='S3cretPw', MASTER_PORT=3306, MASTER_CONNECT_RETRY=10;
CHANGE MASTER TO MASTER_USE_GTID = slave_pos;
Я также запустил реплики с помощью START SLAVE;
После выполнения
SHOW SLAVE STATUS \G
Я получил следующую ошибку:
Last_IO_Error: Фатальная ошибка: Поток ввода-вывода реплики остановлен, так как идентификаторы серверов мастера и реплики равны; эти идентификаторы должны быть различными для работы репликации (или параметр --replicate-same-server-id должен быть использован на реплике, но это не всегда имеет смысл; пожалуйста, проверьте руководство перед его использованием).
Как это может произойти, если я использовал
MARIADB_SERVER_ID=1
MARIADB_SERVER_ID=2
MARIADB_SERVER_ID=3
для каждого из моих контейнеров?
Я пытаюсь следовать:
Ответ или решение
Чтобы настроить репликацию MariaDB в Docker-контейнерах, вы правильно начали, создав три контейнера с разными идентификаторами сервера (MARIADB_SERVER_ID). Однако ошибка, которую вы видите, связана с тем, что MariaDB не может корректно распознать идентификаторы серверов, и как следствие, срабатывает условие, требующее, чтобы идентификаторы серверов были уникальными.
Вот несколько шагов и рекомендаций, которые помогут вам устранить проблему:
-
Проверка идентификаторов серверов: Убедитесь, что при создании контейнеров с помощью
docker run
вы действительно задали уникальные идентификаторы серверов. Ваша команда выглядит верно, но нужно проверить, действительно ли каждая инстанция MariaDB запущена с правильными параметрами. Вы можете сделать это, подключившись к каждому контейнеру и выполнив команду:SHOW VARIABLES LIKE 'server_id';
-
Проверка конфигурации сети: Убедитесь, что контейнеры находятся в одной сети и могут взаимодействовать друг с другом. Вы используете сеть
camino_nw
. Проверьте, что контейнеры действительно подключены к этой сети:docker network inspect camino_nw
-
Удаление старых данных: Если вы запускали контейнеры несколько раз, возможно, старые данные, хранящиеся в указанных вами томах локального хранилища, могут влиять на идентификаторы. Попробуйте удалить папки, которые вы указали в параметрах
-v
перед пересозданием контейнеров. Убедитесь, что все данные очищены:rm -rf /home/jcz/Documents/dockerMariadbData1/* rm -rf /home/jcz/Documents/dockerMariadbData2/* rm -rf /home/jcz/Documents/dockerMariadbData3/*
-
Правильные команды для настройки репликации:
- Убедитесь, что вы правильно используете команды
CHANGE MASTER TO
. Команда для вторичных реплик (mariadb2 и mariadb3) должна выглядеть следующим образом:CHANGE MASTER TO MASTER_HOST='mariadb1', MASTER_USER='replication_user', MASTER_PASSWORD='S3cretPw', MASTER_PORT=3306, MASTER_LOG_FILE='mysql-bin.000001', -- укажите лог файл MASTER_LOG_POS=0, -- укажите позицию MASTER_USE_GTID = current_pos;
- Убедитесь, что вы правильно используете команды
-
Запуск репликации: После того как у вас правильно установлены параметры, запустите репликацию:
START SLAVE;
-
Проверка статуса: После выполнения команды запуска репликации проверьте статус:
SHOW SLAVE STATUS \G;
-
Справка и документация: Если проблема не решается, обратитесь к официальной документации по настройке репликации на сайте MariaDB, которую вы упоминали, для дополнительной информации о возможных проблемах и их решениях.
Если после выполнения всех этих шагов проблема сохраняется, не стесняйтесь задавать дополнительные вопросы, предоставив конкретные сообщения об ошибках и результаты команд для дальнейшей диагностики.