Я настроил балансировщики нагрузки: 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 (например: каждую минуту я выполняю длинную задачу, ограниченную текущей минутой)? Как получить web1
cron снова выполняется при условии, что 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
.