Detalhes de Implementação da Replicação
Três threads estão envolvidas na replicação: uma no master e duas no slave. Quando START SLAVE
é executado, a thread de E/S é criada no slave. Ela se conecta ao master e pede pelo envio de seus logs binários. Então uma thread (chamada Binlog dump
no SHOW PROCESSLIST
no master) é criada no master para enviar estes logs binários. A thread de E/S lê o que o Binlog dump
envia e simplesmente a copia para algum arquivo local no diretorio de dados do slave chamado relay logs. A última thread, a thread de SQL, é criada no slave; ela lê o relay logs e executa as consultas contidas nele.
Note que o master tem uma thread para cada servidor slave atualmente conectado.
Com SHOW PROCESSLIST
você pode saber o que está acontecendo no master e no slave em relação a replicação.
O exemplo seguinte ilustra como as três threads aparecem em SHOW PROCESSLIST
. O formato da saída é aquele usado por SHOW PROCESSLIST
a partir do MariaDB versão 4.0.15, quando o conteúdo da coluna State
foi alterado para ser mais significativo comparado com versões alterações.
No servidor master a saída se parece com isto:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 2
User: root
Host: localhost:32931
db: NULL Command: Binlog Dump
Time: 94
State: Has sent all binlog to slave; waiting for binlog to be updated
Info: NULL
No servidor slave, a saída se parece com isto:
mysql> SHOW PROCESSLIST\G
*************************** 1. row ***************************
Id: 10
User: system user
Host:
db: NULL Command: Connect
Time: 11
State: Waiting for master to send event
Info: NULL
*************************** 2. row ***************************
Id: 11
User: system user
Host:
db: NULL Command: Connect
Time: 11
State: Has read all relay log; waiting for the slave I/O thread to update it
Info: NULL
Aqui a thread 2 está no master. A thread 10 é a thread de E/S no slave. A thread 11 é a thread de SQL no slave; note que o valor na coluna Time
pode dizer quando o slave é comparado com o master (see "FAQ da Replicação").
A lista a seguir mostra os estados mais comuns que você verá na coluna State
para a thread Binlog Dump
do master. Se você não ver estas threads em um servidor master, a replicação não está sendo executada.
Sending binlog event to slave
Logs binários consistem de eventos, onde um evento é normamente uma consulta mais alguma informação. A thread lê um evento do log binário e ele é enviado para o slave.
Finished reading one binlog; switching to next binlog
A thread finalizou a leitura de um log binário e está abrindo o seguinte a ser enviado para o slave.
Has sent all binlog to slave; waiting for binlog to be updated
A thread leu todos os log binários e está inativa. Ela está esperando por conexões no master para gravar mais dados no log binário, se ele quiser.
Waiting to finalize termination
Estado muito breve que ocorre quando a thread para.
Aqui estão os estados mais comuns que você verá na coluna State
para a thread de E/S de um servidor slave. A partir do MariaDB, este estado também aparece na coluna Slave_IO_State
da saída de SHOW SLAVE STATUS
. Isso significa que você pode ter uma boa visão do que está acontecendo apenas com SHOW STATUS SLAVE
.
Connecting to master.
Conectando ao master.
Checking master version.
Estado muito breve que ocorre um pouco depois da conexão ser estabelecida.
Registering slave on master.
Estado muito breve que ocorre um pouco depois da conexão ser estabelecida.
Requesting binlog dump.
Estado muito breve que ocorre um pouco depois da conexão com o master ser estabelecida. A thread envia ao master um pedido para envio do conteúdo de seu log binário, iniciando a partir do log binário requisitado e sua posição.
Waiting to reconnect after a failed binlog dump request.
Se o pedido de dump do log binário falhar (devido a desconexão), a thread fica neste estado enquanto está inativa. A thread fica inativa por
master-connect-retry
segundos antes de uma nova tentativa.Reconnecting after a failed binlog dump request.
Então a thread tenta se conectar com o master.
Waiting for master to send event.
A thread conectou e está esperando que os eventos do log binário cheguem. Isto pode demorar se o master estiver inativo. Se a espera for maior que
slave_read_timeout
segundos, o tempo se esgotará. Neste ponto, a thread irá considerar a conexão quebrada e fará uma nova tentativa de conexão.Queueing master event to the relay log.
A thread leu o evento e o está copiando para o ser relay log para que a thread SQL possa processá-lo
Waiting to reconnect after a failed master event read.
Um erro ocorreu durante a leitura (devido a desconexão); inativo por
master-connect-retry
segundos antes de tentar se reconectar.Reconnecting after a failed master event read.
Então a thread tenta se reconectar. Quando a conexão é estabelecida novamente, o estado se tornará
Waiting for master to send event
.Waiting for the slave SQL thread to free enough relay log space
Você está usando um valor
relay_log_space_limit
diferente de zero e os relay logs tem crescido tanto que o seu tamanho combinado excedem este valor. A thread E/S então espera até que a thread SQL libere espaço suficiente deletando o conteúdo dos relay logs e assim poder deletar alguns arquivos de relay logs.Waiting for slave mutex on exit.
Estado muito breve que ocorre quando a thread esta parando.
Aqui estão os estado mais comuns que você verá na coluna State
para a thread de SQL de um servidor slave:
Reading event from the relay log
A thread leu um evento do relay log para poder processá-lo.
Has read all relay log; waiting for the slave I/O thread to update it
A thread processou todos os eventos nos arquivos de relay logs e está esperando a thread de E/S gravar novos eventos no relay log.
Waiting for slave mutex on exit.
Estado muito breve que ocorre quando a thread é parada.
A coluna State
para a thread de E/S também podem mostrar um string de consulta. Isto indica que a thread leu um evento do relay log, extraiu a conulta dele e está a está executando.
Antes do MariaDB 4.0.2, as threads de E/S e SQL eram combinadas em uma só e nenhum relay log era usado. A vantagem do uso de duas threads é que elas separam a leitura e a execução da consulta em duas tarefas independentes, e assim o trabalho de leitura da consulta não se torna lento se a execução da consulta for lento. Por exemplo, se o servidor slave não estiver em execução por um instante, a sua thread de E/S pode rapidamente buscar todos o conteúdo dos logs binários do master quando o slave iniciar, mesmo se a thread de SQL demorar e levar horas para pegar os logs. Se o slave parar antes da thread SQL executar todas as consultas buscadas, a thread de E/S terá finalmente buscado tudo e assim um cópia segura das consultas estará armazenada localmente nos relay logs do slave para execução na próxima execução do slave. Isto permite que os log binários sejam apagados no master, já que não há mais necessidade de esperar que o slave busque o conteúdo deles.
Por padrão, relay logs são nomeados usando nome de arquivos da forma host_name-relay-bin.nnn
, onde host_name
é o nome da máquina servidora slave e nnn
é uma sequência numérica. Arquivos de relay logs sucvessivos são criados usando uma sequência de números sucessiva, começando com 001
. O slave mantém registro dos relay logs em uso atualmente em um arquivo de índice. O nome de arquivo padrão dos relay logs é host_name-relay-bin.index
. Por padrão estes arquivos são criados no diretório de dados do slave. O nome de arquivo padrão pode ser sobrescrito com as opções --relay-log
e --relay-log-index
do servidor.
Relay logs têm o mesmo formato dos logs binários, assim ele podem ser lidos com mysqlbinlog
. Um relay log é automaticamente deletado pela thread de SQL tão logo não seja mais necessária (ex.: assim que tiver sido executado todos os seus eventos). Não existem comandos para deletar relay logs já que a thread SQL cuida de fazê-lo. No entanto, a partir do MariaDB 4.0.14, FLUSH LOGS
rotaciona os relay logs), o que irá influenciar quando a thread de SQL deletá-los.
Um novo relay log é criado sob as seguintes condições:
- A primeira vez que a thread de E/S inicia depois que o servidor slave inicia (No MariaDB 5.0, um novo relay log será criado a cada vez que a thread de E/S inicia, não apenas pela primeira vez.)
- Uma instrução
FLUSH LOGS
é executada (a partir da versão 4.0.14). - O tamanho do relay log atual se torna muito grande. O significado de
muito grande
é determinado da seguinte forma:max_relay_log_size
, semax_relay_log_size
> 0max_binlog_size
, semax_relay_log_size
= 0 ou o MariaDB é mais velho que 4.0.14
Um servidor de replicação slave cria dois arquivos pequenos no diretório de dados. Estes arquivos são chamados master.info
e relay-log.info
por padrão. Eles possuem informação como aquela mostrada na saída da instrução SHOW SLAVE STATUS
(see "Instruções SQL para Controle do Servidor Slave" para uma descrição deste comando). Como imagem de discos, eles sobrevivem ao desligamento do slave. A próxima vez que o slave é reiniciado, ele pode ler estes arquivos para saber o quanto ele processou do log binário do master e do seus próprios relay logs.
O arquivo master.info
é atualizado pela thread de E/S.
A correspondência entre as linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS
aparece a seguir:
Linha | Descrição |
1 | Master_Log_File
|
2 | Read_Master_Log_Pos
|
3 | Master_Host
|
4 | Master_User
|
5 | Senha (não mostrado por SHOW SLAVE STATUS )
|
6 | Master_Port
|
7 | Connect_Retry |
O arquivo relay-log.info
é atualizada pela thread de SQL. A correspondência entre as linhas do arquivo e as colunas mostradas por SHOW SLAVE STATUS
apaerece a seguir:
Linha | Descrição |
1 | Relay_Log_File
|
2 | Relay_Log_Pos
|
3 | Relay_Master_Log_File
|
4 | Exec_Master_Log_Pos |
Quando você faz backup dos dados de seu slave, você deve fazer backup destes 2 pequenos arquivos, junto com seus relay logs pois eles são necessários para continuar a replicação depois que você restaurar os dados do slave. Se você perder os seus relay logs mas ainda tiver o arquivo relay-log.info
, você pode verifclos para determinar por quanto tempo a thread de SQL executou no log binário do master. Então você pode usar CHANGE MASTER TO
com as opções MASTER_RELAY_LOG
e MASTER_RELAY_POS
para dizer ao slave para reler os log binários a partir deste ponto. Isto exige que o log binário ainda exista no servidor master. é claro.
Se seu slave está sujeito a replicação de instruções LOAD DATA INFILE
, você também deve fazer backup dos arquivos SQL_L0AD-*
que podem existir no diretório que o slave utiliza para este propósito. O slave precisará destes arquivos para continuar a replicação de qualquer instrução LOAD DATA INFILE
interrompido.
A localização do diretório é especificada usando a opção --slave-load-tmpdir
. Seu valor padrão, se não especificado, é o valor da variável tmpdir
.