Resposta à pergunta 1
A replicação do MySQL sofre de dois grandes problemas
-
A replicação do MySQL é assíncrona . Isso pode introduzir atraso de replicação. Isso se manifesta com problemas de comunicação entre um mestre e um escravo via thread de E / S escravo. Isso pode ser visto logicamente e numericamente em
Seconds_Behind_Master
. -
Data Drift
. Essa é uma condição intermitente em que um mestre e um escravo estão simplesmente fora de sincronia devido a fatores fora do reino da Replicação do MySQL. Por exemplo, observe uma maneira de sincronizar melhor a replicação: use a opçãosync-binlog
. Quando você configurasync-binlog
para 1, o mysqld irá executar um flush do log binário atual para cada entrada que você gravar no log binário. Isso pode ridicularizar um Mestre. Por padrão,sync-binlog
é 0.- Aqui está uma pergunta: Com
sync-binlog=0
, quem é responsável por liberar o log binário para o disco? - Resposta (por favor, sente-se para este): O SISTEMA OPERACIONAL !!!
- Com essa resposta, isso coloca o Escravo como uma desvantagem terrível, porque seu encadeamento de E / S está à mercê do Sistema Operacional do Mestre. Quando o sistema operacional do Mestre se movimenta para liberar as alterações do log binário para o disco e o encadeamento de E / S do escravo pode detectar a próxima instrução SQL de entrada, a instrução é enviada através do encadeamento de E / S para o escravo.
- Percona tem um PDF agradável ao lidar com a deriva de dados
- Aqui está uma pergunta: Com
Resposta à pergunta 2
A resposta direta aqui é não porque pt-table-sync
foi projetado para detectar o thread de E / S de um Slave por meio da opção --sync-to-master
.
Resposta à pergunta 3
A resposta direta aqui é não porque o MySQL Replication exige saber
- qual é o log binário atual no mestre? (isso é
Master_Log_File
deSHOW SLAVE STATUS\G
) - qual é a posição mais recente que o Escravo leu no registro binário atual do Mestre? (isso é
Read_Master_Log_Pos
deSHOW SLAVE STATUS\G
)
Se você quer simplesmente que seus logs binários saiam do caminho, você pode fazer uma das duas coisas
- OPÇÃO 1: no mestre, defina
expire-logs-days
a 3 para manter os últimos 3 dias de registros binários- Adicione
expire-logs-days=3
em /etc/my.cnf - Não é necessário reiniciar: basta executar
SET GLOBAL expire_logs_days = 3;
- Adicione
- OPÇÃO 2: Executar
SHOW SLAVE STATUS\G
no Escravo. Pegue o valor deRelay_Master_Log_File
. e use-o para limpar os logs binários no mestre para criar esse arquivo de log.- Suponha que você execute
SHOW SLAVE STATUS\G
no escravo - Você recebe este
Relay_Master_Log_File: mysql-bin.000035
- Execute isso no mestre:
PURGE BINARY LOGS TO 'mysql-bin.000035';
- Suponha que você execute
SUGESTÃO
Se você quiser ter mais fé na sincronização da tabela de pt, tente usar a opção --print
e redirecionar para um arquivo de texto em vez da opção --execute
. Isso gerará o SQL que normalmente seria executado no mestre. Você poderia simplesmente executar o SQL diretamente nesse Slave depois disso. Pense nisso como um ensaio geral para --execute
.