Настройка репликации MariaDB в Docker

Вопрос или проблема

Чтобы понять репликацию 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

для каждого из моих контейнеров?

Я пытаюсь следовать:

https://mariadb.com/kb/en/setting-up-replication/

Ответ или решение

Чтобы настроить репликацию MariaDB в Docker-контейнерах, вы правильно начали, создав три контейнера с разными идентификаторами сервера (MARIADB_SERVER_ID). Однако ошибка, которую вы видите, связана с тем, что MariaDB не может корректно распознать идентификаторы серверов, и как следствие, срабатывает условие, требующее, чтобы идентификаторы серверов были уникальными.

Вот несколько шагов и рекомендаций, которые помогут вам устранить проблему:

  1. Проверка идентификаторов серверов: Убедитесь, что при создании контейнеров с помощью docker run вы действительно задали уникальные идентификаторы серверов. Ваша команда выглядит верно, но нужно проверить, действительно ли каждая инстанция MariaDB запущена с правильными параметрами. Вы можете сделать это, подключившись к каждому контейнеру и выполнив команду:

    SHOW VARIABLES LIKE 'server_id';
  2. Проверка конфигурации сети: Убедитесь, что контейнеры находятся в одной сети и могут взаимодействовать друг с другом. Вы используете сеть camino_nw. Проверьте, что контейнеры действительно подключены к этой сети:

    docker network inspect camino_nw
  3. Удаление старых данных: Если вы запускали контейнеры несколько раз, возможно, старые данные, хранящиеся в указанных вами томах локального хранилища, могут влиять на идентификаторы. Попробуйте удалить папки, которые вы указали в параметрах -v перед пересозданием контейнеров. Убедитесь, что все данные очищены:

    rm -rf /home/jcz/Documents/dockerMariadbData1/*
    rm -rf /home/jcz/Documents/dockerMariadbData2/*
    rm -rf /home/jcz/Documents/dockerMariadbData3/*
  4. Правильные команды для настройки репликации:

    • Убедитесь, что вы правильно используете команды 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;
  5. Запуск репликации: После того как у вас правильно установлены параметры, запустите репликацию:

    START SLAVE;
  6. Проверка статуса: После выполнения команды запуска репликации проверьте статус:

    SHOW SLAVE STATUS \G;
  7. Справка и документация: Если проблема не решается, обратитесь к официальной документации по настройке репликации на сайте MariaDB, которую вы упоминали, для дополнительной информации о возможных проблемах и их решениях.

Если после выполнения всех этих шагов проблема сохраняется, не стесняйтесь задавать дополнительные вопросы, предоставив конкретные сообщения об ошибках и результаты команд для дальнейшей диагностики.

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

Капча загружается...