Если вы использовали репликацию MySQL, вы, вероятно, обнаружили, что подчиненные машины могут отставать от мастера. Репликация также может полностью прерваться, что потребует часов (или дней), чтобы подчиненные часы наверстали упущенное. Мониторинг необходим для выявления проблем до того, как рабы станут слишком далеко позади.
Джереми Заводни предложил механизм сердцебиения, чтобы контролировать задержку между хозяином и рабом. (Я не уверен, что он придумал это решение). Он предлагает периодически вставлять строку в таблицу сердцебиения на главном компьютере. Затем вы опрашиваете таблицу на ведомом устройстве, ожидая появления строки. Период времени, в течение которого вы проводите опрос, является приблизительной оценкой того, насколько далеко позади ведомого находится в данный момент.
Есть несколько проблем с этим решением. Вы должны написать код для опроса раба. Если вы будете опрашивать очень часто (каждую секунду), вы будете опрашивать слишком часто, если репликация на самом деле отстает. Когда вы прекращаете опрос? Если вы будете опрашивать реже (каждую минуту), ваша оценка станет намного менее точной. Вы также должны опросить каждого раба, если их более одного.
Новое решение
Вы можете заставить MySQL выполнять тяжелую работу, используя разницу в поведении между SYSDATE и CURRENT _TIMESTAMP . Почти во всех случаях, когда ведомое устройство выполняет оператор SQL, он временно устанавливает «текущее время» во время выполнения оператора на главном устройстве. Если вы вставите СЕЙЧАС в 12:00:04 на главном устройстве, строка будет точно соответствовать 12:00:04 на ведомом устройстве, независимо от того, когда он будет запущен. Однако функция SYSDATE не следует этому поведению. Он всегда использует значение системных часов ведомого.
Если вы вставите строку с одним столбцом, содержащим значение NOW или CURRENT _TIMESTAMP, а другой, содержащий значение SYSDATE, в ведущее устройство, вы можете использовать разницу между двумя значениями на ведомом устройстве, чтобы увидеть, насколько далеко оно позади. Если ведомое устройство синхронизировано, два значения будут идентичны. Если ведомое устройство находится на одну секунду позади столбца, содержащего SYSDATE, будет на одну секунду впереди столбца, содержащего СЕЙЧАС . Для определения текущей задержки опрос не требуется.
Реализация
Сначала создайте таблицу пульса на мастере. master_time будет содержать время вставки строки в мастер. slave_time будет содержать время, которое было вставлено на slave.
create table heartbeat( master_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, slave_time TIMESTAMP NOT NULL ) ENGINE=MyISAM;
Периодически (я делаю это каждую минуту), вставьте строку в таблицу сердцебиения на мастер.
insert into heartbeat(slave_time) values(SYSDATE());
Чтобы увидеть текущую задержку репликации, в любой момент рассчитайте разницу между текущим временем и временем, когда самая последняя строка была вставлена в мастер. (Эта оценка может быть отключена до одного периода сердцебиения). Этот запрос выполняется на ведомом устройстве.
select timediff(NOW(), max(master_time)) from heartbeat;
Вы можете увидеть, как задержка репликации менялась со временем, выбрав все строки в диапазоне. Этот пример показывает задержку для каждой минуты текущего дня. Задержки с точностью до 1 секунды (максимальное разрешение MySQL).
select master_time, timediff(slave_time, master_time) from heartbeat where DATE(master_time) = DATE(NOW()) order by master_time;