Многосерверный механизм резервирования задач MySQL - PullRequest
0 голосов
/ 20 октября 2010

У меня есть два веб-сервера. Сервер «А» и сервер «Б». Оба являются точными копиями другого и подключены к балансировщику нагрузки для обслуживания клиентов.

У меня есть задачи (cronjob), которые выполняются каждый час, каждый день. Эта задача в настоящее время выполняется только на сервере «А». Проблема в том, что эти задачи действительно важны, и если по какой-либо причине происходит сбой сервера «А», задача больше не будет выполняться.

Я бы хотел, чтобы сервер 'B' выполнил задачу, но только если сервер 'A' этого не сделал. Обе задачи являются PHP-скриптами, взаимодействующими с базой данных MySQL.

Я думаю об использовании некоторых строк в таблице (используя блокировки MySQL?) В качестве флага для сервера «B», чтобы запустить свою задачу, если сервер «A» не сделал этого, и наоборот.

Обратите внимание, что файл задачи на обоих серверах должен быть абсолютно одинаковым.

Спасибо.

1 Ответ

2 голосов
/ 20 октября 2010

Предлагаемое вами решение - то, которое я часто использую для более простых задач, обычно с чем-то вроде:

  • cronjob запускается на обоих серверах
  • оба получают разные токены (обычно основанные на идентификаторе сервера и идентификаторе процесса)
  • оба пытаются претендовать на работу в таблице с UPDATE jobs SET process = '$token' WHERE process IS NULL (+ некоторые другие пункты не в данный момент).
  • обе проверки на выигранные / заявленные процессы: SELECT * FROM jobs WHERE process = '$token'
  • только «победитель» выполняет работу, проигравший / безработный просто завершается.

Следует иметь в виду, что это работает только для заданий, пока работает экземпляр MySQL: без него невозможно выполнить обработку. Опять же, cronjob, который проверяет, жив ли сервер MySQL, может быть выполнен на обоих серверах, я не возражаю, чтобы получить 2 предупреждения для такой крупной катастрофы

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