Replikacja master-master nie jest tak dobra, jak mogłoby się wydawać, to samo dotyczy round-robin proxy i podobnych „łatwych” rozwiązań. Jeśli odpowiednio szybko zbierzesz dane do oddzielnych serwerów (szybciej niż opóźnienie między serwerami, które na serwerach produkcyjnych może wynosić do pełnej sekundy *), oba zaakceptują dane. Jeśli masz serwer aukcyjny, właśnie sprzedałeś dwa razy ten sam samochód . Kto to kupił? To zależy od tego, który DB poprosisz!
Aplikacja musi wiedzieć, że istnieją 2 bazy danych i musi znać oba ich adresy IP. Jeśli chcesz „sprzedać”, powinieneś np
DB_number = `auction_number` % `number_of_databases`
( %jest dla modulo)
... i zatwierdzić do bazy danych DB_number. Jeśli pojawi się błąd połączenia, być może zrób to z drugim (ale w przypadku serwera aukcyjnego po prostu wyświetliłbym błąd).
Ponadto adresy IP powinny być wackamole -d między oboma serwerami. W scenariuszu katastrofy, w którym jeden serwer bazy danych wyłącza się na kilka godzin w szczytowym czasie użytkowania, przekonasz się, że aplikacja będzie próbowała połączyć się z nieobecnym serwerem i zawiesić się, dopóki TIMEOUT, powiedzmy 3s. Nagle połowa twoich zapytań działa o 3 sekundy dłużej (wszystkie ostatecznie trafiają do tej samej bazy danych - co nie sprawia, że działa szybciej niż przed katastrofą). To nie sprawia, że Twój httpd jest szczęśliwy, ponieważ prawdopodobnie ma ograniczoną pulę połączeń współbieżnych wątków obsługi żądań ...
* opóźnienie replikacji na serwerach produkcyjnych może wynosić nawet pełną sekundę - przetestowałem to w zdalnej kolokacji oraz w naszym centrum danych i przez około 99% czasu wynosi 0, ale czasami mysql pokazuje 1s. Na ogromnym ruchu miałem wiele kolizji z powodu złożenia przez aplikację kliencką dwóch żądań, co spowodowało dwa zapytania, wstaw i wybierz. W niektórych przypadkach wiersz po prostu jeszcze nie istniał , więc użyliśmy skrótu ID użytkownika i naprawiłem problem
Mam nadzieję, że nauczysz się na moich błędach ;-)