Я использую MySQL-5.1.50 с настройкой репликации Master-Slave.
Большую часть времени раб отстает от хозяина.
Когда я бегу show processlist;
, нет запроса, который занимает много времени. Я включил slow_log
также. Тем не менее, он не находит медленный запрос.
Ведомый постоянно дает предупреждения, что репликация на несколько секунд отстает от ведущего. Иногда время задержки увеличивается.
Как мне диагностировать причину проблемы?
Мне нужна срочная помощь, так как эта проблема сохраняется в течение последних 20 дней.
mysql
replication
Адела Сахар
источник
источник
Ответы:
Seconds_Behind_Master действительно похож на просмотр прошлого через путешествие во времени.
Думайте об этом так:
Аналогичным образом, кажется, что Мастер обрабатывает много запросов одновременно.
Вы оглядываетесь на Раба, бежите,
SHOW SLAVE STATUS\G
и он говорит 200 дляSeconds_Behind_Master
. Как рассчитывается это число? Время часов ведомого (UNIX_TIMESTAMP (NOW ()) - TIMESTAMP запроса, когда он был выполнен и записан в двоичном журнале мастера.Есть еще один показатель, на который стоит обратить внимание
Seconds_Behind_Master
. Эта метрика называетсяRelay_Log_Space
. Это представляет сумму всех байтов для всех файлов реле на ведомом устройстве. По умолчанию самый большой одиночный релейный журнал ограничен 1 ГБ. ЕслиRelay_Log_Space
это менее 1 ГБ, это означает, что многие длительные запросы выполняются на Master параллельно. К сожалению, из-за однопоточного SQL-потока репликации запросы выполняются один за другим.Например, предположим, что у вас есть следующий сценарий на Master:
Когда ведомый читает эти запросы из своего журнала ретрансляции и обрабатывает их один за другим
Seconds_Behind_Master
Что касается Slow Log, по умолчанию long_query_time составляет 10 секунд. Если все ваши запросы в журналах ретрансляции меньше 10 секунд, вы никогда ничего не поймаете в журнале медленных запросов.
У меня есть следующие рекомендации для главного и подчиненного серверов
Apr 26, 2012
: Соответствует ли производительность процессора серверу баз данных?Sep 20, 2011
: Многоядерность и производительность MySQLSep 12, 2011
: Можно ли заставить MySQL использовать более одного ядра?May 26, 2011
: О производительности однопоточных и многопоточных баз данныхSeconds_Behind_Master
.ДАЛЬНЕЙШЕЕ УСТРАНЕНИЕ НЕИСПРАВНОСТЕЙ
Если вы хотите увидеть запросы, вызывающие задержку воспроизведения, сделайте следующее:
SHOW SLAVE STATUS\G
Relay_Log_File
STOP SLAVE;
START SLAVE;
cd /var/lib/mysql
или везде , где записываются логи ретрансляцииНапример, давайте сделаем
SHOW SLAVE STATUS\G
Если я запускаю
STOP SLAVE; START SLAVE;
, журнал реле закрывается и открывается новый. Тем не менее, вы хотитеrelay-bin.000030
.Сбросьте содержимое следующим образом:
Теперь вы можете видеть запросы, которые Slave пытается обработать. Вы можете использовать эти запросы в качестве отправной точки для настройки.
источник
Какой двоичный формат журнала вы используете? Вы используете 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 миллион записей в таблице без PK или уникального ключа, то только одна полная проверка таблицы будет выполняться на стороне главного устройства, что не имеет места на ведомом устройстве.
Когда используется ROW binlog_format, MySQL записывает изменения строк в двоичные журналы (а не как оператор, такой как STATEMENT binlog_format), и это изменение будет применяться к боковой строке ведомого устройства, что означает, что будет выполнено полное сканирование таблицы на 1 миллион на подчиненном устройстве, чтобы отразить только один оператор удаления на ведущем устройстве, и это вызывает проблему отставания подчиненного устройства.
источник
Значение seconds_behind_master в SHOW SLAVE STATUS представляет собой разницу между системным временем на ведущем устройстве, которое было сохранено, когда событие было первоначально выполнено и записано в двоичном журнале ..., и системным временем на ведомом устройстве, когда событие выполняется там.
Секунды позади мастера будут давать неправильные значения, если часы двух систем не синхронизированы.
источник