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

Кластерный cron с одним сервером допускается только перекрытие

Я настроил балансировщики нагрузки: lb1 (активный) и lb2 (пассивный), Glustered веб-серверы: web1 (активный), web2 (резервное копирование) и некоторая кластерная база данных. И веб-серверы, и базы данных A указал на VIP балансировщиков нагрузки.

На обоих веб-серверах есть копии заданий cron. Предполагая следующие задачи:

* * * * * echo $(hostname) >> crontab.txt
0 0 1 * * ~/bin/another/task 2>&1

С некоторым алгоритмом случайной блокировки:

lock_dir=~/.cronlock
pid_file=~/.cronlock/pid

if ( mkdir ${lock_dir} ) 2> /dev/null; then
    echo $$ > $pid_file
    trap 'rm -rf "$lock_dir"; exit $?' INT TERM EXIT

    # Crons

    rm -rf "$lock_dir"
    trap - INT TERM EXIT
fi

Безопасно иметь что-то вроде

* * * * * ./lock_algorithm -f LOCK_FILE1 -c "echo $(hostname) >> crontab.txt"
0 0 1 * * ./lock_algorithm -f LOCK_FILE2 -c "~/bin/another/task 2>&1"

Куда я отправляю уникальное имя файла блокировки «per-cron-command» и команду для выполнения?

Под "безопасным" я подразумеваю web1 ИЛИ web2 будет работать, а не оба.

А если мне нужно перекрытие cron (например: каждую минуту я выполняю длинную задачу, ограниченную текущей минутой)? Как получить web1cron снова выполняется при условии, что web1 это активный "cron runner"?

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

Есть ли на вашем сайте база данных? Вы можете использовать это для координации.

Если нет, как насчет использования распределенной системы массового обслуживания, такой как kafka или 0mq?

Не уверен, что это возможно для вас, но вот моя идея:

  • Не уверен, какой кластерный стек / программное обеспечение вы используете, но вы можете ввести кардиостимулятор и коросинхронизация на web1 и web2, и используйте для этого агенты ресурсов ocf. Чтобы вы понимали, о чем идет речь:

    primitive p_postfix ocf:heartbeat:postfix \
      params config_dir="/etc/postfix" \
      op monitor interval="10"
    primitive p_symlink ocf:heartbeat:symlink \
      params target="/srv/postfix/cron" \
        link="/etc/cron.d/postfix" \
        backup_suffix=".disabled" \
      op monitor interval="10"
    primitive p_cron lsb:cron \
      op monitor interval=10
    order o_symlink_before_cron inf: p_symlink p_cron
    colocation c_cron_on_symlink inf: p_cron p_symlink
    colocation c_symlink_on_postfix inf: p_symlink p_postfix
    
  • Это сделает следующее:

    • Проверьте, имеет ли файл с именем postfix уже существует в /etc/cron.d.
    • Если это так, переименуйте его в postfix.disabled (Помните, cron игнорирует определения заданий с точками в имени файла).
    • (Повторно) Создайте postfix определение вакансии как символическая ссылка на /srv/postfix/cron.
    • Начать сначала cron когда это будет сделано.
  • В этом примере не работает активный / пассивный кластер. postfix. Cron get выполняется только на активном postfix узел.

  • Вы можете изменить это, чтобы удалить postfix и вместо этого включите свой веб-сервер.


Редактировать: Если вышеперечисленное «слишком много» для вас, вот еще одна идея: вы можете настроить HAProxy stats, добавьте этот сайт в свой скрипт, проанализируйте его и действуйте соответственно в зависимости от имени хоста и статуса, отправленного HAProxy.