воскресенье, 26 июня 2011 г.

Ускорение репликации MySQL

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

Тут важно отметить, что слейв должен быть как минимум такой же мощности, что и мастер, как по количеству памяти, так и по конфигурации дисковой системы.
Если же вы столкнулись с ситуацией, когда отставание слейва от мастера постоянно увеличивается, нужно провести некоторый тюнинг слейва.
Прежде всего нужно обратить внимание на переменную innodb_flush_log_at_trx_commit.
Ее значение по умолчанию 1, при этом происходит запись на диск буфера лога innodb и сброс лога на диск (flush) при каждом коммите транзакции.
Если ее значение равно 0, то буфер лога innodb записывается на диск и сброс (flush) выполняются раз в секунду, при коммите не делается ничего.
Если переменная равна 2, то буфер записывается в лог при коммите, а сброс буфера выполняется 1 раз в секунду.
Путем изменения значения этой переменной можно многократно увеличить производительность транзакции ценой риска потери данных за последюю секунду. При значении 0 потеряются транзакции за последнюю секунду при аварийном завершении процесса mysql, если же переменная равна 2, то причиной потери данных может быть лишь сбой ОС и питания. В любом случае риска потери или повреждения самой базы данных нет.
Таким образом innodb_flush_log_at_trx_commit=0 является самым агрессивным режимом, я рекомедную устанавливать на слейве innodb_flush_log_at_trx_commit=2.

Комментариев нет:

Отправить комментарий