La replica master-master non è buona come si potrebbe pensare, lo stesso vale per il proxy round-robin e simili soluzioni "facili". Se si impegna la collisione dei dati su server separati abbastanza velocemente (più veloce del ritardo tra i server, che sui server di produzione potrebbe arrivare fino a un secondo intero *
), entrambi accetteranno i dati. Se hai un server di aste, hai appena venduto la stessa auto due volte . Chi l'ha comprato? Dipende da quale DB chiederai!
L'applicazione deve essere consapevole che in realtà ci sono 2 database là fuori e deve conoscere entrambi i loro indirizzi IP. Se vuoi "vendere", dovresti fe
DB_number = `auction_number` % `number_of_databases`
( %
è per modulo
)
... e esegui il commit nel database DB_number. Se ricevi un errore di connessione, forse fallo con l'altro (ma nel caso di un server di aste, visualizzerei solo un errore).
Inoltre, gli indirizzi IP dovrebbero essere wackamole -d tra entrambi i server. In uno scenario di disastro, in cui un server di database si arresta per un paio d'ore nel periodo di massimo utilizzo, scoprirai che l'applicazione proverà a connettersi al server assente e si bloccherà fino a TIMEOUT, diciamo, 3s. All'improvviso, la metà delle tue query dura 3 secondi più a lungo (e alla fine vanno tutte allo stesso database, il che non lo rende più veloce di prima del disastro). Questo non rende felice il tuo httpd, poiché probabilmente ha un pool di connessioni limitato di thread di gestori di richieste simultanee ...
*
il ritardo di replica sui server di produzione potrebbe arrivare fino a un secondo intero : l'ho verificato in una posizione remota e nel nostro data center e per circa il 99% delle volte è 0, ma a volte mysql mostra 1s. Su traffico intenso ho avuto molte collisioni a causa dell'applicazione client che ha fatto due richieste risultanti in due query, inserire e selezionare. Per alcuni casi, la riga proprio non c'era ancora , così abbiamo usato hash della userID e risolto il problema
Spero che imparerai dai miei errori ;-)