Die Master-Master-Replikation ist nicht so gut, wie Sie vielleicht denken. Gleiches gilt für den Round-Robin-Proxy und ähnliche "einfache" Lösungen. Wenn Sie kollidierende Daten schnell genug auf separate Server übertragen (schneller als die Verzögerung zwischen den Servern, die auf Produktionsservern bis zu einer vollen Sekunde betragen kann *), akzeptieren beide die Daten. Wenn Sie einen Auktionsserver haben, haben Sie dasselbe Auto nur zweimal verkauft . Wer hat es gekauft? Es kommt darauf an, welche DB Sie fragen werden!
Die Anwendung muss sich darüber im Klaren sein, dass es tatsächlich zwei Datenbanken gibt, und sie muss beide IP-Adressen kennen. Wenn Sie "verkaufen" möchten, sollten Sie z
DB_number = `auction_number` % `number_of_databases`
( %ist für modulo)
... und schreiben Sie es in die Datenbank DB_number. Wenn Sie einen Verbindungsfehler erhalten, tun Sie dies möglicherweise mit dem anderen (aber im Falle eines Auktionsservers würde ich nur einen Fehler anzeigen).
Außerdem sollten die IP-Adressen zwischen beiden Servern wackamole -d sein. In einem Katastrophenszenario, in dem ein Datenbankserver in der Hauptnutzungszeit einige Stunden lang ausfällt, versucht die Anwendung, eine Verbindung zum abwesenden Server herzustellen und bis TIMEOUT zu warten, z. B. 3 Sekunden. Plötzlich läuft die Hälfte Ihrer Abfragen drei Sekunden länger (und alle gehen schließlich in dieselbe Datenbank - was nicht dazu führt, dass sie schneller ausgeführt werden als vor der Katastrophe). Dies macht Ihr httpd nicht glücklich, da es wahrscheinlich einen begrenzten Verbindungspool von Threads für gleichzeitige Anforderungshandler hat ...
* Die Replikationsverzögerung auf Produktionsservern kann bis zu einer vollen Sekunde betragen. Ich habe dies in einem Remote-Colocation und in unserem Rechenzentrum getestet und in 99% der Fälle ist es 0, aber manchmal zeigt MySQL 1s an. Bei massivem Datenverkehr hatte ich viele Kollisionen, weil die Clientanwendung zwei Anforderungen stellte, was zu zwei Abfragen führte: Einfügen und Auswählen. Bei einigen Fällen war die Reihe dort einfach nicht noch , so wir Hash - Wert des userID verwendet und das Problem behoben
Ich hoffe du lernst aus meinen Fehlern ;-)