Используя два сервера Debian, мне нужно настроить сильную среду аварийного переключения для заданий cron, которую можно вызывать только на одном сервере за раз.
Перемещение файла в /etc/cron.d должно помочь, но есть ли простое решение HA для выполнения такого действия? И по возможности не с сердцебиением;)
Ответы:
Я думаю, что сердцебиение / кардиостимулятор будет лучшим решением, поскольку они могут позаботиться о многих условиях гонки, фехтовании и т. Д., Чтобы гарантировать, что работа выполняется только на одном хосте за раз. Можно спроектировать что-то самостоятельно, но, вероятно, он не будет учитывать все сценарии, которые делают эти пакеты, и в конечном итоге вы замените большую часть, если не все, колеса.
Если вы действительно не заботитесь о таких вещах и хотите более простую настройку. Я предлагаю оштрафовать задания cron на серверах на несколько минут. Затем, когда задание запускается на первичном сервере, оно может каким-то образом оставить маркер на любом общем ресурсе, с которым работают задания (вы не указываете это, поэтому я намеренно размыта). Если это база данных, они могут обновить поле в таблице или заблокировать файл в общей файловой системе.
Когда задание выполняется на втором сервере, оно может проверить наличие маркера и прервать его, если оно есть.
источник
Мы используем два подхода в зависимости от требований. В обоих случаях присутствуют и работают cron со всех машин, но с небольшой проверкой работоспособности:
Если машины находятся в первичной и вторичной (может быть более одной вторичной) взаимосвязи, тогда сценарии модифицируются, чтобы проверить, является ли машина, на которой они работают, основным состоянием. Если нет, то они просто тихо выходят. На данный момент у меня нет настроек HB, но я считаю, что вы можете запросить HB для получения этой информации.
Если все машины являются приемлемыми основными цветами (например, в кластере), то используется некоторая блокировка. С помощью общей базы данных или файла PID. Только одна машина когда-либо получает статус блокировки и те, которые не выходят тихо.
источник
Короче говоря, вы должны превратить свои cron-скрипты в некие кластерные приложения. Будучи реализацией настолько легковесной или настолько тяжелой, насколько вам нужно, им все равно нужно одно - иметь возможность правильно возобновить / перезапустить действие (или восстановить свое состояние) после отработки отказа основного узла. Тривиальный случай состоит в том, что они являются программами без состояния (или «программами без состояния»), которые могут быть просто перезапущены в любое время и будут работать нормально. Это, вероятно, не ваш случай. Обратите внимание, что для программ без сохранения состояния вам не нужно переключаться при сбое, потому что вы можете просто запустить их параллельно на всех узлах.
В обычно сложном случае ваши сценарии должны находиться в общем хранилище кластера, должны хранить свое состояние в файлах, изменять состояние хранилища на диске только атомарно и должны иметь возможность продолжать свое действие из любого переходного состояния, которое они обнаружат при запуске.
источник
На самом деле нет решения, которое является удовлетворительным в этой области. Мы перепробовали их все. скриптовые решения, cron с биением / кардиостимулятором и многое другое. До недавнего времени единственным решением было сеточное решение. естественно, это не то, что мы хотим видеть, потому что сеточное решение немного больше, чем избыточное для сценария.
Вот почему я начал проект CronBalancer. работает точно так же, как обычный сервер cron, за исключением того, что он распределен, сбалансирован по нагрузке и HA (когда закончено). В настоящее время первые 2 пункта завершены (бета) и работают со стандартным файлом crontab.
структура HA на месте. все, что осталось, это сигнализация, необходимая для определения действий при сбое и восстановлении.
http://sourceforge.net/projects/cronbalancer/
зажимной патрон
источник
Я использовал обработчик событий Nagios как простое решение.
На сервере NRPE:
Не забудьте добавить
nagios
пользователя в группу sudoers:и отключить
requiretty
:На сервере Nagios:
services.cfg
commands.cfg
autostart_crond.sh
но я перешел на использование Pacemaker и Corosync, так как это лучшее решение для обеспечения того, чтобы ресурс работал только на одном узле за раз.
Вот шаги, которые я сделал:
Убедитесь, что сценарий инициализации crond соответствует LSB . На моем CentOS я должен изменить состояние выхода с 1 на 0 (если запустить или остановить остановку), чтобы соответствовать требованиям:
затем его можно добавить в кардиостимулятор с помощью:
crm configure show
статус crm
Тестирование отработки отказа путем остановки Pacemaker и Corosync на 3.145:
затем проверьте статус кластера на 2.93:
источник
Заставить его выполнять / не выполнять на конкретной машине тривиально. Либо пусть сценарий поместит задание cron в /etc/cron.d, как вы предлагаете, либо он будет постоянно находиться в /etc/cron.d, но сам скрипт выполнит проверку отработки отказа и решит, выполнять ли.
Общей (отсутствующей) частью в обоих из них является то, как скрипт проверяет, запущен ли скрипт на другом компьютере.
Без дополнительной информации о том, что вы пытаетесь сделать, на это трудно ответить.
источник
Я предпочитаю Rcron для этой конкретной проблемы. У вас есть файл состояния, который просто говорит «активный» или «пассивный», и если он активен, ваш cron будет работать на определенной машине. Если файл состояния установлен в пассивное состояние, он не будет работать. Просто как тот.
Теперь вы можете использовать RedHat Cluster Suite или любое другое промежуточное ПО для кластеризации для управления файлами состояния в вашем кластере, или вы можете вручную активировать определенный узел и все.
источник