Os bancos de dados podem falhar sem aviso - seja por causa de uma falha causada por um bug de software ou pelos componentes de hardware subjacentes. A nuvem traz outra dimensão à questão, devido à natureza efêmera dos recursos de computação e armazenamento. Para isolar nossa infraestrutura de banco de dados dessas falhas, criamos redundância em nossos sistemas. Se uma instância ficar indisponível, um sistema em espera deverá ser capaz de receber a carga de trabalho e continuar a partir daí. A replicação é um método bem conhecido e amplamente adotado para criar cópias redundantes de um banco de dados mestre.
Neste post, vamos comparar a funcionalidade de replicação nos dois sistemas de banco de dados mais populares do planeta (de acordo com db-engines) - Oracle e MySQL. Veremos especificamente a replicação lógica do Oracle 12c e o MySQL 5.7. Ambas as tecnologias oferecem sistemas de espera confiáveis para descarregar cargas de trabalho de produção e ajudar em caso de desastre. Vamos dar uma olhada em suas diferentes arquiteturas, analisar prós e contras e seguir as etapas de como configurar a replicação com Oracle e MySQL.
Arquitetura Oracle Data Guard – Como funciona
O Oracle Data Guard garante alta disponibilidade, proteção de dados e recuperação de desastres de seus dados. É provavelmente a primeira escolha de um DBA Oracle para replicar dados. A tecnologia foi introduzida em 1990 (versão 7.0) com uma aplicação essencial de logs de arquivamento em bancos de dados standby. O Data Guard evoluiu ao longo dos anos e agora fornece um conjunto abrangente de serviços que criam, mantêm, gerenciam e monitoram bancos de dados em espera.
O Data Guard mantém bancos de dados em espera como cópias do banco de dados de produção. Se o banco de dados primário parar de responder, o Data Guard pode alternar qualquer espera para a função de produção, reduzindo o tempo de inatividade. O Data Guard pode ser usado para técnicas de backup, restauração e cluster para fornecer um alto nível de proteção e disponibilidade de dados.
Data Guard é uma tecnologia Ship Redo / Apply Redo, “redo” é a informação necessária para recuperar transações. Um banco de dados de produção conhecido como banco de dados primário transmite redo para uma ou mais réplicas chamadas de bancos de dados em espera. Quando uma inserção ou atualização é feita em uma tabela, essa alteração é capturada pelo gravador de log em um log de archive e replicada para o sistema em espera. Os bancos de dados em espera estão em uma fase contínua de recuperação, verificando e aplicando redo para manter a sincronização com o banco de dados primário. Um banco de dados em espera também será ressincronizado automaticamente se for temporariamente desconectado do primário devido a falta de energia, problemas de rede etc.
Oracle Data Guard Net Services
O Data Guard Redo Transport Services regula a transmissão de redo do banco de dados primário para o banco de dados standby. O processo LGWR (gravador de log) envia os dados de redo para um ou mais processos do servidor de rede (LNS1, LSN2, LSN3, ...LSNn). O LNS está lendo do buffer de redo na SGA (Shared Global Area) e passa o redo para o Oracle Net Services para transmitir ao banco de dados em espera. Você pode escolher os atributos LGWR:síncrono (LogXptMode ='SYNC') ou modo assíncrono (LogXptMode ='ASYNC'). Com essa arquitetura é possível entregar os dados de redo para diversos bancos de dados standby ou utilizá-los com Oracle RAC (Real Application Cluster). O processo do Remote File Server (RFS) recebe o redo do LNS e o grava em um arquivo regular chamado arquivo de log de redo em espera (SRL).
Existem dois tipos principais de Oracle Data Guard. Bancos de dados físicos com aplicação de redo e bancos de dados de espera lógicos com aplicação de SQL.
Arquitetura de replicação lógica do Oracle Dataguard
O SQL apply requer mais processamento do que o redo aplica, o processo primeiro lê o SRL e "mine" o redo convertendo-o em registros de alteração lógicos e, em seguida, cria transações SQL antes de aplicar o SQL ao banco de dados em espera. Há mais partes móveis, por isso requer mais CPU, memória e E/S, então redobre a aplicação.
O principal benefício do "SQL apply" é que o banco de dados está aberto para leitura e gravação, enquanto o processo de aplicação está ativo.
Você pode até criar exibições e índices locais. Isso o torna ideal para ferramentas de relatório. O banco de dados em espera não precisa ser uma cópia de um para um do banco de dados principal e, portanto, pode não ser o melhor candidato para fins de DR.
As principais características desta solução são:
- Um banco de dados em espera que é aberto para leitura/gravação enquanto a aplicação SQL está ativa
- Possível bloqueio de modificação de dados que está sendo mantido pelo SQL apply
- Capaz de executar atualizações contínuas de banco de dados
Existem inconvenientes. O Oracle usa um log suplementar de chave primária ou restrição/índice exclusivo para reconhecer logicamente uma linha modificada no banco de dados de espera lógica. Quando o log complementar de chave primária e de restrição exclusiva/índice em todo o banco de dados está habilitado, cada instrução UPDATE também grava os valores de coluna necessários no log de redo para identificar exclusivamente a linha modificada no banco de dados de espera lógica. O Oracle Data Guard suporta replicação encadeada, que aqui é chamada de “cascata”, mas não é típica devido à complexidade da configuração.
A Oracle recomenda que você adicione uma chave primária ou um índice exclusivo não nulo às tabelas no banco de dados primário, sempre que possível, para garantir que o SQL Apply possa aplicar com eficiência atualizações de dados de redo ao banco de dados de espera lógica. Isso significa que não funciona em nenhuma configuração, talvez seja necessário modificar seu aplicativo.
Arquitetura Oracle Golden Gate – Como funciona
Com o Data Guard, conforme os blocos são alterados no banco de dados, os registros são adicionados ao redo log. Em seguida, com base no modo de replicação que você está executando, esses registros de log serão copiados imediatamente para o modo de espera ou extraídos para comandos SQL e aplicados. Golden Gate funciona de uma maneira diferente.
Golden Gate apenas replica as alterações depois que a transação é confirmada, portanto, se você tiver uma transação de longa duração, pode demorar um pouco para replicar. O “processo de extração” Golden Gate mantém as alterações transacionais na memória.
Outra grande diferença é que o Oracle Golden Gate permite a troca e manipulação de dados no nível da transação entre várias plataformas heterogêneas. Você não está limitado apenas ao banco de dados Oracle. Ele oferece a flexibilidade de extrair e replicar registros de dados selecionados, alterações transacionais e alterações em DDL (linguagem de definição de dados) em uma variedade de topologias.
Arquitetura Oracle Golden Gate
O fluxo Golden Gate típico mostra dados de banco de dados novos e alterados sendo capturados do banco de dados de origem. Os dados capturados são gravados em um arquivo chamado trilha de origem. A trilha é então lida por uma bomba de dados, enviada pela rede e gravada em um arquivo de trilha remota pelo processo Collector. A função de entrega lê a trilha remota e atualiza o banco de dados de destino. Cada um dos componentes é gerenciado pelo processo Manager.
Replicação lógica MySQL – como funciona
A replicação no MySQL existe há muito tempo e vem evoluindo ao longo dos anos. Existem diferentes maneiras de habilitar a replicação do MySQL, incluindo Replicação de Grupo, Galera Clusters, "Master to Slave" assíncrono. Para comparar a arquitetura Oracle vs. MySQL, focaremos nos formatos de replicação, pois é a base para todos os vários tipos de replicação.
Em primeiro lugar, os diferentes formatos de replicação correspondem ao formato de log binário especificado no arquivo de configuração my.cnf. Independentemente do formato, os logs são sempre armazenados de forma binária, não podendo ser visualizados com um editor comum. Existem três tipos de formato:baseado em linha, baseado em instrução e misto. Misto é a combinação dos dois primeiros. Vamos dar uma olhada na instrução e na linha.
Baseado em declarações – neste caso, estas são as consultas escritas. Nem todas as instruções que modificam dados (como instruções INSERT DELETE, UPDATE e REPLACE) podem ser replicadas usando a replicação baseada em instrução. LOAD_FILE(), UUID(), UUID_SHORT(), USER(), FOUND_ROWS() etc não serão replicados.
Baseado em linha – neste caso, são alterações nos registros. Todas as alterações podem ser replicadas. Esta é a forma mais segura de replicação. Desde 5.7.7, é a opção padrão.
Agora vamos dar uma olhada no que está acontecendo nos bastidores quando a replicação está habilitada.
Arquitetura de replicação MySQL
Em primeiro lugar, o banco de dados mestre grava as alterações em um arquivo chamado log binário ou log binário. A gravação no log binário geralmente é uma atividade leve porque as gravações são armazenadas em buffer e sequenciais. O arquivo de log binário armazena dados que um escravo de replicação processará posteriormente, a atividade do mestre não depende deles. Quando a replicação for iniciada, o mysql acionará três threads. Um no mestre, dois no escravo. O mestre tem um encadeamento, chamado de encadeamento de despejo, que lê o log binário do mestre e o entrega ao escravo.
No escravo, um processo chamado thread de E/S conecta-se ao mestre, lê os eventos de log binários do mestre à medida que eles chegam e os copia para um arquivo de log local chamado log de retransmissão. O segundo processo escravo – thread SQL – lê eventos de um log de retransmissão armazenado localmente no escravo de replicação e os utiliza.
MySQL suporta replicação encadeada, que é muito fácil de configurar. Escravos que também são mestres devem estar rodando com os parâmetros --log-bin e --log-slave-update.
Para verificar o status da replicação e obter informações sobre os encadeamentos, você executa no escravo:
MariaDB [(none)]> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: master
Master_User: rpl_user
Master_Port: 3306
Connect_Retry: 10
Master_Log_File: binlog.000005
Read_Master_Log_Pos: 339
Relay_Log_File: relay-bin.000002
Relay_Log_Pos: 635
Relay_Master_Log_File: binlog.000005
Slave_IO_Running: Yes
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: 339
Relay_Log_Space: 938
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
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_SSL_Crl:
Master_SSL_Crlpath:
Using_Gtid: Current_Pos
Gtid_IO_Pos: 0-1-8
Replicate_Do_Domain_Ids:
Replicate_Ignore_Domain_Ids:
Parallel_Mode: conservative
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
1 row in set (0.00 sec)
Configurando a replicação lógica do Data Guard no Oracle
-
Criar um banco de dados físico em espera
Para criar um banco de dados de reserva lógico, primeiro crie um banco de dados de espera físico e, em seguida, faça a transição para um banco de dados de espera lógico.
-
Parar aplicação de refazer no banco de dados de espera física
Parar o Redo Apply é necessário para evitar a aplicação de alterações.
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
-
Prepare o banco de dados primário para dar suporte a um banco de dados de espera lógica
Altere o atributo VALID_FOR no LOG_ARCHIVE_DEST_1 original e inclua LOG_ARCHIVE_DEST_3 para o banco de dados lógico.
LOG_ARCHIVE_DEST_1= 'LOCATION=/arch1/severalnines/ VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=severalnines' LOG_ARCHIVE_DEST_3= 'LOCATION=/arch2/severalnines/ VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=severalnines' LOG_ARCHIVE_DEST_STATE_3=ENABLE
Crie um dicionário nos dados de refazer
SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
-
Converter em um banco de dados de espera lógica
Para continuar aplicando dados de redo ao banco de dados em espera físico até que esteja pronto para converter em um banco de dados em espera lógico, emita a seguinte instrução SQL:
SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY db_name;
-
Ajuste os parâmetros de inicialização para o banco de dados de espera lógica
LOG_ARCHIVE_DEST_1= 'LOCATION=/arch1/severalnines_remote/ VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=severalnines_remote' LOG_ARCHIVE_DEST_2= 'SERVICE=severalnines ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=severalnines' LOG_ARCHIVE_DEST_3= 'LOCATION=/arch2/severalnines_remote/ VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE) DB_UNIQUE_NAME=severalnines_remote' LOG_ARCHIVE_DEST_STATE_1=ENABLE LOG_ARCHIVE_DEST_STATE_2=ENABLE LOG_ARCHIVE_DEST_STATE_3=ENABLE
-
Abra o banco de dados de espera lógica
SQL> ALTER DATABASE OPEN RESETLOGS;
Verifique se o banco de dados de espera lógica está funcionando corretamente
v$data_guard_stats visualização
SQL> COL NAME FORMAT A20 SQL> COL VALUE FORMAT A12 SQL> COL UNIT FORMAT A30 SQL> SELECT NAME, VALUE, UNIT FROM V$Data_Guard_STATS; NAME VALUE UNIT -------------------- ------------ ------------------------------ apply finish time +00 00:00:00 day(2) to second(1) interval apply lag +00 00:00:00 day(2) to second(0) interval transport lag +00 00:00:00 day(2) to second(0) interval
v$logstdby_process view
SQL> COLUMN SERIAL# FORMAT 9999 SQL> COLUMN SID FORMAT 9999 SQL> SELECT SID, SERIAL#, SPID, TYPE, HIGH_SCN FROM V$LOGSTDBY_PROCESS; SID SERIAL# SPID TYPE HIGH_SCN ----- ------- ----------- ---------------- ---------- 48 6 11074 COORDINATOR 7178242899 56 56 10858 READER 7178243497 46 1 10860 BUILDER 7178242901 45 1 10862 PREPARER 7178243295 37 1 10864 ANALYZER 7178242900 36 1 10866 APPLIER 7178239467 35 3 10868 APPLIER 7178239463 34 7 10870 APPLIER 7178239461 33 1 10872 APPLIER 7178239472 9 rows selected.
Estas são as etapas necessárias para criar a replicação lógica do Oracle Data Guard. As ações serão ligeiramente diferentes se você executar esta operação com um conjunto de compatibilidade não padrão ou bancos de dados em execução no ambiente Oracle RAC.
Configurando a replicação do MySQL
-
Configure o banco de dados mestre. Defina server_id exclusivo, especifique diferentes logs de replicação –log-basename (MariaDB) , ative o log binário. Modifique o arquivo my.cnf com as informações abaixo.
log-bin server_id=1 log-basename=master1
Faça login no banco de dados mestre e conceda o usuário de replicação para acessar os dados mestre.
GRANT REPLICATION SLAVE ON *.* TO replication_user
-
Inicie os dois servidores com os GTIDs ativados.
gtid_mode=ON enforce-gtid-consistency=true
-
Configure o escravo para usar o posicionamento automático baseado em GTID.
mysql> CHANGE MASTER TO > MASTER_HOST = host, > MASTER_PORT = port, > MASTER_USER = replication_user, > MASTER_PASSWORD = password, > MASTER_AUTO_POSITION = 1;
-
Se você quiser adicionar o escravo ao mestre com dados, precisará fazer backup e restaurá-lo no servidor escravo.
mysqldump --all-databases --single-transaction --triggers --routines --host=127.0.0.1 --user=root --password=rootpassword > dump_replication.sql
Faça login no banco de dados escravo e execute:
slave> tee dump_replication_insert.log slave> source dump_replication.sql slave> CHANGE MASTER TO MASTER_HOST="host", MASTER_USER=" replication_user ", MASTER_PASSWORD="password ", MASTER_PORT=port, MASTER_AUTO_POSITION = 1;