Na ordenação para simplificar a promoção do Escravo para um Mestre, tenho uma sugestão para manter o Escravo mais próximo do Mestre.
Você deve usar a ferramenta mk-slave-prefetch .
Aqui está a beleza dessa ferramenta: Em um escravo, ele lerá os logs de retransmissão, procurará todas as consultas que tenham uma cláusula WHERE, convertê-lo em SELECT e executá-lo. Dessa forma, os caches para InnoDB e MyISAM são essencialmente os mesmos no Escravo e no Mestre. As diferenças devem ser menores.
Aqui está outra coisa que você precisará: Ter a configuração Mestre e Escravo usando a Replicação Circular. Dessa forma, tanto o mestre quanto o escravo têm o log binário ativado.
Como isso ajuda? Quando o Master falha e você faz o failover para o Slave, o arquivo master.info no Master conterá o último local em que o Slave executou seu SQL. Aqui está como você descobre:
Para este exemplo, teremos a Replicação Circular entre M1 e M2
Execute este comando no M2 (seu mestre atual): SHOW SLAVE STATUS\G
Você deve ver algo assim:
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.64.100.253
Master_User: replicant
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000834
Read_Master_Log_Pos: 823413571
Relay_Log_File: relay-bin.002505
Relay_Log_Pos: 823391419
Relay_Master_Log_File: mysql-bin.000834
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: 823391282
Relay_Log_Space: 823413708
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: 1
1 row in set (0.00 sec)
Por favor, tome nota de dois campos:
- Relay_Master_Log_File
- Exec_Master_Log_Pos
Esses dois campos representam o último arquivo de log e a posição de registro de um mestre que foi executado com sucesso no escravo.
Suponha que o M1 falhou, você fez failover para o M2 e exibiu o M1. Seu objetivo é restabelecer a Replicação Circular. Com uma falha, existe a possibilidade de a replicação perder o seu lugar. Aqui está o que fazer:
Step01) Execute SHOW SLAVE STATUS\G
no M1
Step02) Obtenha Relay_Master_Log_File
e Exec_Master_Log_Pos
do Step01. Para este exemplo, deixe Relay_Master_Log_File
ser mysql-bin.000834 e Exec_Master_Log_Pos
seja 823391282.
Step03) Execute estes comandos
STOP SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000834',master_log_pos=823391282;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G
Aqui está o que procurar:
- Se Seconds_Behind_Master for numérico, a replicação está em execução. Apenas espere até chegar a zero.
- Se Seconds_Behind_Master for NULL, a Replicação está Quebrada
- Se Slave_IO_Running = Yes e Slave_SQL_Running = No, um erro de SQL quebrou a replicação. Prossiga para corrigir o erro
- Se Slave_IO_Running = No e Slave_SQL_Running = Yes, então o arquivo de log ou posição de log não existe.
Você pode corrigir isso com
STOP SLAVE;
CHANGE MASTER TO master_log_file='mysql-bin.000835',master_log_pos=<new pos>;
START SLAVE;
SELECT SLEEP(5);
SHOW SLAVE STATUS\G
O que é o newpos?
- Para o MySQL 5.5, o newpos é 107
- Para o MySQL 5.1, newpos é 106
- Para o MySQL 5.0, o newpos é 98
Se você implementar a Replicação Circular e roteirizar adequadamente essas coisas usando esses princípios, você obterá a recuperação do Mestre e do Escravo.