Eu tenho a configuração de replicação mostrada na imagem. Tudo se replica para todos os lugares. Uma das tabelas mantém dados da sessão que possuem linhas que devem ser excluídas devido à expiração. Criei um evento que verifica sessões expiradas uma vez por dia e as exclui:
DELETE FROM session
WHERE expiration < (UNIX_TIMESTAMP() - 7200);
Minhas perguntas são estas:
- Isso levará a uma condição instável em que cada um dos bancos de dados estará (quase) executando simultaneamente o evento e ao mesmo tempo tentando replicar as atualizações?
- Em caso afirmativo, um evento pode ser restrito a uma única instância de banco de dados com SQL ou por algum outro meio?
- Um evento é a ferramenta adequada para este trabalho?
Observe que o Site A e o Site B estão fisicamente separados (costa leste e oeste dos EUA), portanto há atraso na rede.
Editar: Este é o MySQL 8.0.36
Cada instância do MySQL no conjunto de réplicas deve ter um exclusivo
server_id
(leia https://dev.mysql.com/doc/refman/8.0/en/replication-options.html#sysvar_server_id ).O número
1234567
acima é apenas um exemplo. Você substituiria isso peloserver_id
usado em uma de suas instâncias do MySQL.Isso tornará a condição da sua
DELETE
instrução falsa para todas as linhas, a menos que o evento esteja sendo executado em uma instância específica que corresponda ao arquivoserver_id
.Você pode querer fazer isso baseado em dados, armazenando o
server_id
valor em uma tabela e codificando seu evento para que ele leia o valor dessa tabela. Então você poderia facilmente mudar qual instância executará oDELETE
, atualizando o valor na tabela. Você também pode desabilitar exclusões temporariamente definindo o valor como um número que não corresponda a nenhum deserver_id
seu conjunto de réplicas.