Implementação do MHA para Alta Disponibilidade MySQL

O MHA (Master High Availability) é uma solução de código aberto que fornece alta disponibilidade para servidores MySQL. Abaixo, apresentamos um guia completo para implementação e monitoramento do MHA em um ambiente de replicação MySQL.

Logs do MHA durante Failover

Quando um mestre falha, o MHA inicia automaticamente o processo de failover. Os logs abaixo mostram o processo completo:

no -o BatchMode=yes -o ConnectTimeout=5, timeout 5
Servidor de monitoramento 172.16.12.10 está acessível, mestre não está acessível a partir de 172.16.12.10. OK.
Sex Dez  8 19:04:14 2017 - [warning] Erro na conexão MySQL: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)
Sex Dez  8 19:04:14 2017 - [warning] Falha na conexão 2 vez(es)..
Servidor de monitoramento 172.16.12.13 está acessível, mestre não está acessível a partir de 172.16.12.13. OK.
Sex Dez  8 19:04:14 2017 - [info] Mestre não está acessível a partir de todos os outros servidores de monitoramento. Failover deve começar.
Sex Dez  8 19:04:14 2017 - [info] HealthCheck: SSH para 172.16.12.11 está acessível.
Sex Dez  8 19:04:17 2017 - [warning] Erro na conexão MySQL: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)
Sex Dez  8 19:04:17 2017 - [warning] Falha na conexão 3 vez(es)..
Sex Dez  8 19:04:20 2017 - [warning] Erro na conexão MySQL: 2013 (Lost connection to MySQL server at 'reading initial communication packet', system error: 111)
Sex Dez  8 19:04:20 2017 - [warning] Falha na conexão 4 vez(es)..
Sex Dez  8 19:04:20 2017 - [warning] Mestre não está acessível a partir do verificador de saúde!
Sex Dez  8 19:04:20 2017 - [warning] Mestre 172.16.12.11(172.16.12.11:3306) não está acessível!
Sex Dez  8 19:04:20 2017 - [warning] SSH está acessível.
Sex Dez  8 19:04:20 2017 - [info] Falha ao conectar-se ao servidor mestre. Lendo arquivo de configuração /etc/masterha_default.cnf e /etc/mha/app1.cnf novamente, e tentando conectar-se a todos os servidores para verificar o status do servidor..
Sex Dez  8 19:04:20 2017 - [warning] Arquivo de configuração global /etc/masterha_default.cnf não encontrado. Pulando.
Sex Dez  8 19:04:20 2017 - [info] Lendo configuração padrão do aplicativo de /etc/mha/app1.cnf..
Sex Dez  8 19:04:20 2017 - [info] Lendo configuração do servidor de /etc/mha/app1.cnf..
Sex Dez  8 19:04:20 2017 - [debug] Pulando conexão com mestre morto 172.16.12.11(172.16.12.11:3306).
Sex Dez  8 19:04:20 2017 - [debug] Conectando-se aos servidores..
Sex Dez  8 19:04:20 2017 - [debug]  Conectado a: 172.16.12.12(172.16.12.12:3306), user=root
Sex Dez  8 19:04:20 2017 - [debug]  Número de threads de trabalho de escravo no host 172.16.12.12(172.16.12.12:3306): 2
Sex Dez  8 19:04:20 2017 - [debug]  Conectado a: 172.16.12.13(172.16.12.13:3306), user=root
Sex Dez  8 19:04:20 2017 - [debug]  Número de threads de trabalho de escravo no host 172.16.12.13(172.16.12.13:3306): 2
Sex Dez  8 19:04:20 2017 - [debug]  Comparando versões do MySQL..
Sex Dez  8 19:04:20 2017 - [debug]   Comparação de versões do MySQL concluída.
Sex Dez  8 19:04:20 2017 - [debug] Conexão aos servidores concluída.
Sex Dez  8 19:04:20 2017 - [info] Modo de failover GTID = 1
Sex Dez  8 19:04:20 2017 - [info] Servidores Mortos:
Sex Dez  8 19:04:20 2017 - [info]   172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:20 2017 - [info] Servidores Vivos:
Sex Dez  8 19:04:20 2017 - [info]   172.16.12.12(172.16.12.12:3306)
Sex Dez  8 19:04:20 2017 - [info]   172.16.12.13(172.16.12.13:3306)
Sex Dez  8 19:04:20 2017 - [info] Escravos Vivos:
Sex Dez  8 19:04:20 2017 - [info]   172.16.12.12(172.16.12.12:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:20 2017 - [info]     GTID ON
Sex Dez  8 19:04:20 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:20 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:20 2017 - [info]     Candidato primário para o novo Mestre (candidate_master está configurado)
Sex Dez  8 19:04:20 2017 - [info]   172.16.12.13(172.16.12.13:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:20 2017 - [info]     GTID ON
Sex Dez  8 19:04:20 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:20 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:20 2017 - [info]     Não é candidato para o novo Mestre (no_master está configurado)
Sex Dez  8 19:04:20 2017 - [info] Verificando configurações de escravo..
Sex Dez  8 19:04:20 2017 - [info]  read_only=1 não está configurado no escravo 172.16.12.12(172.16.12.12:3306).
Sex Dez  8 19:04:20 2017 - [info]  read_only=1 não está configurado no escravo 172.16.12.13(172.16.12.13:3306).
Sex Dez  8 19:04:20 2017 - [info] Verificando configurações de filtragem de replicação..
Sex Dez  8 19:04:20 2017 - [info]  Verificação de filtragem de replicação OK.
Sex Dez  8 19:04:20 2017 - [info] Mestre está offline!
Sex Dez  8 19:04:20 2017 - [info] Encerrando script de monitoramento.
Sex Dez  8 19:04:20 2017 - [debug]  Desconectado de 172.16.12.12(172.16.12.12:3306)
Sex Dez  8 19:04:20 2017 - [debug]  Desconectado de 172.16.12.13(172.16.12.13:3306)
Sex Dez  8 19:04:20 2017 - [info] Código de saída 20 recebido (Mestre morto).
Sex Dez  8 19:04:20 2017 - [info] MHA::MasterFailover versão 0.57.
Sex Dez  8 19:04:20 2017 - [info] Iniciando failover de mestre.
Sex Dez  8 19:04:20 2017 - [info] 
Sex Dez  8 19:04:20 2017 - [info] * Fase 1: Fase de Verificação de Configuração..
Sex Dez  8 19:04:20 2017 - [info] 
Sex Dez  8 19:04:20 2017 - [debug] Teste de conexão SSH com 172.16.12.11, opção -o StrictHostKeyChecking=no -o PasswordAuthentication=no -o BatchMode=yes -o ConnectTimeout=5, timeout 5
Sex Dez  8 19:04:20 2017 - [info] HealthCheck: SSH para 172.16.12.11 está acessível.
Sex Dez  8 19:04:21 2017 - [info] Servidor de binlog 172.16.12.11 está acessível.
Sex Dez  8 19:04:21 2017 - [debug] Pulando conexão com mestre morto 172.16.12.11.
Sex Dez  8 19:04:21 2017 - [debug] Conectando-se aos servidores..
Sex Dez  8 19:04:21 2017 - [debug]  Conectado a: 172.16.12.12(172.16.12.12:3306), user=root
Sex Dez  8 19:04:21 2017 - [debug]  Número de threads de trabalho de escravo no host 172.16.12.12(172.16.12.12:3306): 2
Sex Dez  8 19:04:21 2017 - [debug]  Conectado a: 172.16.12.13(172.16.12.13:3306), user=root
Sex Dez  8 19:04:21 2017 - [debug]  Número de threads de trabalho de escravo no host 172.16.12.13(172.16.12.13:3306): 2
Sex Dez  8 19:04:21 2017 - [debug]  Comparando versões do MySQL..
Sex Dez  8 19:04:21 2017 - [debug]   Comparação de versões do MySQL concluída.
Sex Dez  8 19:04:21 2017 - [debug] Conexão aos servidores concluída.
Sex Dez  8 19:04:21 2017 - [info] Modo de failover GTID = 1
Sex Dez  8 19:04:21 2017 - [info] Servidores Mortos:
Sex Dez  8 19:04:21 2017 - [info]   172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:21 2017 - [info] Verificando acessibilidade do mestre via MySQL (verificação dupla)...
Sex Dez  8 19:04:21 2017 - [info]  ok.
Sex Dez  8 19:04:21 2017 - [info] Servidores Vivos:
Sex Dez  8 19:04:21 2017 - [info]   172.16.12.12(172.16.12.12:3306)
Sex Dez  8 19:04:21 2017 - [info]   172.16.12.13(172.16.12.13:3306)
Sex Dez  8 19:04:21 2017 - [info] Escravos Vivos:
Sex Dez  8 19:04:21 2017 - [info]   172.16.12.12(172.16.12.12:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:21 2017 - [info]     GTID ON
Sex Dez  8 19:04:21 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:21 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:21 2017 - [info]     Candidato primário para o novo Mestre (candidate_master está configurado)
Sex Dez  8 19:04:21 2017 - [info]   172.16.12.13(172.16.12.13:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:21 2017 - [info]     GTID ON
Sex Dez  8 19:04:21 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:21 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:21 2017 - [info]     Não é candidato para o novo Mestre (no_master está configurado)
Sex Dez  8 19:04:22 2017 - [info] Iniciando failover baseado em GTID.
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] ** Fase 1: Fase de Verificação de Configuração concluída.
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] * Fase 2: Fase de Desligamento do Mestre Morto..
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] Forçando desligamento para que aplicativos nunca se conectem ao mestre atual..
Sex Dez  8 19:04:22 2017 - [info] Executando script de desativação de IP do mestre:
Sex Dez  8 19:04:22 2017 - [info]   /usr/local/bin/master_ip_failover --orig_master_host=172.16.12.11 --orig_master_ip=172.16.12.11 --orig_master_port=3306 --command=stopssh --ssh_user=root  
Sex Dez  8 19:04:22 2017 - [debug]  Parando thread de IO em 172.16.12.13(172.16.12.13:3306)..
Sex Dez  8 19:04:22 2017 - [debug]  Parando thread de IO em 172.16.12.12(172.16.12.12:3306)..


IN SCRIPT TEST====/sbin/ifconfig eth0:100 down==/sbin/ifconfig eth0:100 172.16.12.100/24===

Desativando o VIP no mestre antigo: 172.16.12.11 
SIOCSIFFLAGS: não é possível especificar o endereço solicitado
Sex Dez  8 19:04:22 2017 - [info]  concluído.
Sex Dez  8 19:04:22 2017 - [warning] shutdown_script não está configurado. Pulando desligamento explícito do mestre morto.
Sex Dez  8 19:04:22 2017 - [info] * Fase 2: Fase de Desligamento do Mestre Morto concluída.
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] * Fase 3: Fase de Recuperação do Mestre..
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] * Fase 3.1: Fase de Obtenção dos Escravos Mais Recentes..
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [debug] Buscando status atual do escravo..
Sex Dez  8 19:04:22 2017 - [debug]  Busca de status do escravo concluída.
Sex Dez  8 19:04:22 2017 - [info] O arquivo de log binário mais recente em todos os escravos é mysql-bin.000007:4095683
Sex Dez  8 19:04:22 2017 - [info] Conjunto GTID Recuperado: 865e07c9-bae8-11e7-8aba-08002729e4f7:16087-21782
Sex Dez  8 19:04:22 2017 - [info] Escravos mais recentes (Escravos que receberam arquivos de relay log até o mais recente):
Sex Dez  8 19:04:22 2017 - [info]   172.16.12.13(172.16.12.13:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:22 2017 - [info]     GTID ON
Sex Dez  8 19:04:22 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:22 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:22 2017 - [info]     Não é candidato para o novo Mestre (no_master está configurado)
Sex Dez  8 19:04:22 2017 - [info] O arquivo de log binário mais antigo em todos os escravos é mysql-bin.000007:1795676
Sex Dez  8 19:04:22 2017 - [info] Conjunto GTID Recuperado: 865e07c9-bae8-11e7-8aba-08002729e4f7:16087-18583
Sex Dez  8 19:04:22 2017 - [info] Escravos mais antigos:
Sex Dez  8 19:04:22 2017 - [info]   172.16.12.12(172.16.12.12:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:22 2017 - [info]     GTID ON
Sex Dez  8 19:04:22 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:22 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:22 2017 - [info]     Candidato primário para o novo Mestre (candidate_master está configurado)
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] * Fase 3.3: Fase de Determinação do Novo Mestre..
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [debug] Verificando atraso de replicação em 172.16.12.12(172.16.12.12:3306).. 
Sex Dez  8 19:04:22 2017 - [debug]  ok.
Sex Dez  8 19:04:22 2017 - [info] Procurando novo mestre entre os escravos..
Sex Dez  8 19:04:22 2017 - [info]  Mestres candidatos do arquivo de configuração:
Sex Dez  8 19:04:22 2017 - [info]   172.16.12.12(172.16.12.12:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:22 2017 - [info]     GTID ON
Sex Dez  8 19:04:22 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:22 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:22 2017 - [info]     Candidato primário para o novo Mestre (candidate_master está configurado)
Sex Dez  8 19:04:22 2017 - [info]  Mestres não-candidatos:
Sex Dez  8 19:04:22 2017 - [info]   172.16.12.13(172.16.12.13:3306)  Versão=5.7.9-log (versão principal mais antiga entre escravos) log-bin:enabled
Sex Dez  8 19:04:22 2017 - [info]     GTID ON
Sex Dez  8 19:04:22 2017 - [debug]    Repositório de informações de relay log: TABLE
Sex Dez  8 19:04:22 2017 - [info]     Replicando de 172.16.12.11(172.16.12.11:3306)
Sex Dez  8 19:04:22 2017 - [info]     Não é candidato para o novo Mestre (no_master está configurado)
Sex Dez  8 19:04:22 2017 - [info]  Procurando entre escravos candidate_master que receberam os eventos de relay log mais recentes..
Sex Dez  8 19:04:22 2017 - [info]   Não encontrado.
Sex Dez  8 19:04:22 2017 - [info]  Procurando entre todos os escravos candidate_master..
Sex Dez  8 19:04:22 2017 - [info] Novo mestre é 172.16.12.12(172.16.12.12:3306)
Sex Dez  8 19:04:22 2017 - [info] Iniciando failover de mestre..
Sex Dez  8 19:04:22 2017 - [info] 
De:
172.16.12.11(172.16.12.11:3306) (mestre atual)
 +--172.16.12.12(172.16.12.12:3306)
 +--172.16.12.13(172.16.12.13:3306)

Para:
172.16.12.12(172.16.12.12:3306) (novo mestre)
 +--172.16.12.13(172.16.12.13:3306)
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info] * Fase 3.3: Fase de Recuperação do Novo Mestre..
Sex Dez  8 19:04:22 2017 - [info] 
Sex Dez  8 19:04:22 2017 - [info]  Aguardando todos os logs serem aplicados.. 
Sex Dez  8 19:04:22 2017 - [info]   concluído.
Sex Dez  8 19:04:22 2017 - [debug]  Parando threads de IO/SQL do escravo em 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:05:24 2017 - [debug]   concluído.
Sex Dez  8 19:05:24 2017 - [info]  Replicando do escravo mais recente 172.16.12.13(172.16.12.13:3306) e aguardando para aplicar..
Sex Dez  8 19:05:24 2017 - [info]  Aguardando todos os logs serem aplicados no escravo mais recente.. 
Sex Dez  8 19:05:24 2017 - [info]  Resetando escravo 172.16.12.12(172.16.12.12:3306) e iniciando replicação do novo mestre 172.16.12.13(172.16.12.13:3306)..
Sex Dez  8 19:05:24 2017 - [debug]  Parando threads de IO/SQL do escravo em 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:05:24 2017 - [debug]   concluído.
Sex Dez  8 19:05:24 2017 - [info]  CHANGE MASTER executado.
Sex Dez  8 19:05:24 2017 - [debug]  Iniciando threads de IO/SQL do escravo em 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:05:24 2017 - [debug]   concluído.
Sex Dez  8 19:05:24 2017 - [info]  Escravo iniciado.
Sex Dez  8 19:05:24 2017 - [info]  Aguardando execução de todos os relay logs em 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:06:12 2017 - [info]  master_pos_wait(mysql-bin.000003:15419438) concluído em 172.16.12.12(172.16.12.12:3306). 156 eventos executados.
Sex Dez  8 19:06:12 2017 - [info]   concluído.
Sex Dez  8 19:06:12 2017 - [debug]  Parando thread SQL em 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:06:12 2017 - [debug]   concluído.
Sex Dez  8 19:06:12 2017 - [info]   concluído.
Sex Dez  8 19:06:12 2017 - [info] -- Salvando binlog do host 172.16.12.11 iniciado, pid: 2735
Sex Dez  8 19:06:18 2017 - [info] 
Sex Dez  8 19:06:18 2017 - [info] Mensagens de log de 172.16.12.11 ...
Sex Dez  8 19:06:18 2017 - [info] 
Sex Dez  8 19:06:12 2017 - [info] Buscando logs binários do servidor de binlog 172.16.12.11..
Sex Dez  8 19:06:12 2017 - [info] Executando comando de salvamento de binlog: save_binary_logs --command=save --start_file=mysql-bin.000007  --start_pos=4095618 --output_file=/tmp/saved_binlog_binlog1_20171208190420.binlog --handle_raw_binlog=0 --skip_filter=1 --disable_log_bin=0 --manager_version=0.57 --oldest_version=5.7.9-log  --debug  --binlog_dir=/home/data/mysql57/log 
  Criando /tmp se não existir..    ok.
 Concat binários/relay logs de mysql-bin.000007 pos 4095618 até mysql-bin.000007 EOF em /tmp/saved_binlog_binlog1_20171208190420.binlog ..
Executando comando: mysqlbinlog --start-position=4095618  /home/data/mysql57/log/mysql-bin.000007 >> /tmp/saved_binlog_binlog1_20171208190420.binlog
 Concat bem-sucedido.
Sex Dez  8 19:06:18 2017 - [info] scp de root@172.16.12.11:/tmp/saved_binlog_binlog1_20171208190420.binlog para local:/var/log/masterha/app1/saved_binlog_172.16.12.11_binlog1_20171208190420.binlog bem-sucedido.
Sex Dez  8 19:06:18 2017 - [info] Fim das mensagens de log de 172.16.12.11.
Sex Dez  8 19:06:18 2017 - [info] Tamanho do mysqlbinlog salvo de 172.16.12.11 é 61894698 bytes.
Sex Dez  8 19:06:18 2017 - [info] Aplicando binlog diferencial /var/log/masterha/app1/saved_binlog_172.16.12.11_binlog1_20171208190420.binlog ..
Sex Dez  8 19:10:15 2017 - [info] Aplicação de log diferencial do servidor de binlog bem-sucedida.
Sex Dez  8 19:10:15 2017 - [info] Obtendo nome e posição do binlog do novo mestre..
Sex Dez  8 19:10:15 2017 - [info]  mysql-bin.000006:61413022
Sex Dez  8 19:10:15 2017 - [info]  Todos os outros escravos devem iniciar replicação daqui. A instrução deve ser: CHANGE MASTER TO MASTER_HOST='172.16.12.12', MASTER_PORT=3306, MASTER_AUTO_POSITION=1, MASTER_USER='repl', MASTER_PASSWORD='xxx';
Sex Dez  8 19:10:15 2017 - [info] Recuperação do mestre bem-sucedida. Arquivo:Pos:Conjunto_GTID_Executado: mysql-bin.000006, 61413022, 865e07c9-bae8-11e7-8aba-08002729e4f7:1-74770
Sex Dez  8 19:10:15 2017 - [info] Executando script de ativação de IP do mestre:
Sex Dez  8 19:10:15 2017 - [info]   /usr/local/bin/master_ip_failover --command=start --ssh_user=root --orig_master_host=172.16.12.11 --orig_master_ip=172.16.12.11 --orig_master_port=3306 --new_master_host=172.16.12.12 --new_master_ip=172.16.12.12 --new_master_port=3306 --new_master_user='root'   --new_master_password=xxx
Opção desconhecida: new_master_user
Opção desconhecida: new_master_password


IN SCRIPT TEST====/sbin/ifconfig eth0:100 down==/sbin/ifconfig eth0:100 172.16.12.100/24===

Ativando o VIP - 172.16.12.100/24 no novo mestre - 172.16.12.12 
Sex Dez  8 19:10:19 2017 - [info]  OK.
Sex Dez  8 19:10:19 2017 - [info] ** Recuperação do mestre concluída com sucesso.
Sex Dez  8 19:10:19 2017 - [info] * Fase 3: Fase de Recuperação do Mestre concluída.
Sex Dez  8 19:10:19 2017 - [info] 
Sex Dez  8 19:10:19 2017 - [info] * Fase 4: Fase de Recuperação dos Escravos..
Sex Dez  8 19:10:19 2017 - [info] 
Sex Dez  8 19:10:19 2017 - [info] 
Sex Dez  8 19:10:19 2017 - [info] * Fase 4.1: Iniciando Escravos em paralelo..
Sex Dez  8 19:10:19 2017 - [info] 
Sex Dez  8 19:10:19 2017 - [info] -- Recuperação do escravo no host 172.16.12.13(172.16.12.13:3306) iniciada, pid: 2751. Verifique log temporário /var/log/masterha/app1/172.16.12.13_3306_20171208190420.log se demorar..
Sex Dez  8 19:25:16 2017 - [info] 
Sex Dez  8 19:25:16 2017 - [info] Mensagens de log de 172.16.12.13 ...
Sex Dez  8 19:25:16 2017 - [info] 
Sex Dez  8 19:10:19 2017 - [info]  Resetando escravo 172.16.12.13(172.16.12.13:3306) e iniciando replicação do novo mestre 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:10:19 2017 - [debug]  Parando threads de IO/SQL do escravo em 172.16.12.13(172.16.12.13:3306)..
Sex Dez  8 19:11:21 2017 - [debug]   concluído.
Sex Dez  8 19:11:21 2017 - [info]  CHANGE MASTER executado.
Sex Dez  8 19:11:21 2017 - [debug]  Iniciando threads de IO/SQL do escravo em 172.16.12.13(172.16.12.13:3306)..
Sex Dez  8 19:11:22 2017 - [debug]   concluído.
Sex Dez  8 19:11:22 2017 - [info]  Escravo iniciado.
Sex Dez  8 19:25:16 2017 - [info]  gtid_wait(865e07c9-bae8-11e7-8aba-08002729e4f7:1-74770) concluído em 172.16.12.13(172.16.12.13:3306). 2677 eventos executados.
Sex Dez  8 19:25:16 2017 - [info] Fim das mensagens de log de 172.16.12.13.
Sex Dez  8 19:25:16 2017 - [info] -- Escravo no host 172.16.12.13(172.16.12.13:3306) iniciado.
Sex Dez  8 19:25:16 2017 - [info] Todos os novos servidores escravos recuperados com sucesso.
Sex Dez  8 19:25:16 2017 - [info] 
Sex Dez  8 19:25:16 2017 - [info] * Fase 5: Fase de limpeza do novo mestre..
Sex Dez  8 19:25:16 2017 - [info] 
Sex Dez  8 19:25:16 2017 - [info] Resetando informações do escravo no novo mestre..
Sex Dez  8 19:25:16 2017 - [debug]  Limpando informações do escravo..
Sex Dez  8 19:25:16 2017 - [debug]  Parando threads de IO/SQL do escravo em 172.16.12.12(172.16.12.12:3306)..
Sex Dez  8 19:25:16 2017 - [debug]   concluído.
Sex Dez  8 19:25:16 2017 - [debug]  SHOW SLAVE STATUS mostra que o novo mestre não replica de nenhum lugar. OK.
Sex Dez  8 19:25:16 2017 - [info]  172.16.12.12: Reset de informações do escravo bem-sucedido.
Sex Dez  8 19:25:16 2017 - [info] Failover de mestre para 172.16.12.12(172.16.12.12:3306) concluído com sucesso.
Sex Dez  8 19:25:16 2017 - [debug]  Desconectado de 172.16.12.12(172.16.12.12:3306)
Sex Dez  8 19:25:16 2017 - [debug]  Desconectado de 172.16.12.13(172.16.12.13:3306)
Sex Dez  8 19:25:16 2017 - [info] 

----- Relatório de Failover -----

app1: Failover de mestre MySQL 172.16.12.11(172.16.12.11:3306) para 172.16.12.12(172.16.12.12:3306) bem-sucedido

Mestre 172.16.12.11(172.16.12.11:3306) está offline!

Verifique os logs do MHA Manager em db10:/var/log/masterha/app1/manager.log para detalhes.

Failover automatizado (não interativo) iniciado.
IP do mestre invalidado em 172.16.12.11(172.16.12.11:3306)
172.16.12.12(172.16.12.12:3306) selecionado como novo mestre.
172.16.12.12(172.16.12.12:3306): OK: Aplicação de todos os logs bem-sucedida.
172.16.12.12(172.16.12.12:3306): OK: Endereço IP do mestre ativado.
172.16.12.13(172.16.12.13:3306): OK: Escravo iniciado, replicando de 172.16.12.12(172.16.12.12:3306)
172.16.12.12(172.16.12.12:3306): Reset de informações do escravo bem-sucedido.
Failover de mestre para 172.16.12.12(172.16.12.12:3306) concluído com sucesso.

Instalação do MHA

Para instalar o MHA, siga os seguintes passos:

yum install perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager perl-Time-HiRes -y

[root@localhost tools]# rpm -ivh mha4mysql-manager-0.57-0.el7.noarch.rpm   
error: Failed dependencies:  
 perl(Log::Dispatch) is needed by mha4mysql-manager-0.57-0.el7.noarch  
 perl(Log::Dispatch::File) is needed by mha4mysql-manager-0.57-0.el7.noarch  
 perl(Log::Dispatch::Screen) is needed by mha4mysql-manager-0.57-0.el7.noarch  
 perl(Parallel::ForkManager) is needed by mha4mysql-manager-0.57-0.el7.noarch

Em CentOS 6.8, alguns pacotes não são suportados.  
wget http://mirror.centos.org/centos/6/extras/x86_64/Packages/epel-release-6-8.noarch.rpm  
rpm -ivh epel-release-6-8.noarch.rpm

Configuração do Ambiente

Ao configurar os nós do MHA, é importante garantir que:

  • Cada nó tenha acesso SSH configurado
  • Os nomes dos hosts sejam atualizados em /etc/hosts
  • O MAC address seja modificado em clones de VM

Solução de Problemas Comuns

Problemas de Conexão SSH

Se encontrar problemas de conexão SSH:

[root@db13 ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub root@db10  
-bash: ssh-copy-id: command not found

yum -y install openssh-clients

ssh-copy-id -i ~/.ssh/id_rsa.pub root@IP

Verificar: cat ~/.ssh/authorized_keys

Erro de UUID em Replicação

Quando clonar servidores MySQL, pode ocorrer erro de UUID:

Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server UUIDs; these UUIDs must be different for replication to work.

Solução: Excluir o arquivo auto.cnf e reiniciar o MySQL para gerar um novo arquivo.

Problemas de Verificação do MHA

Se os comandos de verificação falharem:

masterha_check_ssh --conf=/etc/mha/app1.cnf

# Se ocorrer erro, adicione a chave pública do manager ao authorized_keys

Erro de GTID na Replicação

Após o failover, podem ocorrer erros de GTID:

Last_IO_Errno: 1236
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

Solução:
stop slave;
reset slave;
reset master;
set global gtid_purged='gtid_do_mestre';
change master to master_host='novo_mestre', master_port=3306, master_user='repl', master_password='senha', master_auto_position=1;
start slave;

Importância do read_only

É crucial configurar read_only=1 nos escravos para evitar inconsistências de GTID durante o failover.

Testes de Failover

Para testar o failover, use o sysbench para gerar carga e então desligar o messtre:

sysbench /usr/share/sysbench/tests/include/oltp_legacy/insert.lua --oltp-tables-count=4 --oltp-table-size=10000000 --oltp-dist-res=95 --mysql-user=root --mysql-password=root123 --mysql-db=sbtest --db-driver=mysql --mysql-socket=/home/data/mysql57/run/mysql.sock --num-threads=4 --max-requests=0 --max-time=300 --report-interval=3 run

Failover Manual

Para realizar um failover manual sem interrupção:

masterha_master_switch --master_state=alive --conf=/etc/mha/app1.cnf --orig_master_is_new_slave

Replicação Semissíncrona

Com replicação semissíncrona:

# Ativar replicação semissíncrona
set global rpl_semi_sync_master_enabled=ON;
set global rpl_semi_sync_slave_enabled=ON;

# Verificar status
show variables like "rpl%";

Importante: Mesmo com replicação semissíncrona, pode haver perda de dados se o mestre falhar abruptamente. Para evitar a transição para modo assíncrono:

set global rpl_semi_sync_master_timeout=100000000000;

Conclusões

  • O MHA fornece failover automático para ambientes MySQL
  • É importante configurar corretamente os parâmetros de replicação
  • O modo semissíncrona reduz a perda de dados mas não elimina completamente
  • Testes regulares de failover são essenciais para garantir a confiabilidade

Tags: MHA MySQL alta-disponibilidade replicação GTID

Publicado em 6-19 04:00