Eu tenho um problema de replicação estranho. Para referência, estou usando o MySQL 5.5 com replicação baseada em instruções. Temos um Master com Slaves no site A/rede A, e slaves no site B/rede B.
Tudo na rede A está bem. O problema ocorre com os bancos de dados no site B/rede B que estão se conectando ao mestre no site A.
Em algumas ocasiões agora eu vi a replicação parar nos bancos de dados no site B. Se eu olhar para o SLAVE_IO_RUNNING
e SLAVE_SQL_RUNNING
em SHOW SLAVE STATUS
ambos dizem yes
. Para todas as extensões e propósitos, tudo parece bem para mim. No entanto, meu monitoramento está relatando que o evento de pulsação que executamos está ficando para trás. É como se o escravo estivesse conectado ao mestre, mas não recebendo nenhum dado.
Os vários pos
valores ( read_master_log_pos
, relay_log_pos
, exec_master_log_pos
) são todos estáticos e não se movem. Eu também verifiquei o log de retransmissão em um, e os dados de entrada param naquele momento.
Se eu olhar para os bancos de dados mestre e escravo, não há consultas de longa duração que causem isso. Tudo parece correr conforme o esperado e, como mencionado, os escravos no site A estão bem e mantêm-se atualizados.
Os bancos de dados em questão estão todos executando consultas diferentes, portanto, não é uma consulta específica perturbando as coisas.
Não há nada nos logs de erro do MySQL.
Simulamos uma pequena falha de rede (embora de nosso monitoramento não possamos ver nenhuma interrupção de rede nesses horários) e os bancos de dados funcionam conforme o esperado. Assim que a rede é reconectada, eles retomam a replicação.
Isso é corrigido executando stop slave; start slave;
em que ponto tudo continua como se nada tivesse acontecido.
Alguém mais teve um problema semelhante? ou poderia lançar alguma luz sobre o que pode estar acontecendo. Minha intuição é que há uma interrupção de rede muito breve, muito curta para o monitoramento pegar, mas por que isso perturbaria o MySQL eu não sei.
O que me chama a atenção é a palavra 'NETWORK'.
A comunicação entre Mestre e Escravo é implementada como bidirecional.
De acordo com a documentação do MySQL sobre replicação
Dada esta descrição do aspecto de E/S da Replicação, o que você poderia procurar ???
FIREWALL
A conexão entre Master e Slave requer que o firewall esteja aberto. Infelizmente, já vi ocasiões em que o firewall estava aberto no Master e um Slave se conectava normalmente. O Slave faria com que o thread de E/S aparecesse na lista de processos como se nada estivesse errado. O Mestre faria o mesmo. De repente, 60 segundos depois, a thread de E/S desaparece da lista de processos do Master, mas permanece visível no Slave.
Dado esse cenário (que testemunhei entre dois servidores Amazon EC2 em duas AZs (zonas de disponibilidade) diferentes), a solução naquela época era verificar os grupos de segurança e abrir a porta 3306 na AZ do escravo.
TEMPO ESGOTADO
MySQL tem configurações para tempo limite de conexões de rede
Dos documentos do MySQL:
PREOCUPAÇÕES
Por que falar sobre a rede assim ??? Você pode ser vitimado na forma de desvio de dados. De volta
Jun 17, 2014
, respondi ao post que recebi a tarefa de replicação Mysql Master-Master? . Mencionei brevemente a rede como um herói desconhecido na deriva de dados:SUA PERGUNTA REAL
Você está executando
STOP SLAVE;
eSTART SLAVE
não encontra a causa raiz, mas de fato resolve o problema em questão. Quão ??? Tudo o que isso faz é desconectar os threads de E/S e SQL e, em seguida, reconectar do zero.Você também poderia ter feito
o que também funcionaria bem, especialmente se o thread SQL estiver ocupado e você não quiser interrompê-lo.
Você precisará verificar a conexão entre o Mestre e o Escravo quanto a pacotes descartados.
Se seu monitoramento tiver a mesma granularidade de tempo que os valores de tempo limite do MySQL, você não terá nada para alertá-lo quando isso acontecer. Você teria que pesquisar o MySQL com mais frequência. Como alternativa, você provavelmente poderia criar algum tipo de configuração SNMP para monitorar o MySQL, portanto, se as informações do SNMP não forem atualizadas em tempo hábil, você poderá detectar que o MySQL está inativo ou não responde sem nunca se conectar ao MySQL.
Minha resposta pode não ter definido totalmente a causa raiz, mas tenho duas sugestões:
SUGESTÃO #1
Olhe para sua configuração max_allowed_packet . Muitas vezes no DBA StackExchange chamei carinhosamente de MySQL Packet
the Silent Killer of DB Connections
. O encadeamento de E/S é tanto quanto o DB Connection como qualquer outro. Eu garantiria que max_allowed_packet estivesse sempre definido como 1073741824 (que é 1G).SUGESTÃO #2
Você pode definir manualmente a pulsação do thread de E/S. Como ?
De acordo com a documentação do MySQL 5.5 para
CHANGE MASTER TO
Com base nesses parágrafos e no valor padrão para slave_net_timeout (60 segundos), parece que o thread de E/S deve pulsar a cada 30 segundos. Você pode alterar o período de pulsação para 10 segundos assim: