Utilizado Ubuntu Server 24.04 LTS e o MySQL Server versão 8 em ambos servidores.

Na configuração da replicação MySQL Master-Master os servidores funcionam como Master e Slave. O Master 1 é Slave do Master 2 e o Master 2 é slave do Master 1, assim como são Masters um do outro. Para configurarmos, vamos dividir nosso tutorial em 2 Etapas, nesta primeira, vamos incialmente preparar o ambiente. Sigamos para a configuração.

ETAPA 1

Permita a comunicação pela porta de acesso do MySQL:

  • sudo ufw allow 3306/tcp

Agora com a porta liberada, vamos a configuração do arquivos de configuração my.cnf. Você poderá encontrá-lo no diretório:

/etc/mysql/my.cnf

Observe que nele há um !include dir /etc/mysql/mysql.conf.d/mysqld.cnf

Neste exemplo alterei o mysqld.cnf de ambos os servidores, pois é onde está a estrutura do [mysqld], que é o que buscamos. Antes de fazer qualquer alteração, façamos um backup do mysqld.cnf com o comando:

  • sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf_bkp

Agora vamos a alteração do arquivo. Abra-o com o editor de texto da sua preferência, em nosso exemplo irei utilizar o VIM:

  • sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

Para o master 1, adicione as linhas:

[mysqld]
server-id = 1
default_authentication_plugin=mysql_native_password
log-bin=/var/lib/mysql/mysql-bin.log
auto-increment-increment = 2
auto-increment-offset = 1

Além de adicionar estas linhas, edite a linha correspondente ao bind-address e insira o IP 0.0.0.0:

bind-address = 0.0.0.0

Obs: Não altere a identação do código.

Ao alterar, pode salvar e fechar o arquivo. No master 2 Repita o backup do cnf, continue na alteração do arquivo. Assim, modifique o Server-id para 2 e o auto-incremente-offset = 2. Irá ficar dessa forma:

[mysqld]
server-id = 2
default_authentication_plugin=mysql_native_password
log-bin=/var/lib/mysql/mysql-bin.log
auto-increment-increment = 2
auto-increment-offset = 2

ATENÇÃO! Não esqueça de alterar o bind-address.

Finalizado a configuração dos mysqld.cnf.

Instrução das linhas: Este tipo de replicação utiliza o código mysql-bin.log, ele que vai guardar as alterações entre os servidores, por isto o apontamento do diretório. O server-id, vai identificar cada servidor, de forma alguma poderá ter o mesmo server-id. Os autoincrements, são para garantir que entre a replicação master-master de 2 servidores um deles tenha seu dado inserido com id sempre par e o outro sempre ímpar, não causando conflitos de informações e erro na replicação. Por fim, não menos importante, definimos que o método de autenticação será do plugin nativo do mysql.

ETAPA 2

Para continuarmos, vamos primeiramente pegar o IP Público de cada servidor, utilize o comando:

$ hostname -I
Observação:
-I: é um i maiúsculo.

Com o IP de cada Servidor em mãos, vamos a configuração:

IP Master 1: 192.168.0.5
IP Master 2: 192.168.0.10

Continuando, iremos entrar dentro do mysql de cada servidor, para tal:
sudo mysql

No servidor 1, criemos o usuário, utilizado para a replicação e garantir que ele tenha permissão de replicar o mysql do Master 1:

CREATE USER ‘replicador’@’192.168.0.10’ IDENTIFIED BY ‘suasenhaForte’;

Note que também usaremos o IP do Master 2 para sua segurança sempre defina, caso não queira, substitua o IP por %. Continuando:

GRANT REPLICATION SLAVE ON *.* TO ‘replicador’@’192.168.0.10’;
FLUSH PRIVILEGES;

Repita no Master 2, alterando os dados necessários, segue exemplo:

CREATE USER ‘replicador’@’192.168.0.5’ IDENTIFIED BY ‘suasenhaForte’;
GRANT REPLICATION SLAVE ON *.* TO ‘replicador’@’192.168.0.5’;
FLUSH PRIVILEGES;

Criado os usuários, vamos começar primeiro configurando um Slave, no Master 1 aplique o comando:

show master status \G

Você receberá a seguinte saída:

Para nós irá importar estas informações serão úteis, mantenha aberto. Com outro terminal, se nesta etapa do passo a passo ainda não abriu, é o momento rs. No servidor 2, aplique os comandos:

> STOP SLAVE;
> CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000024‘, MASTER_LOG_POS=157;
> CHANGE MASTER TO MASTER_HOST=’192.168.0.5‘, MASTER_USER=’replicador‘, MASTER_PASSWORD=’suasenhaForte‘, MASTER_LOG_FILE=’mysql-bin.000024‘, MASTER_LOG_POS=157;

Atenção, faça todas as alterações necessárias ao seu cenário, revise antes de aplicar. Concluído, poderá aplicar o comando:

START SLAVE;

Caso tenha feito corretamente já teremos nossa replicação MASTER-SLAVE funcional, para conferir aplique o comando:

SHOW SLAVE STATUS \G

Terá a seguinte saída:

  • Slave_IO_State: Waiting for source to send event
  • Master_Host: 192.168.0.5
  • Master_User: replicador
  • Master_Port: 3306
  • Connect_Retry: 60
  • Master_Log_File: mysql-bin.000024
  • Read_Master_Log_Pos: 157
  • Relay_Log_File: serv-mysql1-relay-bin.000018
  • Relay_Log_Pos: 373
  • Relay_Master_Log_File: mysql-bin.000075
  • Slave_IO_Running: Yes *Ambos os Slaves precisam estar com o status Yes, isto é funcionando!
  • Slave_SQL_Running: Yes
  • Replicate_Do_DB:
  • Replicate_Ignore_DB:
  • Replicate_Do_Table:
  • Replicate_Ignore_Table:
  • Replicate_Wild_Do_Table:
  • Replicate_Wild_Ignore_Table:
  • Last_Errno: 0
  • Last_Error:
  • Skip_Counter: 0
  • Exec_Master_Log_Pos: 157
  • Relay_Log_Space: 636
  • Until_Condition: None
  • Until_Log_File:
  • Until_Log_Pos: 0
  • Master_SSL_Allowed: No
  • Master_SSL_CA_File:
  • Master_SSL_CA_Path:
  • Master_SSL_Cert:
  • Master_SSL_Cipher:
  • Master_SSL_Key:
  • Seconds_Behind_Master: 0 *Tempo de delay entre a replicação dos servidores
  • Master_SSL_Verify_Server_Cert: No
  • Last_IO_Errno: 0
  • Last_IO_Error:
  • Last_SQL_Errno: 0
  • Last_SQL_Error:
  • Replicate_Ignore_Server_Ids:
  • Master_Server_Id: 1
  • Master_UUID: 28bb27e1-663c-11ef-a484-960003aa7953
  • Master_Info_File: mysql.slave_master_info
  • SQL_Delay: 0
  • SQL_Remaining_Delay: NULL
  • Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  • Master_Retry_Count: 86400
  • Master_Bind:
  • Last_IO_Error_Timestamp:
  • Last_SQL_Error_Timestamp:
  • Master_SSL_Crl:
  • Master_SSL_Crlpath:
  • Retrieved_Gtid_Set:
  • Executed_Gtid_Set:
  • Auto_Position: 0
  • Replicate_Rewrite_DB:
  • Channel_Name:
  • Master_TLS_Version:
  • Master_public_key_path:
  • Get_master_public_key: 0
  • Network_Namespace:

Neste momento, todas as adições de bancos de dados no master 1, será sincronizada com o servidor 2 que no momento é apenas um slave. Nesta última fase deste tutorial, vamos configurá-lo como master também. Seguindo a mesma lógica do master 1, verifiquemos o arquivo do log-bin atual e a POS atual, então no server 2, apliquemos:

Agora no servidor 1:

> STOP SLAVE;
> CHANGE MASTER TO MASTER_LOG_FILE=’mysql-bin.000075‘, MASTER_LOG_POS=157;
> CHANGE MASTER TO MASTER_HOST=’192.168.0.10‘, MASTER_USER=’replicador‘, MASTER_PASSWORD=’suasenhaForte‘, MASTER_LOG_FILE=’mysql-bin.000075‘, MASTER_LOG_POS=157;
> START SLAVE;

Caso tenha feito corretamente já teremos nossa replicação MASTER-MASTER funcional, para conferir aplique o comando, também no servidor 1:

SHOW SLAVE STATUS \G

Terá a seguinte saída:

  • Slave_IO_State: Waiting for source to send event
  • Master_Host: 192.168.0.10
  • Master_User: replicador
  • Master_Port: 3306
  • Connect_Retry: 60
  • Master_Log_File: mysql-bin.000075
  • Read_Master_Log_Pos: 157
  • Relay_Log_File: serv-mysql1-relay-bin.000018
  • Relay_Log_Pos: 373
  • Relay_Master_Log_File: mysql-bin.000075
  • Slave_IO_Running: Yes *Ambos os Slaves precisam estar com o status Yes, isto é funcionando!
  • Slave_SQL_Running: Yes
  • Replicate_Do_DB:
  • Replicate_Ignore_DB:
  • Replicate_Do_Table:
  • Replicate_Ignore_Table:
  • Replicate_Wild_Do_Table:
  • Replicate_Wild_Ignore_Table:
  • Last_Errno: 0
  • Last_Error:
  • Skip_Counter: 0
  • Exec_Master_Log_Pos: 157
  • Relay_Log_Space: 636
  • Until_Condition: None
  • Until_Log_File:
  • Until_Log_Pos: 0
  • Master_SSL_Allowed: No
  • Master_SSL_CA_File:
  • Master_SSL_CA_Path:
  • Master_SSL_Cert:
  • Master_SSL_Cipher:
  • Master_SSL_Key:
  • Seconds_Behind_Master: 0 *Tempo de delay entre a replicação dos servidores
  • Master_SSL_Verify_Server_Cert: No
  • Last_IO_Errno: 0
  • Last_IO_Error:
  • Last_SQL_Errno: 0
  • Last_SQL_Error:
  • Replicate_Ignore_Server_Ids:
  • Master_Server_Id: 2
  • Master_UUID: 28bb27e1-663c-11ef-a484-960003aa7953
  • Master_Info_File: mysql.slave_master_info
  • SQL_Delay: 0
  • SQL_Remaining_Delay: NULL
  • Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates
  • Master_Retry_Count: 86400
  • Master_Bind:
  • Last_IO_Error_Timestamp:
  • Last_SQL_Error_Timestamp:
  • Master_SSL_Crl:
  • Master_SSL_Crlpath:
  • Retrieved_Gtid_Set:
  • Executed_Gtid_Set:
  • Auto_Position: 0
  • Replicate_Rewrite_DB:
  • Channel_Name:
  • Master_TLS_Version:
  • Master_public_key_path:
  • Get_master_public_key: 0
  • Network_Namespace:

Poderá encontrar algumas pedras no caminho, mas não desista, aquele que persevera nas boas ações terá sua recompensa (Gl  6:9).

Referência: https://www.devin.com.br/replicacao-mysql/#Replicao-MySQL-Master–Master