Репликация MySql - раб отстает от мастера

У меня есть репликация master/slave на моем MySql DB.

моя подчиненная БД была отключена в течение нескольких часов и снова восстанавливается (мастер постоянно поднимался), при выпуске show slave status я могу видеть, что ведомое устройство находится за X секунд за мастером.

проблема в том, что раб, похоже, не догоняет хозяина, X секунд за мастером, похоже, не падает...

любые идеи о том, как я могу помочь рабу догнать?

Ответ 1

Вот идея

Чтобы вы знали, что MySQL полностью обрабатывает SQL из журналов реле. Попробуйте следующее:

STOP SLAVE IO_THREAD;

Это остановит репликацию при загрузке новых записей из мастера в свои журналы ретрансляции.

Другой поток, известный как поток SQL, будет продолжать обрабатывать операторы SQL, загруженные с мастера.

При запуске SHOW SLAVE STATUS\G следите за Exec_Master_Log_Pos. Запустите SHOW SLAVE STATUS\G снова. Если Exec_Master_Log_Pos не движется через минуту, вы можете продолжить START SLAVE IO_THREAD;. Это может уменьшить количество Seconds_Behind_Master.

Кроме этого, вы ничего не можете сделать, кроме как:

  • Репликация доверия
  • Монитор Seconds_Behind_Master
  • Монитор Exec_Master_Log_Pos
  • Запустите SHOW PROCESSLIST;, обратите внимание на поток SQL, чтобы увидеть, обрабатывает ли он длинные запросы.

BTW Имейте в виду, что при запуске SHOW PROCESSLIST; при запуске репликации должно быть два подключения к БД, чье имя пользователя system user. В одном из этих соединений DB будет выполняться текущая инструкция SQL, обрабатываемая репликацией. До тех пор, пока различная инструкция SQL будет видна при каждом запуске SHOW PROCESSLIST;, вы можете доверять, что mysql все еще правильно реплицируется.

Ответ 2

Какой формат бинарного журнала вы используете? Используете ли вы ROW или ЗАЯВЛЕНИЕ?

SHOW GLOBAL VARIABLES LIKE 'binlog_format';

Если вы используете ROW в качестве формата binlog, убедитесь, что все ваши таблицы имеют первичный или уникальный ключ:

SELECT t.table_schema,t.table_name,engine
FROM information_schema.tables t
INNER JOIN information_schema .columns c
on t.table_schema=c.table_schema
and t.table_name=c.table_name
and t.table_schema not in ('performance_schema','information_schema','mysql')
GROUP BY t.table_schema,t.table_name
HAVING sum(if(column_key in ('PRI','UNI'), 1,0)) =0;

Если вы выполните, например, один оператор удаления на хозяине удаляет 1 миллион записей в таблице без ПК или уникального ключа, тогда только одно полное сканирование таблицы будет происходить на главной стороне, что не относится к ведомому.

Когда используется ROW binlog_format, MySQL записывает изменения строк в двоичные журналы (а не как оператор, такой как STATEMENT binlog_format), и это изменение будет применено на стороне подчиненной строки за строкой, что означает 1 миллион полной проверки таблицы будет выполняться на подчиненном устройстве, чтобы отражать только одну инструкцию удаления на ведущем устройстве и которая вызывает проблему отставания ведомого устройства.

Ответ 3

"секунды позади" - не очень хороший инструмент, чтобы узнать, насколько позади хозяина вы на самом деле. То, что он говорит, "запрос, который я только что выполнил, был выполнен X секунд назад на главном". Это не означает, что вы наверстаете упущенное и сразу после мастера на следующей секунде.

Если ваше подчиненное устройство обычно не отстает, и рабочая нагрузка на ведущего устройства примерно постоянна, вы наверняка наверстаете упущенное, но это может занять некоторое время, возможно, даже "вечно", если ведомый обычно просто не отстает от мастер. Рабочие устройства работают на одном потоке, поэтому он по дизайну намного медленнее, чем мастер, а также, если есть несколько запросов, которые занимают некоторое время на главном устройстве, они будут блокировать репликацию во время работы на подчиненном устройстве.

Ответ 4

Просто проверьте, есть ли у вас одинаковые временные и временные интервалы на обоих серверах, т.е. Master, а также Slave.

Ответ 6

У нас была такая же проблема после настройки нашего ведомого из недавней резервной копии.

Мы изменили конфигурацию нашего ведомого, чтобы быть более аварийным:

sync_binlog = 1
sync_master_info = 1
relay_log_info_repository = TABLE
relay_log_recovery = 1

Я думаю, что особенно проблема sync_binlog = 1 вызывает проблему, так как спецификации этого подчиненного устройства не так быстря, как у мастера. Этот параметр конфигурации заставляет подчиненный хранить каждую транзакцию в двоичном файле до их выполнения (вместо стандартных транзакций по 10 тыс. По умолчанию).

После отключения этих опций конфигурации до их значений по умолчанию я вижу, что ведомое устройство снова догоняет.

Ответ 7

Просто добавьте результаты в мой похожий случай.

В мастерстве было всего несколько лишних временных вставки/обновления/удаления таблицы, которые занимали большую часть пространства из журнала реестров в ведомом. И в Mysql 5.5, поскольку он был однопоточным, процессор всегда был на 100% и занимал много времени для обработки этих записей.

Все, что я сделал, это добавить эту строку в файл mysql cnf

replicate-ignore-table=<dbname>.<temptablename1>
replicate-ignore-table=<dbname>.<temptablename2>

и все снова стало гладким.

Чтобы определить, какие таблицы занимают больше места в журнале ретрансляции, попробуйте выполнить следующую команду и затем откройте в текстовом редакторе. Вы можете получить некоторые подсказки

cd /var/lib/mysql
mysqlbinlog relay-bin.000010 > /root/RelayQueries.txt
less /root/RelayQueries.txt

Ответ 8

Если у вас есть несколько схем, рассмотрите возможность использования многопоточной ведомой репликации. Это относительно новая функция.

Это можно сделать динамически без остановки сервера. Просто остановите поток slave-сервера.

STOP SLAVE SQL_THREAD;
SET GLOBAL slave_parallel_threads = 4;
START SLAVE SQL_THREAD;