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:
![](https://conhecimento.engematica.com.br/wp-content/uploads/2024/09/Screenshot-from-2024-09-12-09-52-45.png)
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:
![](https://conhecimento.engematica.com.br/wp-content/uploads/2024/09/image.png)
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