OMySQL é um sistema de gerenciamento de banco de dados relacional que é um dos projetos de código aberto mais populares. Embora conhecido por sua estabilidade, o MySQL é ainda mais confiável se a replicação de réplica de origem estiver configurada. Na replicação, um servidor MySQL é normalmente designado como origem . Uma origem envia todas as alterações de banco de dados e atualizações de dados para uma ou mais réplicas servidores de banco de dados. O procedimento de replicação de dados do MySQL é flexível e os servidores de réplica não precisam estar permanentemente conectados à fonte. Este guia explica como configurar a replicação de dados de réplica de origem no MySQL.
Como funciona a replicação de dados do MySQL
O processo de replicação armazena os dados primeiro no banco de dados de origem e depois os copia para qualquer réplica. Depois de processar a instrução, o servidor de banco de dados de origem rastreia a alteração em um log binário. O log serve como um registro sequencial de todas as alterações na estrutura e no conteúdo do banco de dados.
SELECT
as instruções não são gravadas porque não alteram o conteúdo do banco de dados. As atualizações acontecem de forma assíncrona, para que as réplicas não precisem estar continuamente conectadas. Isso contrasta com as arquiteturas síncronas de sistemas de alta confiabilidade. Se a sincronização em tempo real for necessária, o MySQL recomenda usar o NDB Cluster .
Cada réplica extrai dados da fonte solicitando o conteúdo do log binário da fonte. A réplica então aplica as instruções em ordem, reproduzindo efetivamente os eventos que ocorreram na origem. Cada réplica é independente e mantém o controle de sua posição atual com o log binário de origem. Além disso, cada réplica pode sincronizar com a origem de acordo com seu próprio agendamento. Os dados podem ser lidos de qualquer um dos servidores, incluindo as réplicas.
O MySQL permite um alto grau de granularidade. É possível replicar sobre determinados bancos de dados ou mesmo tabelas específicas dentro de um banco de dados. O formato de replicação padrão é Replicação Baseada em Instrução (SBR), no qual toda a instrução SQL é replicada. No entanto, a Replicação Baseada em Linha (RBR) também está disponível. Esse formato replica as linhas que foram alteradas. Também é possível configurar configurações muitos-para-muitos mais complicadas. Consulte a Documentação do MySQL para obter mais informações sobre as diferentes opções de replicação.
Observação O MySQL anteriormente se referia à replicação de réplica de origem como “replicação mestre-escravo”. A MySQL Organization mudou recentemente a terminologia, explicando seu raciocínio na atualização da terminologia. O termo antigo “mestre” foi alterado para “fonte”, enquanto um “escravo” agora é chamado de “réplica”. Os termos antigos ainda podem aparecer em certos comandos e exibições de saída enquanto o MySQL atualiza sua base de código. Este guia usa os termos preferidos do MySQL em todas as instruções.
Vantagens da replicação de dados MySQL
Habilitar a replicação de réplica de origem oferece muitas vantagens significativas em relação a um sistema não redundante. A lista abaixo fornece uma visão geral de alguns benefícios:
-
É fácil criar uma cópia de backup ao vivo a qualquer momento. Como o processo de replicação é assíncrono, a replicação pode ocorrer de acordo com qualquer agendamento. As réplicas não precisam ser mantidas em sincronia com a origem para funcionar de forma confiável.
-
Adicionar uma réplica pode aumentar o tempo de atividade e a confiabilidade de todo o sistema. O controle primário pode alternar para a réplica se for necessária manutenção ou se o banco de dados de origem não estiver disponível.
-
Cada réplica fornece outra instância legível do banco de dados. Isso permite que programas de análise ou mineração de dados consultem a réplica sem colocar uma carga adicional no banco de dados de origem original.
-
Essa arquitetura aumenta a escalabilidade e o desempenho. O banco de dados lê eSELECT
instruções podem ser balanceadas entre os servidores, reduzindo a latência.
-
Terceiros podem obter acesso somente leitura a um banco de dados por meio de uma réplica e não precisam mais acessar a fonte. Um banco de dados de réplica pode ser criado sob demanda quando necessário e destruído quando não for mais necessário. Essa técnica aumenta a segurança e garante que seja impossível adulterar os dados originais.
Antes de começar
-
Se você ainda não o fez, crie uma conta Linode e Compute Instance. Veja nossos guias de Introdução ao Linode e Criação de uma instância de computação.
-
Siga nosso guia Configurando e protegendo uma instância de computação para atualizar seu sistema. Você também pode definir o fuso horário, configurar seu nome de host, criar uma conta de usuário limitada e proteger o acesso SSH.
-
Você deve ter pelo menos dois Linodes separados para configurar a replicação de réplica de origem do MySQL. Um Linode hospeda o banco de dados de origem, enquanto outro nó é necessário para o servidor de réplica.
Observação As etapas neste guia foram escritas para um usuário não root. Comandos que requerem privilégios elevados são prefixados comsudo
. Se você não estiver familiarizado com osudo
comando, consulte o guia de usuários e grupos do Linux.
Configurar replicação de réplica de origem no MySQL
Para configurar a replicação de réplica de origem, o MySQL deve ser instalado em dois servidores separados que podem se comunicar entre si. Essas instruções são voltadas para a distribuição Ubuntu, mas geralmente são aplicáveis a todas as distribuições Linux. O processo consiste nas seguintes etapas:
- Instale o MySQL.
- Configure o banco de dados de origem MySQL.
- Configure um novo usuário MySQL para a réplica.
- Prepare os dados do MySQL para replicação.
- Configure o banco de dados de réplica MySQL.
- Importe os dados replicados do MySQL e ative a replicação.
Instalar o MySQL
Se o MySQL ainda não estiver disponível em ambos os Linodes, instale-o seguindo os seguintes passos:
-
Atualize os Linodes.
sudo apt-get update && sudo apt-get upgrade
-
Instale o servidor MySQL e os aplicativos cliente nos servidores de origem e de réplica.
sudo apt-get install mysql-server mysql-client -y
-
Configure as opções de segurança, incluindo a senha de root, usando omysql_secure_installation
comando.
sudo mysql_secure_installation
-
Se você estiver usando um firewall comoufw
, certifique-se de permitir o tráfego do MySQL. Adicione a seguinte regra para abrir a porta3306
no firewall.
ufw allow mysql
Configurar o banco de dados de origem MySQL
Para habilitar a replicação do MySQL, edite algumas variáveis no arquivo de configuração principal do MySQL. Faça as seguintes alterações na configuração do banco de dados de origem.
-
Localize o arquivo de configuração principal do MySQL no servidor de banco de dados de origem. Este arquivo é normalmente encontrado em/etc/mysql/mysql.conf.d/mysqld.cnf
. No entanto, em instalações anteriores, ele pode estar localizado em/etc/my.cnf
ou/etc/mysql/my.cnf
. Também pode ser referenciado a partir de um dos arquivos através de umincludedir
diretiva.
-
Abra o arquivo de configuração do MySQL e altere obind-address
para o endereço IP do servidor de origem.
- Arquivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = <source_ip_address>
-
Remova o comentário ou adicione as linhas paraserver-id
elog-bin
. Defina oserver-id
para1
elog-bin
para/var/log/mysql/mysql-bin.log
.
Observação Certifique-se de que a
skip_networking
variável não é declarada em nenhum lugar. Comente se aparecer dentro deste arquivo. Para replicar um único banco de dados, adicione a linhabinlog_do_db = <database_name>
para o arquivo.- Arquivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3
server-id = 1 log_bin = /var/log/mysql/mysql-bin.log
-
Reinicie o serviço MySQL.
sudo systemctl restart mysql
-
Verifique o status do MySQL e certifique-se de que estejaactive
.
sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled) Active: active (running) since Sun 2021-05-30 13:06:47 UTC; 1 day 1h ago
Configurar um novo usuário MySQL para a réplica
Você deve criar um novo usuário no servidor de origem para representar a réplica. Novos usuários são criados dentro do shell do MySQL.
-
Digite o shell do MySQL.
sudo mysql -u root -p
-
Adicione um usuário para a conta de réplica usando o MySQLCREATE USER
sintaxe. O nome de usuário deve consistir no nome da conta de réplica, um@
símbolo e o endereço IP do servidor de réplica. Escolha uma senha mais segura para a conta no lugar deREPLICA_PASSWORD
.
CREATE USER 'replica_account_name'@'replica_ip_address‘ IDENTIFIED WITH sha256_password BY 'REPLICA_PASSWORD';
Observação Para permitir que a réplica possa se conectar de qualquer endereço, especifique o usuário como
'replica_account_name'@'%'
. O%
símbolo representa qualquer endereço ou domínio. Isso fornece flexibilidade extra às custas de alguma segurança. -
Conceda direitos de replicação ao usuário de réplica remota.
GRANT REPLICATION SLAVE ON *.* TO 'replica_account_name'@'replica_ip_address';
Prepare os dados do MySQL para replicação
Neste ponto, é necessário liberar e bloquear o banco de dados de origem para preparar os dados para replicação.
-
Permaneça dentro do shell do MySQL e libere os privilégios para recarregar as tabelas de concessão sem reiniciar o banco de dados.
FLUSH PRIVILEGES;
-
Bloqueie o banco de dados para congelar o banco de dados em um ponto estável do qual exportar os dados. Mantenha o cliente MySQL em execução até exportar o banco de dados. Digitar qualquer comando de gravação ou sair do shell do MySQL libera o bloqueio.
FLUSH TABLES WITH READ LOCK;
Cuidado Este comando bloqueia todos os commits para o banco de dados de origem. Exporte os dados antes de permitir que a origem processe mais confirmações. Caso contrário, o banco de dados de réplica pode ficar corrompido ou inconsistente com o banco de dados de origem. Conclua as duas etapas restantes nesta seção o mais rápido possível.
-
Verifique o status do banco de dados usando o comando a seguir. Este comando exibe o arquivo de log atual junto com a posição do último registro neste arquivo. Registre essas informações porque é necessário iniciar a replicação na réplica posteriormente.
SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+------------------+-------------------+ | mysql-bin.000002 | 1301 | | | | +------------------+----------+--------------+------------------+-------------------+ 1 row in set (0.00 sec)
-
Usando o shell do Linux de um console diferente, exporte o banco de dados usando omysqldump
ferramenta. Selecione um nome memorável para o arquivo de destino. Inclua os–master-data
opção para adicionar informações sobre o arquivo de log e a posição do registro atual ao log.
sudo mysqldump -u root -p -–all-databases -–master-data > databasecopy.sql
Observação Para exportar um único banco de dados, inclua o
--opt <database_name>
opção em vez de-–all-databases
. -
De volta ao shell MySQL original, desbloqueie o banco de dados de origem.
UNLOCK TABLES;
-
Saia do shell do MySQL.
QUIT;
-
Copie o arquivo de banco de dados exportado para o servidor de banco de dados de réplica, usandoftp
,scp
, ou outro método de transferência do arquivo.
scp databasecopy.sql [email protected]<replica_ip_address>
Configurar o banco de dados de réplica MySQL
A configuração a seguir deve ser aplicada à configuração do banco de dados de réplica. Para instalar o MySQL no servidor de réplica, consulte a seção Instalar MySQL.
-
Abra o arquivo MySQL principal, geralmente localizado em/etc/mysql/mysql.conf.d/mysqld.cnf
e altere obind-address
para corresponder ao endereço IP do servidor de réplica.
- Arquivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2
bind-address = xx.xx.xx.xx
-
Remova o comentário ou adicione as linhas paraserver-id
elog-bin
. Oserver-id
deve ser definido como2
na réplica, enquanto olog-bin
variável deve ser definida como/var/log/mysql/mysql-bin.log
. Adicione uma variável pararelay-log
e defina-o como/var/log/mysql/mysql-relay-bin.log
.
Observação Certifique-se de que a
skip_networking
variável não está definida em nenhum lugar dentro deste arquivo. Para replicar um único banco de dados, adicione a seguinte diretiva ao arquivobinlog_do_db = database_name
. Para configurar mais de uma réplica, numere oserver-id
valores de forma sequencialmente crescente. Por exemplo, uma segunda réplica teria umserver-id
de3
.- Arquivo:/ etc/mysql/mysql.conf.d/mysqld.cnf
1 2 3 4
server-id = 2 log_bin = /var/log/mysql/mysql-bin.log relay-log = /var/log/mysql/mysql-relay-bin.log
-
Reinicie o serviço MySQL para incorporar as alterações.
sudo systemctl restart mysql
-
Verifique o status do MySQL e certifique-se de que estejaactive
.
sudo systemctl status mysql
mysql.service - MySQL Community Server Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset:> Active: active (running) since Mon 2021-05-31 16:29:48 UTC; 6s ago
-
(Opcional ) O MySQL recomenda usar SSL para se conectar à fonte para maior segurança. Mais informações sobre como configurar o SSL podem ser encontradas na Documentação SSL do MySQL. AFerramenta de configuração RSA pode ser usado para agilizar este processo.
Importar os dados replicados do MySQL e ativar a replicação
A próxima etapa é importar a cópia dos dados do banco de dados, definir a origem de replicação e reiniciar o servidor de banco de dados de réplica. A réplica deve estar sincronizada e pronta para uso.
-
Digite o seguinte comando do shell do Linux para importar o banco de dados de origem. Especifique o nome do banco de dados usado para exportar os dados anteriormente.
sudo mysql -u root -p < databasecopy.sql
-
Faça login no shell do MySQL.
sudo mysql -u root -p
-
Pare a réplica.
STOP REPLICA;
-
Digite oCHANGE REPLICATION SOURCE
comando, juntamente com os seguintes detalhes. Substitua o endereço IP do servidor de banco de dados de origem no lugar desource_ip_address
. ParaSOURCE_USER
eSOURCE_PASSWORD
, insira os detalhes de nome de usuário e senha da réplica na seção Configurar um novo usuário MySQL para a réplica. Para oSOURCE_LOG_FILE
eSOURCE_LOG_POS
valores, insira as informações que você registrou noSHOW MASTER STATUS;
comando.
CHANGE REPLICATION SOURCE TO SOURCE_HOST='source_ip_address',SOURCE_USER='replica_account_name', SOURCE_PASSWORD='REPLICA_PASSWORD', SOURCE_LOG_FILE='log_file_name', SOURCE_LOG_POS=log_position;
Observação Para usar SSL para a conexão, que o MySQL recomenda, adicione o atributo
SOURCE_SSL=1
ao comando. Mais informações sobre como usar SSL em um contexto de replicação de réplica de origem podem ser encontradas na documentação do MySQL. -
Reinicie a réplica.
START REPLICA;
-
Verifique o status da réplica. A réplica deve estar esperando por eventos e não deve haver nenhumLast_IO_Error
ouLast_Error
eventos. OSlave_SQL_Running_State
A entrada deve indicar que a réplica leu o log de retransmissão.
SHOW REPLICA STATUS\G
Slave_IO_State: Waiting for master to send event Master_Host: 178.79.153.39 Master_User: replica Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000006 Read_Master_Log_Pos: 156 Relay_Log_File: mysql-relay-bin.000006 Relay_Log_Pos: 371 Relay_Master_Log_File: mysql-bin.000006 Slave_IO_Running: Yes Slave_SQL_Running: Yes .. Last_Errno: 0 Last_Error: .. Seconds_Behind_Master: 0 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: 5bed9d10-c140-11eb-bc63-f23c92a2a6ac Master_Info_File: mysql.slave_master_info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Testar a replicação de réplica de origem do MySQL
Se o banco de dados de origem já foi preenchido antes da réplica ser instanciada, testes extras serão necessários. Nesse caso, verifique se os bancos de dados e tabelas existentes na origem estão presentes na réplica após a importação dos dados. No
SHOW REPLICA STATUS
exibição, o Slave_SQL_Running_State
a entrada deve ser Slave has read all relay log
. Para verificar se a replicação está ocorrendo corretamente, crie um novo banco de dados ou tabela na origem. Após alguns segundos, a nova entrada deve estar presente na réplica. Valide a presença do banco de dados usando o
SHOW DATABASES;
comando. Para confirmar a presença de uma tabela, mude para o banco de dados usando USE databasename;
, e digite SHOW TABLES;
. Também é uma boa ideia executar o SHOW REPLICA STATUS
comando e examinar a saída para quaisquer erros. O Last_Error
e Last_IO_Error
campos devem estar vazios e a réplica deve permanecer conectada. Saiba mais sobre replicação de réplica de origem do MySQL
A melhor fonte de informações sobre replicação de réplica de origem é a documentação oficial do MySQL. A seção sobre replicação contém informações mais extensas sobre a arquitetura e o processo de instalação. Os fóruns do MySQL também podem ser úteis.
Mais informações
Você pode querer consultar os seguintes recursos para obter informações adicionais sobre este tópico. Embora estes sejam fornecidos na esperança de que sejam úteis, observe que não podemos garantir a precisão ou pontualidade dos materiais hospedados externamente.
- Documentação do MySQL