Могу ли я использовать mysql binlog с ведущего устройства в качестве журнала реле на ведомом устройстве?

У меня следующая схема репликации Mysql:

A (ведущий) -> B (ведомый / ведущий) -> C (ведомый)

  • А пишет бинлог
  • B читает binlog A, применяет relaylog и записывает свой собственный binlog
  • C читает из B и применяется.

Если репликация прервалась по какой-либо причине (A-> B), могу ли я скопировать binlog A, найти, какая позиция соответствует последнему выполненному оператору B, и воспроизвести его. Одинаков ли порядок транзакций / операторов в журналах bin / relay во всей цепочке репликации? (Репликация использует один поток, поэтому порядок может быть одинаковым.)

Обновление: мне следовало спросить, например: «Одинаков ли порядок операторов / транзакций в журналах для всей цепочки репликации? Можем ли мы воспроизвести любой журнал на любом хосте и перенаправить любое подчиненное устройство (c) на главный ( А) «Кажется, что ответ:« Да ». Но официального подтверждения или ссылки на документацию (исходный код) еще не было опубликовано.

ОБНОВЛЕНИЕ 2: из официальных документов на innodb_support_xa:

Включает поддержку InnoDB для двухфазной фиксации в транзакциях XA, вызывая дополнительную очистку диска для подготовки транзакции. Механизм XA используется внутри компании и необходим для любого сервера, на котором включен двоичный журнал и который принимает изменения в своих данных из более чем одного потока. Если вы отключите innodb_support_xa, транзакции могут быть записаны в двоичный журнал в другом порядке, чем их фиксирует действующая база данных, что может создавать разные данные при воспроизведении двоичного журнала при аварийном восстановлении или на ведомом устройстве репликации.


person tamerlaha    schedule 23.09.2015    source источник


Ответы (3)


Чтобы прямо ответить на ваш вопрос, нет.

Ваша топология:

(а) мастер -> (б) реплика -> (в) реплика

  • A = Master, bin-log должен быть включен
  • B = Реплика A, должна быть включена log_slave_updates
  • C = копия B

Каждый bin-журнал для каждого сервера будет иметь свое собственное имя и позицию файла bin-log, вы не можете копировать журналы bin между серверами.

Если вы хотите управлять топологией репликации, перемещением ведомых устройств и аварийным переключением, вам следует использовать одно из следующих действий:

  1. MySQL 5.6 с GTID
  2. MHA
  3. Orchestrator

ОБНОВЛЕНИЕ:

Это ничего не значит, что вы должны корневую причину как репликация mysql рассинхронизация и устраните эту проблему, чтобы предотвратить ее.

person Dave    schedule 09.10.2015
comment
Привет, Дэйв. Я знаю о разном положении и имени файла. Что, если я смогу найти позицию последнего выполненного состояния на ведомом устройстве (с помощью mysqlbinlog) и соответствующие позиции в binlog ведущего. Это будет работать? - person tamerlaha; 12.10.2015
comment
Чтение вашего обновления к вашему сообщению, если на сервер B ничего не было записано вне репликации с A, это должно сработать. MHA действительно работает таким образом, см. code.google.com/p/mysql -master-ha / wiki / Архитектура. - person Dave; 14.10.2015

Чтобы прояснить ваш вопрос. Если репликация останавливается между A -> B и, возможно, это невозможно исправить. Можно ли вместо этого выполнить репликацию из A -> C. Ответ положительный.

В вашем примере оба A и B пишут в binlog. Порядок заявлений в этих журналах будет таким же, хотя я не могу найти документацию, подтверждающую это, это основной принцип репликации. Если бы порядок был другим, то данные могли бы довольно легко рассинхронизироваться. И вы правы, подчиненный поток репликации является однопоточным, поэтому хост B будет читать и писать операторы по порядку.

Однако если некоторые данные были записаны на хост «B» напрямую, то, конечно, B и C будут иметь данные, отличные от «A», в зависимости от того, что было записано.

Перед внесением изменений убедитесь, что вы создали резервные копии своих серверов. Запустите 'SHOW SLAVE STATUS' на B & C и скопируйте / вставьте вывод куда-нибудь в качестве ссылки.

Чтобы сделать репликацию «C» из «A», вам нужно найти позицию в бинарных журналах из «A», которая соответствует тому месту, где «C» в данный момент смотрит на «B». Есть несколько способов сделать это, в том числе использовать инструмент mysqlbinlog, чтобы вручную найти запросы и начать с этой точки.

Более быстрый способ - позволить «C» на 100% догнать «B». Предполагая, что репликация уже остановлена ​​на «B». Используйте «SHOW SLAVE STATUS» на B, чтобы получить параметры для следующего запроса, который будет выполняться на «C».

 CHANGE MASTER TO MASTER_HOST = '[Master_Host]',  MASTER_LOG_FILE='[Master_Log_File]',  '[Exec_Master_Log_Pos]';

Возможно, вам потребуется добавить другие параметры:

 MASTER_USER='__USER__', MASTER_PASS='__PASS__', 

Это скажет хосту «C» продолжить репликацию, начиная с того места, где находится «B». Если вы параноик, как хороший dbadmin, вы должны использовать mysqlbinlog, чтобы проверить бинлоги на хосте A и подтвердить запросы / временные метки в новых позициях для C и сравнить запросы вокруг этой точки с данными на C чтобы подтвердить, что это точка для перезапуска репликации. Что-то вроде:

mysqlbinlog  --read-from-remote-server --host=HostA --user.. --password=.. --start-position=[Exec_Master_Log_Pos - 100] --stop-position=[Exec_Master_Log_Pos + 100] Master_Log_File

Хорошая новость о mysqlbinlog заключается в том, что он также позволяет вам читать копию binlog с другого сервера и преобразовывать ее в операторы SQL, которые вы можете воспроизвести локально. Это очень полезно в сценариях аварийного восстановления.

person Steve E.    schedule 11.10.2015
comment
Здравствуйте! Что делать, если I B вообще мертв (экземпляр с завершенным AWS), но C тоже пишет binlog. Итак, могу ли я воспроизвести бинлоги с главного (A) на подчиненном (C) с помощью mysqlbinlog после проверки журналов A и C? - person tamerlaha; 12.10.2015
comment
да. Вы можете CHANGE MASTER на C использовать двоичные журналы на A через MySQL, или вы можете использовать инструмент mysqlbinlog для чтения файлов двоичных журналов и импорта их в C. - person Steve E.; 12.10.2015
comment
Кажется, что порядок транзакций одинаков во всей цепочке репликации. Но было бы неплохо иметь некоторую документацию по этому поводу. У нас большие БД (~ 900 ГБ), и работать без официального подтверждения очень рискованно, сложно сравнивать две БД и проверять целостность данных. - person tamerlaha; 13.10.2015

В обычном сценарии, если вы показываете статус ведомого устройства, показывает указатель, на котором ваша репликация (A> B) была нарушена, вы должны исправить это, таким образом, ваш ведомый B будет в порядке, и теперь данные будут реплицированы на ведомое устройство C также успешно .

Если по какой-либо конкретной причине вы не хотите использовать Slave B, и вы уверены, что до того, как репликация Slave B сломалась, все данные из B были реплицированы на C, и вы знаете указатель, где репликация была нарушена, вы можете напрямую запускать бинлоги на ведомом C, и теперь вы можете сделать ведомое C ведомым для Master A вместо B.

Если проблема в другом, просьба уточнить.

person Zafar Malik    schedule 23.09.2015
comment
Привет, Зафар. Основной вопрос: могу ли я воспроизвести binlog с одного сервера на другой, который находится в цепочке репликации? - person tamerlaha; 24.09.2015
comment
Поскольку репликация вашего сервера B не работает, теперь ваши серверы не находятся в цепочке репликации ... да, вы можете воспроизвести binlog от A до C, как я уже упоминал в своем ответе. Если вы хотите продолжить репликацию, вам нужно либо исправить репликацию B так что C может реплицировать данные из B или вам нужно начать репликацию C непосредственно из A, но вы должны принять решение по данным сервера B. - person Zafar Malik; 26.09.2015
comment
Вы полностью уверены, что порядок выписок и транзакций одинаков во всех журналах бункеров / реле? Где я могу прочитать об этом? - person tamerlaha; 28.09.2015