Nous utilisons MySQL Cluster avec proxySQL et avons la configuration suivante :
La question est la suivante : L'utilisateur sur le serveur 2 déclenche SQL UPDATE, UPDATE client SET name= 'New Name' WHERE id = 123. (Cette mise à jour est envoyée au serveur 1, puis le serveur 2 est mis à jour)
Dans le même bloc de code, si nous sélectionnons l'enregistrement (SELECT nom FROM clients WHERE id =123), la requête sera envoyée au serveur local et le résultat sera "ancien nom" sauf si nous mettons le code en pause pendant 1 seconde ( pour tester).
Une solution à laquelle nous avons pensé était de changer la connexion (PHP) et d'accéder directement au serveur 1 pour obtenir le reste du bloc de code, mais cela va à l'encontre de l'objectif et est loin d'être idéal (une base de code discrètement volumineuse doit être mise à jour).
Existe-t-il une solution impliquant proxySQL ?
Pour éviter que les requêtes ne soient acheminées vers des serveurs esclaves avec une latence de réplication élevée, vous pouvez définir un seuil de latence de réplication maximale dans la colonne mysql_server de la table. Délai de réplication maximum. Référence : max_replication_lag
max_replication_lag – Si supérieur à 0, ProxySQL le fera Surveillez régulièrement la latence de réplication et vérifiez si elle dépasse les limites configurées. seuil, il évitera temporairement l'hôte jusqu'à ce que la réplication rattrape son retard.
Vous pouvez également créer des règles de requête pour diviser la lecture et l'écriture des requêtes. ref : ProxySQL fractionné lecture/écriture
Important : proxysql-gtid-causal-reads Si vous utilisez Mysql version 5.7.5 ou supérieure, cela peut principalement résoudre votre problème.