Назад | Перейти на главную страницу

Задания Cron с высокой доступностью

Информация

В настоящее время мы находимся в процессе создания кластер высокой доступности для NGINX (на Centos 7) под управлением PHP. Большая часть конфигурации отображена и должен хорошо работать в кластерной среде.

К сожалению, единственное, что мы не можем понять, чтобы хорошо играть с кластеризацией, - это cron вакансии (задания cron будут выполнять код PHP). Насколько мне известно, задания cron выполняются на каждом хосте индивидуально. Это означает, что мы либо:

  1. Нет полной среды высокой доступности где в случае сбоя одного сервера его берет на себя другой сервер, и все по-прежнему работает так же, как и раньше (хотя и медленнее).
  2. Мы запускаем каждое задание cron и сохраняем результат в базе данных, чтобы определить, было ли оно уже выполнено. Это не жизнеспособное решение, поскольку выполнение некоторых из наших заданий cron может занять несколько часов - и это необходимо выполнить до следующего рабочего дня.
  3. Мы находим какое-то решение, которое позволяет выполнять задания cron с высокой доступностью.

Исследовательская работа

Видя, как решение 3 поможет нам поддерживать среду высокой доступности, то есть предпочтительный метод. К сожалению, мы не очень хорошо знакомы с некоторыми из этих решений, поэтому мне нужны ваши знания, которые помогут нам найти подходящее решение для наших нужд. Мы не очень хорошо знакомы с машинами Linux (вся среда - это Windows, за исключением серверов NGINX) и мало знаем о работе с этими машинами (хотя до сих пор мы могли это понять).

Параметры

  1. Дкрон
    • Это решение предлагает простую настройку и выглядит достойным продуктом.
  2. Хронос
    • Это использует несколько других утилит для работы, включая фактическую базу данных (не идеально, но может работать)
  3. Rundeck
    • Кажется, предлагает много функций и потенциально лучший продукт в этом списке
  4. Rcron
    • Я мало что знаю об этом, за исключением того, что он основан на Голанге.
  5. Пользовательский сценарий: Как сделать cronjobs доступными?
    • Это подход «если ничего не помогает», если ничего не работает ...
  6. Другие варианты??? - Пожалуйста, укажите другие варианты, если вы их найдете, и я включу их сюда

Вопросы

  1. Каковы ваши экспертные мнения или рекомендации по различным вариантам?
  2. Каков ваш опыт использования различных вариантов (за / против)?
  3. Какие варианты, по вашему мнению, мы можем использовать с нашей инфраструктурой? (если потребуется дополнительная информация о нашей инфраструктуре, дайте мне знать)

Ноты

Любая помощь по этому поводу приветствуется.

Я понимаю, что этот вопрос был задан перед, хотя он кажется довольно устаревшим (2011 г.), и с тех пор было создано много новых решений.

crond в RHEL / CentOS 7 включена поддержка кластеризации. Это на самом деле cronie, вилка маститого vixie-cron. Вот подробности со страницы руководства:

ПОДДЕРЖКА КЛАСТЕРИНГА

В этой версии Cron можно использовать смонтированный в сети общий / var / spool / cron в кластере хостов и указать, что только один из хостов должен запускать задания crontab в этом каталоге одновременно. Для этого нужно запустить Cron с параметром -c, а файл /var/spool/cron/.cron.hostname должен содержать только одну строку, которая представляет имя хоста того хоста в кластере, на котором должны выполняться задания. Если этот файл не существует или имя хоста в нем не совпадает с именем, возвращаемым gethostname (2), то все файлы crontab в этом каталоге игнорируются. Это не влияет на задания cron, указанные в файле / etc / crontab или на файлы в каталоге /etc/cron.d. Эти файлы всегда запускаются и считаются специфичными для хоста.

Вместо того, чтобы редактировать /var/spool/cron/.cron.hostname напрямую, используйте параметр -n в crontab (1) для указания хоста.

Вы должны убедиться, что все хосты в кластере и файловый сервер, с которого они монтируют общий каталог crontab, имеют точно синхронизированные часы, например, с помощью ntpd (8), иначе результаты будут очень непредсказуемыми.

На практике этот подход требует:

  • Общая файловая система, смонтированная в / var / spool / cron для всех кластерных систем;
  • Все кластерные системы для начала crond с -c флаг (поставить CRONDARGS=-c в / etc / sysconfig / crond); и
  • Какой-то триггер, чтобы в случае отказа системы, ответственной за задания cron, другая система выполняла crontab -n взять на себя.

Имейте в виду предупреждение: это решение кластеризует задания cron только в / var / spool / cron (т.е. установлено с помощью crontab -e). Каждый узел по-прежнему будет выполнять свои индивидуальные задания в / etc / crontab или /etc/cron.d.

Почему не ваш вариант (2), но он создает флаг во время выполнения. Задания cron будут запускаться на всех машинах с небольшими локальными вариациями времени, что означает, что один из них сначала создает флаг; другие затем видят, что флаг установлен, и выходят из строя, в то время как первый работает до завершения.

Вам нужно будет обратить внимание на атомарность установки / проверки флага (NFS также является вариантом здесь, с файлом блокировки), хотя, чтобы свести это к минимуму, также может быть некоторое значение в любом

  • помещать небольшой случайный сон в начале каждого задания cron, чтобы немного их растянуть, или
  • варьировать время запуска любого заданного задания между серверами не менее чем на 1 минуту, т.е. сервер 1 запускает задание в 7:02, сервер 2 в 7:03; обычно сервер 1 выполняет всю работу, но если он не работает, сервер 2 не увидит флага при запуске в 7:03.

я использую Дженкинс управлять около 140 запланированными сценариями.

Jenkins не предназначался для сервера в качестве замены cron, он предназначен для непрерывной интеграции, но с ним можно управлять почти всем.

Вот некоторые люди, которые добились успеха (как и я), перенося задания из cron в Jenkins.

Вот хорошее сравнение между Jenkins и cron