Репликация мастер-мастер не так хороша, как вы могли бы подумать, то же самое относится и к циклическому прокси и аналогичным «простым» решениям. Если вы передаете конфликтующие данные на отдельные серверы достаточно быстро (быстрее, чем задержка между серверами, которая на рабочих серверах может составлять до полной секунды *
), оба примут данные. Если у вас есть сервер аукциона, вы продали один и тот же автомобиль дважды . Кто купил это? Это зависит от того, какую БД Вы спросите!
Приложение должно знать, что на самом деле существует 2 базы данных, и оно должно знать оба их IP-адреса. Если Вы хотите «продать», Вам следует
DB_number = `auction_number` % `number_of_databases`
( %
для modulo
)
... и передать его в базу данных DB_number. Если вы получаете ошибку соединения, то, возможно, сделайте это с другим (но в случае сервера аукциона я бы просто отобразил ошибку).
Кроме того, IP-адреса должны быть wackamole -d между обоими серверами. В случае аварии, когда один сервер базы данных отключается в течение нескольких часов в пиковое время использования, вы обнаружите, что приложение будет пытаться подключиться к отсутствующему серверу и зависать, пока время не истечет, скажем, 3 с. Внезапно половина ваших запросов выполняется на 3 секунды дольше (и все они в конечном итоге попадают в одну и ту же базу данных, что не позволяет выполнять ее быстрее, чем до катастрофы). Это не делает Ваш httpd счастливым, так как он, вероятно, имеет ограниченный пул соединений с параллельными потоками обработчика запросов ...
*
Задержка репликации на производственных серверах может составлять до полной секунды - я проверил это в удаленном расположении и в нашем центре обработки данных и примерно в 99% случаев это 0, но иногда mysql показывает 1 с. При большом трафике у меня было много коллизий из-за того, что клиентское приложение делало два запроса, в результате чего два запроса вставлялись и выбирались. В некоторых случаях строки просто еще не было , поэтому мы использовали хэш userID, и это устранило проблему
Я надеюсь, что Вы будете учиться на моих ошибках ;-)