Para entender a replicação do mariadb criei os seguintes containers 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
O master é mariadb1 e para este eu executei:
CREATE USER 'replication_user'@'%' IDENTIFIED BY 'S3cretPw';
GRANT REPLICATION SLAVE ON *.* TO 'replication_user'@'%';
Para cada um dos escravos mariadb2 e mariadb3 eu executo:
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;
Também iniciei os escravos com START SLAVE;
Depois de executar o
SHOW SLAVE STATUS \G
Recebi o seguinte erro:
Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MariaDB server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
Como isso pode acontecer se eu usei
MARIADB_SERVER_ID=1
MARIADB_SERVER_ID=2
MARIADB_SERVER_ID=3
para cada um dos meus contêineres?
Estou tentando seguir:
Por que você acha que definir a
MARIADB_SERVER_ID
variável de ambiente definirá o id do servidor mariadb? Não consigo encontrar isso mencionado nem na documentação do mariadb nem na documentação da imagem do contêiner (ou na lista de variáveis de ambiente ). O mesmo vale para a maioria das suas outrasMARIADB_*
variáveis.Você pode fazer as coisas funcionarem se:
Isso pode parecer algo como:
Isso criará automaticamente o usuário de replicação para você (porque definimos
MARIADB_REPLICATION_USER
eMARIADB_REPLICATION_PASSWORD
) e configurará automaticamente as réplicas a serem replicadasmariadb1
(porque também definimosMARIADB_MASTER_HOST
para as réplicas).Esta é, incidentalmente, uma oportunidade fantástica para usar
docker compose
, porque torna essas longasdocker run
linhas de comando muito mais fáceis de gerenciar. Coloquei tudo acima em umcompose.yaml
que se parece com isto:Tenho um
.env
arquivo parecido com este:Isso me permite simplificar
docker compose up
edocker compose down
todo o ambiente. Você pode encontrar os arquivos referenciados nesta resposta neste repositório .