La réplication maître-maître n'est pas aussi bonne qu'on pourrait le penser, il en va de même pour le proxy à tour de rôle et les solutions «faciles» similaires. Si vous validez les données en collision sur des serveurs séparés assez rapidement (plus rapidement que le délai entre les serveurs, qui sur les serveurs de production peut durer jusqu'à une seconde *
), les deux accepteront les données. Si vous avez un serveur d'enchères, vous venez de vendre deux fois la même voiture . Qui l'a acheté? Cela dépend de la DB que vous demanderez!
L'application doit savoir qu'il existe en fait 2 bases de données et qu'elle doit connaître leurs deux adresses IP. Si vous voulez "vendre", vous devez fe
DB_number = `auction_number` % `number_of_databases`
( %
est pour modulo
)
... et validez-le dans la base de données DB_number. Si vous obtenez une erreur de connexion, faites-le peut-être avec l'autre (mais dans le cas d'un serveur d'enchères, j'afficherais simplement une erreur).
De plus, les adresses IP doivent être wackamole -d entre les deux serveurs. Dans un scénario de catastrophe, où un serveur de base de données tombe en panne pendant quelques heures en période d'utilisation maximale, vous constaterez que l'application essaiera de se connecter au serveur absent et de se bloquer jusqu'à TIMEOUT, disons, 3 secondes. Soudainement, la moitié de vos requêtes s'exécutent 3 secondes de plus (et elles finissent toutes par arriver à la même base de données - ce qui ne la fait pas fonctionner plus rapidement qu'avant la catastrophe). Cela ne rend pas votre httpd heureux, car il a probablement un pool de connexions limité de threads de gestionnaire de demandes simultanées ...
*
le délai de réplication sur les serveurs de production peut atteindre une seconde complète - je l'ai testé dans une colocation à distance et dans notre centre de données et pendant 99% du temps, il est 0, mais parfois mysql affiche 1s. Sur un trafic massif, j'ai eu de nombreuses collisions en raison de l'application cliente faisant deux demandes résultant en deux requêtes, insérer et sélectionner. Dans certains cas, la ligne n'était pas encore là , nous avons donc utilisé le hachage de l'ID utilisateur et cela a résolu le problème
J'espère que vous apprendrez de mes erreurs ;-)