使用两台 Debian 服务器,我需要为 cron 作业设置一个强大的故障转移环境,该作业一次只能在一台服务器上调用。
移动 /etc/cron.d 中的文件应该可以解决问题,但是有没有简单的 HA 解决方案来执行此类操作?如果可能的话,不要使用心跳 ;)
答案1
我认为 heartbeat / pacemaker 是最好的解决方案,因为它们可以为您处理大量竞争条件、隔离等问题,以确保作业一次仅在一台主机上运行。您可以自己设计一些东西,但它可能无法考虑到这些软件包所做的所有场景,最终您将不得不更换大部分(如果不是全部的话)轮子。
如果您真的不在乎这些事情,并且想要更简单的设置。我建议将服务器上的 cron 作业错开几分钟。然后,当作业在主服务器上启动时,它可以以某种方式在作业操作的任何共享资源上留下标记(您没有指定这一点,所以我故意含糊其辞)。如果是数据库,他们可以更新表中的字段,或者如果它在共享文件系统上,则可以锁定文件。
当作业在第二台服务器上运行时,它可以检查标记是否存在,如果存在则中止。
答案2
我们根据需求使用两种方法。这两种方法都要求 cron 在所有机器上存在并运行,但需要进行一些健全性检查:
如果机器处于主从(可能有多个从属)关系,则修改脚本以检查它们运行的机器是否处于主状态。如果不是,则它们会安静地退出。我目前手头没有 HB 设置,但我相信您可以向 HB 查询此信息。
如果所有机器都是符合条件的主机器(例如在集群中),则使用某种锁定。通过共享数据库或 PID 文件。只有一台机器获得锁定状态,而没有获得锁定状态的机器则会悄悄退出。
答案3
长话短说,您必须将 cron 脚本转换为某种可集群的应用程序。无论您需要轻量级还是重量级的实现,它们仍然需要一件事 - 能够在主节点故障转移后正确恢复/重新启动操作(或恢复其状态)。简单的例子是它们是无状态程序(或“足够无状态”的程序),可以随时简单地重新启动并且运行良好。这可能不是您的情况。请注意,对于无状态程序,您不需要故障转移,因为您可以在所有节点上并行运行它们。
在通常复杂的情况下,您的脚本应该位于集群的共享存储中,应该将其状态存储在那里的文件中,应该仅以原子方式更改存储在磁盘上的状态,并且应该能够从启动时检测到的任何瞬时状态继续其操作。
答案4
我一直在使用 Nagios事件处理程序作为一个简单的解决方案。
在NRPE服务器上:
command[check_crond]=/usr/lib64/nagios/plugins/check_procs -c 1: -C crond
command[autostart_crond]=sudo /etc/init.d/crond start
command[stop_crond]=sudo /etc/init.d/crond stop
不要忘记将nagios
用户添加到 sudoers 组:
nagios ALL=(ALL) NOPASSWD:/usr/lib64/nagios/plugins/, /etc/init.d/crond
并禁用requiretty
:
Defaults:nagios !requiretty
在 Nagios 服务器上:
服务配置文件
define service{
use generic-service
host_name cpc_3.145
service_description crond
check_command check_nrpe!check_crond
event_handler autostart_crond!cpc_2.93
process_perf_data 0
contact_groups admin,admin-sms
}
命令配置文件
define command{
command_name autostart_crond
command_line $USER1$/eventhandlers/autostart_crond.sh $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $ARG1$
}
自动启动_crond
#!/bin/bash
case "$1" in
OK)
/usr/local/nagios/libexec/check_nrpe -H $4 -c stop_crond
;;
WARNING)
;;
UNKNOWN)
/usr/local/nagios/libexec/check_nrpe -H $4 -c autostart_crond
;;
CRITICAL)
/usr/local/nagios/libexec/check_nrpe -H $4 -c autostart_crond
;;
esac
exit 0
但我已经改用Pacemaker 和 Corosync因为这是确保资源一次只在一个节点上运行的最佳解决方案。
以下是我所做的步骤:
验证 crond初始化脚本符合 LSB 标准在我的 CentOS 上,我必须将退出状态从 1 更改为 0(如果启动正在运行或停止已停止)以满足要求:
start() {
echo -n $"Starting $prog: "
if [ -e /var/lock/subsys/crond ]; then
if [ -e /var/run/crond.pid ] && [ -e /proc/`cat /var/run/crond.pid` ]; then
echo -n $"cannot start crond: crond is already running.";
failure $"cannot start crond: crond already running.";
echo
#return 1
return 0
fi
fi
stop() {
echo -n $"Stopping $prog: "
if [ ! -e /var/lock/subsys/crond ]; then
echo -n $"cannot stop crond: crond is not running."
failure $"cannot stop crond: crond is not running."
echo
#return 1;
return 0;
fi
然后可以使用以下命令将其添加到 Pacemaker:
# crm configure primitive Crond lsb:crond \
op monitor interval="60s"
crm 配置显示
node SVR022-293.localdomain
node SVR233NTC-3145.localdomain
primitive Crond lsb:crond \
op monitor interval="60s"
property $id="cib-bootstrap-options" \
dc-version="1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f" \
cluster-infrastructure="openais" \
expected-quorum-votes="2" \
stonith-enabled="false" \
no-quorum-policy="ignore"
rsc_defaults $id="rsc-options" \
resource-stickiness="100"
CRM状态
============
Last updated: Fri Jun 7 13:44:03 2013
Stack: openais
Current DC: SVR233NTC-3145.localdomain - partition with quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ SVR022-293.localdomain SVR233NTC-3145.localdomain ]
Crond (lsb:crond): Started SVR233NTC-3145.localdomain
通过停止 3.145 上的 Pacemaker 和 Corosync 来测试故障转移:
[root@3145 corosync]# service pacemaker stop
Signaling Pacemaker Cluster Manager to terminate: [ OK ]
Waiting for cluster services to unload:...... [ OK ]
[root@3145 corosync]# service corosync stop
Signaling Corosync Cluster Engine (corosync) to terminate: [ OK ]
Waiting for corosync services to unload:. [ OK ]
然后在2.93上检查集群状态:
============
Last updated: Fri Jun 7 13:47:31 2013
Stack: openais
Current DC: SVR022-293.localdomain - partition WITHOUT quorum
Version: 1.1.5-1.1.el5-01e86afaaa6d4a8c4836f68df80ababd6ca3902f
2 Nodes configured, 2 expected votes
1 Resources configured.
============
Online: [ SVR022-293.localdomain ]
OFFLINE: [ SVR233NTC-3145.localdomain ]
Crond (lsb:crond): Started SVR022-293.localdomain