Из-за архитектуры репликации MySQL «один ко многим» необходимо иметь кольцо репликации с несколькими хозяевами, то есть каждый реплицируется из следующего в цикле. На двоих они дублируют друг друга. Это было поддержано еще в v3.23.
В предыдущем месте, где я работал, мы делали это с v3.23 с довольно большим количеством клиентов, чтобы предоставить именно то, что вы просите. Для репликации мы использовали SSH-туннели через Интернет. Нам потребовалось некоторое время, чтобы сделать его надежным, и несколько раз нам приходилось делать двоичные копии одной базы данных в другую (к счастью, ни одна из них не занимала более 2 ГБ и не нуждалась в 24-часовом доступе). Кроме того, репликация в v3 была не такой стабильной, как в v4, но даже в v5 она просто остановится, если обнаружит какую-либо ошибку.
Чтобы учесть неизбежную задержку репликации, мы реструктурировали приложение так, чтобы оно не полагалось на поля AUTOINCREMENT
(и удалили этот атрибут из таблиц). Это было достаточно просто из-за уровня доступа к данным, который мы разработали; вместо того, чтобы использовать mysql_insert_id()
для новых объектов, он сначала создал новый идентификатор и вставил его вместе с остальной частью строки. Мы также внедрили идентификаторы сайтов, которые мы сохранили в верхней половине идентификатора, потому что они были BIGINT
с. Это также означало, что нам не нужно было менять приложение, когда у нас был клиент, которому нужна база данных в трех местах. : -)
Это не было на 100% устойчиво. InnoDB только что получил некоторую видимость, поэтому мы не могли легко использовать транзакции, хотя мы это и рассматривали. Поэтому иногда возникали условия гонки, когда два объекта пытались создать с одинаковым идентификатором. Это означало один сбой, и мы попытались сообщить об этом в приложении. Но это все еще была значительная часть чьей-то работы - следить за репликацией и исправлять ее, когда она сломалась. Важно, чтобы исправить это, прежде чем мы слишком далеко вышли из синхронизации, потому что в некоторых случаях базы данных использовались на на обоих сайтах, и было бы очень трудно реинтегрировать, если бы нам пришлось перестраивать один. 1012 *
Это было хорошее упражнение - участвовать, но я бы не стал его делать снова. Не в MySQL.