Данное руководство описывает порядок настройки master — master репликации баз данных на основе MySQL. Все шаги выполняются с учетом того, что в данный момент на сервере №1 база находится по нагрузкой, в неё могут также вносится изменения, поэтому нельзя допустить утерю данных.
Данное руководство описывает порядок настройки master — master репликации баз данных на основе MySQL. Все шаги выполняются с учетом того, что в данный момент на сервере №1 база находится по нагрузкой, в неё могут также вносится изменения, поэтому нельзя допустить утерю данных.
Для примера предположим, что у нас есть два сервера (Сервер№1 и Сервер№2) с следующими характеристиками:
Master–Master Репликация: Характеристики серверов и схема взаимодействия.
Весь процесс настройки можно условно разделить на два этапа:
• На втором этапе мы организовываем обратную master-slave репликацию, и сервера начинают собирать информацию из логов друг друга.
Первый этап:
Для настройки master-slave репликации необходимо сделать следующее:
На Сервер№1 – настраиваем главный мастер сервер:
2. Перейти в папку %Путь к MySQL%\MySQL Server 5.0\data\ и скопировать в временную папку его содержимое либо добавить в архив. Конкретно нам нужно скопировать папки с необходимыми базами данных, а также файл ibdata1. В случае, если используются только базы данных типа MyISAM, то достаточно копирования только папок, а файла ibdata1 не будет.
3. Перейти в папку %Путь к MySQL%\MySQL Server 5.0\ и добавить в файл my.ini следующее:
auto_increment_increment=2
auto_increment_offset=1
# Master records
log-bin = my-bin
server-id = 1
slave-compressed = 1
binlog-do-db = db1
binlog-do-db = db2
auto_increment_increment и auto_increment_offset устанавливают для данного сервера назначение автоматически только нечетных id. Этим самым мы избежим добавление с одинаковым ID на разные сервера записей, и при синхронизации данные не перетрутся;
log-bin — устанавливает название файла лога транзакций;
server-id – уникально идентифицирует сервер среди участников репликации;
slave-compressed – включение сжатия потока;
binlog-do-db – указывают базы, по которым вести лог транзакций.
5. Создадим учетную запись с правами на рапликацию:
GRANT REPLICATION SLAVE ON *.* TO ‘slave_user’@’192.168.1.6’ IDENTIFIED BY ‘password’;
На Сервер№2 – настраиваем подчиненный сервер:
7. Распаковать архив с базами данных Сервер№1 в соответствующую папку %Путь к MySQL%\MySQL Server 5.0\data\ с заменой существующих.
8. Добавить в my.ini следующие записи:
auto_increment_increment=2
auto_increment_offset=2
# Slave records
server-id=2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
master-host=192.168.1.5
master-user=slave_user
master-password=password
master-port = 3306
master-connect-retry=10
replicate-do-db=db1
replicate-do-db=db2
master-host — Имя хоста головного сервера или IP-адрес для репликации.
master-user — Имя пользователя, которое подчиненный сервер будет использовать для аутентификации при подсоединении к головному серверу.
master-password — Пароль, который будет использоваться при подсоединении подчиненного сервера к головному серверу.
master-port — Порт, который слушает головной сервер.
master-connect-retry — Время ожидания в секундах для потока подчиненного сервера перед повторением попытки установить связь с головным сервером в случае прекращения работы головного сервера или потери связи. По умолчанию — 60.
replicate-do-db — Сообщает подчиненному серверу, что реплицироваться должна только указанная база данных.
Второй этап:
Для настройки master-master репликации необходимо сделать следующее:
На Сервер№2 – настраиваем главный мастер сервер параллельно с рабочим подчинённым :
GRANT REPLICATION SLAVE ON *.* TO ‘slave_user’@’192.168.1.5’ IDENTIFIED BY ‘password’;
# Master records
log-bin = my-bin
binlog-do-db = db1
binlog-do-db = db2
На Сервер№1 – настраиваем подчиненный сервер параллельно с рабочим главным:
# Slave records
master-host=192.168.1.6
master-user=slave_user
master-password=password
master-port = 3306
master-connect-retry=10
replicate-do-db=db1
replicate-do-db= db2
relay-log=slave-relay-bin
relay-log-index=slave-relay-bin.index
После этого master-master репликации работает. В случае, если очередная репликация не будет произведена из за ошибки, в логах появится соответствующая запись.
Вывод из Master-Master репликации MySQL серверов.
В случае, если решено уйти от схемы кластеризации и завершить репликацию между серверами, необходимо сделать следующее:
Выполнить в консоли mysql на обоих серверах поочередно, с начала на Server#1 потом на Server#2 каждый шаг:
2. reset slave;
3. reset master;
4. Закомментировать блоки # Master records и # Slave records в my.ini;
5. В случае, если в дальнейшем клиентские запросы будет обрабатывать только один из серверов, то необходимо также закомментировать или убрать auto_increment_increment и auto_increment_offset. Если планируется их дальнейшая репликация, то указанные записи убирать не стоит, т.к. при последующем включении репликации возможны ошибки и завершение её из за дублирования uid;
6. Перезапустить демона MySQL.

4.10.5. Опции репликации в файле my.cnf
Для использования репликации рекомендуется MySQL 3.23.33 или выше. С более
ранними версиями тоже можно работать, но в них имеются ошибки и
отсутствуют некоторые возможности. Если у вас не самая последняя версия
MySQL, то в ней может не оказаться некоторых из упомянутых в данном
разделе опций. Все опции, появившиеся в ветви 4.0, сопровождаются
примечанием, в котором это указано. В противном случае, если интересующая
вас опция не присутствует в версии 3.23, но действительно необходима,
пожалуйста, замените версию на самую новую ветвь 3.23.
Не следует забывать о том, что ветвь 4.0 все еще находится в стадии
альфа-разработки, поэтому некоторые функции могут работать не так гладко,
как хотелось бы. Новые возможности, появившиеся в 4.0, рекомендуется
использовать так, чтобы в случае возникновения проблемы не нарушилась
работа приложения.
Как на головном, так и на подчиненном серверах нужно использовать опцию
server-id. Она устанавливает уникальный идентификатор репликации. Нужновыбрать уникальное значение из диапазона от 1 до 2^32-1 для каждого
головного и подчиненного сервера, например:
server-id=3В следующей таблице представлены опции, которые можно использовать для
головного сервера.
log-bin=filenameзаписи. Обратите внимание: если передаваемый параметр имеет расширение
(например
log-bin=/mysql/logs/replication.log), то в случае вызовакоманды
FLUSH LOGSверсии MySQL ниже 3.23.24 не будут правильно работатьво время репликации. Эта проблема устранена в версии 3.23.25. Теперь, если
используется такой способ определения имени журнала, команда
FLUSH LOGSдля двоичных журналов будет игнорироваться. Для очистки журнала выполните
команду
FLUSH MASTERи не забудьте запустить командуFLUSH SLAVEна всех подчиненных серверах. В версии 3.23.26 или выше нужно использовать для
этого команды
RESET MASTERиRESET SLAVEВы можете использовать эту опци. если вы хотите иметь имя, которое будет независимо
от имени хоста (может быть полезно, скажем, если вы переименуете ваш сервер в один прекрасный день).
log-bin-index=filenameкоманду
FLUSH LOG, нужно знать, какойжурнал является активным в настоящее
время, а также какие журналы
использовались ранее и в какой
последовательности они сменялись. Эта
информация сохранена в индексном файле
двоичного журнала, имя которого по
умолчанию
имя_хоста.index. Имя исодержимое данного файла не следует
изменять.
Пример:
log-bin-index=db.indexsql-bin-update-sameустановке значения переменной
SQL_LOG_BINэто же значение будет автоматически
установлено и для переменной
SQL_LOG_UPDATE, и наоборот.binlog-do-db=database_nameдолжен вести записи об обновлениях в
двоичном журнале, если текущая база
данных —
database_name. Все другие базыданных игнорируются. Обратите внимание:
при использовании этой опции вы должны
быть уверены, что обновления будут
производиться только в текущей базе
данных.
Пример:
binlog-do-db=salesbinlog-ignore-db=database_nameтекущая база данных —
database_name, тозаписи об обновлениях не должны вестись в
двоичном журнале. Обратите внимание: при
использовании этой опции вы должны быть
уверены, что обновления будут
производиться только в текущей базе
данных.
Пример:
binlog-ignore-db=accountingВ следующей таблице представлены опции, которые можно использовать для
подчиненного сервера:
master-host=hostрепликации. Если значение этой опции не
установлено, поток подчиненного сервера не будет
запущен. Обратите внимание: установка
master-hostбудет игнорироваться, если существует корректный
файл
master.info. Возможно, лучше было бы назватьэти опции как-нибудь иначе, что-то вроде
bootstrap-master-host, но менять их имена ужепоздно.
Пример:
master-host=db-master.mycompany.commaster-user=usernameиспользовать для аутентификации при подсоединении
к головному серверу. Пользователь должен иметь
привилегию
FILE. Если пользователь головногосервера не установлен, будет использовано имя
пользователя
test. Если удастся считать значениеиз файла
master.info, то оно будет иметь большийприоритет.
Пример:
master-user=scottmaster-password=passwordподсоединении подчиненного сервера к головному
серверу. Если этот пароль не установлен, будет
использоваться пустой пароль. Если удастся считать
значение из файла
master.info,то оно будет иметьбольший приоритет.
Пример:
master-password=tigermaster-port=portnumberне установлен, используется откомпилированная
установка
MYSQL_PORT. Это должно быть значение3306, если оно не было изменено при помощи опцийconfigure. Если удастся считать значение из файлаmaster.info, то оно будет иметь больший приоритетПример:
master-port=3306master-connect-retry=secondsсервера перед повторением попытки установить связь
с головным сервером в случае прекращения работы
головного сервера или потери связи. По умолчанию
— 60.
Пример:
master-connect-retry=60master-sslрепликации. Это относительно новая опция, поэтому
применять ее следует осторожно.
Пример:
master-sslmaster-ssl-keySSL на головном сервере. Используется только в том
случае, если включена опция
master-ssl.Пример:
master-ssl-key=SSL/master-key.pemmaster-ssl-certфайла-сертификата SSL. Используется только в том
случае, если включена опция
master-ssl.Пример:
master-ssl-key=SSL/master-cert.pemmaster-info-file=filenameинформация о том, где на головном сервере
произошла остановка во время выполнения
репликации. По умолчанию это файл
master.infoвдиректории данных. Изменять это местоположение нет
необходимости.
Пример:
master-info-file=master.inforeport-hostIP-адрес подчиненного сервера, который передается
головному серверу во время регистрации
подчиненного сервера. Может быть выведен командой
SHOW SLAVE HOSTS. Не устанавливайте эту опцию,если не хотите, чтобы подчиненный сервер
регистрировался на головном сервере. Обратите
внимание: для того, чтобы головной сервер
установил соединение с подчиненным сервером, ему
недостаточно просто получить IP-адрес подчиненного
сервера из соединения. Из-за
NATи других проблеммаршрутизации IP-адрес может быть недопустимым для
подсоединения головного сервера или других хостов
к подчиненному серверу.
Пример:
report-host=slave1.mycompany.comreport-portсоединения с подчиненным сервером, имя хоста или
IP-адрес которого были переданы головному серверу
при регистрации подчиненного сервера. Порт нужно
устанавливать лишь в том случае, когда подчиненный
сервер слушает порт, который задан не по
умолчанию, или если имеется специальный тоннель от
головного сервера или других клиентов к
подчиненному серверу. Не используйте эту опцию,
если не уверены в своих действиях.
replicate-do-table=db_name.table_nameреплицировать только указанную таблицу. Для
указания более чем одной таблицы директиву следует
использовать несколько раз, по одному разу для
каждой таблицы. В отличие от
replicate-do-db,данную опцию можно применять для обновлений, в
которых используется несколько баз данных.
Пример:
replicate-do-table=some_db.some_tablereplicate-ignore-table=db_name.table_nameне должны реплицироваться. Для указания
более чем одной таблицы директиву следует задавать
несколько раз, по одному разу для каждой таблицы.
В отличие от
replicate-do-db, данную опцию можноприменять для обновлений, в которых используется
несколько баз данных.
Пример:
replicate-ignore-table=db_name.some_tablereplicate-wild-do-table=db_name.table_nameзапросы, где хоть одна из таблиц удовлетворяет указанном шаблону. Для указания
более чем одной таблицы директиву следует задавать несколько раз, по одному
разу для каждой таблицы. Данную опцию можно применять для обновлений, в
которых используется несколько баз данных. Пример: при использовании
replicate-wild-do-table=foo%.bar%будут реплицироваться обновлениятолько таблиц с именами, начинающимися с «bar», которые находятся в базах
данных, с именами, начинаются с «foo».
Заметьте, что если вы используете
replicate-wild-do-table=foo%.%тогдаэто правило также распространяется и на
CREATE DATABASEи наDROP DATABASE, т.е. эти два выражения также будут реплицированы если имя базыданных совпадет с шаблоном (
'foo%'в этом примере; это получается из-затого, что символ
%становится шаблонным).replicate-wild-ignore-table=db_name.table_nameреплицироваться не должны. Для указания более чем
одной подлежащей игнорированию таблицы директиву
следует задавать несколько раз, по одному разу для
каждой таблицы. Данную опцию можно применять для
обновлений, в которых используется несколько баз
данных. Например, при использовании
replicate-wild-do-table=foo%.bar%не будутреплицироваться обновления всех таблиц,
начинающихся на «bar», в базах данных, имена
которых начинаются на «foo».
replicate-ignore-db=database_nameодин запрос, в котором текущая база данных —
database_name. Чтобыуказать более одной базы данных, директиву следует использовать несколько раз,
по одному разу для каждой базы данных.
Вы не должны использовать эту директиву,
если вы используете кросс-табличные обновления, и не хотите чтобы
эти обновления реплицировались.
Основная причина такого поведения заключается в том, что очень трудно
из самой команды понять, должен ли этот запрос реплицироваться или нет.
Например, если вы используете многотабличное удаление или многотабличное обновление
в MySQL 4.x, которое охватывает более чем одну базу данных.
Кроме того, достаточно быстро можно проверить, является ли текущая база данных
соответствующей, т.к. эта проверка выполняется только на момент соединения или смены базы данных.
Если такие обновления необходимо производить, убедитесь, что у вас установлена
версия MySQL 3.23.28 или выше и используйте
replicate-ignore-db=db_name.%.Пример:
replicate-ignore-db=some_dbreplicate-do-db=database_nameдолжна только указанная база данных. Чтобы указать
более одной базы данных, директиву следует
использовать несколько раз, по одному разу для
каждой базы данных. Заметьте, что не будут реплицироваться
обновления, охватывающие несколько баз данных, такие как
UPDATE some_db.some_table SET foo='bar'при том, что выбрана другая база данных или не выбрана вовсе.Если такие обновления необходимо производить, убедитесь, что у вас установлена
версия MySQL 3.23.28 или выше и используйте
replicate-wild-do-table=db_name.%.Пример:
replicate-do-db=some_dblog-slave-updatesзаписи об обновлениях, происходящих на подчиненном
сервере, в двоичном журнале. По умолчанию эта
опция выключена. Ее следует включить, если
требуется организовать подчиненные серверы в
гирляндную цепь.
replicate-rewrite-db=from_name->to_nameданных, а в базу данных с именем, указанным в
опции.
Пример:
replicate-rewrite-db=master_db_name->slave_db_nameslave-skip-errors= [err_code1,err_code2,... | all]потоку подчиненного сервера, что он должен
продолжать репликацию, если запрос возвращает
ошибку, указанную в списке. Обычно при
возникновении ошибки выполнение реплицирование
прекращается, чтобы пользователь мог вручную
исправить несоответствия в данных. Не используйте
данную опцию, если вы до конца не разобрались в
причинах возникновения ошибок. Если не было
допущено ошибок при установке репликации, нет
ошибок в клиентских программах и нет никаких
ошибок непосредственно в MySQL, то прекращения
работы из-за ошибки происходить не должно.
Неразборчивое применение данной опции может
привести к тому, что подчиненный сервер окажется
безнадежно не синхронизированным с головным
сервером, и вы будете тщетно ломать себе голову
над тем, каким образом это случилось. Код ошибок
можно получить в сообщениях об ошибках в журнале
ошибок и в выводе команды
SHOW SLAVE STATUS.Полный список сообщений об ошибках можно найти в
файле исходного дистрибутива
Docs/mysqld_error.txt. Можно также (но не нужно)использовать значение
all(хотя этого делатьнастоятельно не рекомендуется) — тогда будут
игнорироваться все сообщения об ошибках и за
процессом переброски данных наблюдения не будет.
Само собой разумеется, при использовании этой
опции целостность данных ставится под угрозу. В
этом случае просьба не жаловаться, если данные на
подчиненном сервере не будут соответствовать
данным на головном сервере, — вас предупреждали.
Пример:
slave-skip-errors=1062,1053илиslave-skip-errors=allskip-slave-startподчиненный сервер, что при его запуске не должен
запускаться подчиненный сервер. Пользователь может
запустить его позже при помощи команды
SLAVE START.slave_compressed_protocol=#если оба, и сервер и клиент, поддерживают сжатие.
slave_net_timeout=#от головного сервера, после чего чтение будет
прервано.