如何执行cron作业故障转移?

使用两个Debian服务器,我需要为cron作业build立强大的故障转移环境,一次只能在一台服务器上调用。

在/etc/cron.d中移动一个文件应该可以做到,但是有一个简单的HA解决scheme来执行这样的操作吗? 如果可能的话不要心跳;)

我认为心跳/心脏起搏器是最好的解决scheme,因为他们可以为你保证很多竞赛条件,击剑等,以确保一次只能在一个主机上运行。 可以自己devise一些东西,但是它可能不会考虑这些软件包所做的所有情况,最终最终会取代大部分(如果不是全部的话)轮子。

如果你真的不关心这样的事情,你想要一个更简单的设置。 我build议在几分钟之内让服务器上的cron作业蹒跚而行。 然后,当工作开始时,它可以以某种方式在作业所运行的任何共享资源上留下标记(您没有指定这个,所以我故意模糊)。 如果是数据库,则可以更新表中的字段,或者在共享文件系统上locking文件。

当作业在第二台服务器上运行时,它可以检查标记是否存在,如果存在,则放弃。

我们根据需要使用两种方法。 两者都涉及从所有机器出现并运行cron,但是涉及到一些理智的检查:

  1. 如果机器处于主要和次要关系(可能有多个次要关系),则修改脚本以检查它们正在运行的机器是否为主要状态。 如果没有,那么他们就悄然离开。 我目前没有HB设置,但我相信你可以向HB查询这些信息。

  2. 如果所有机器都符合初选要求(例如在集群中),则使用一些locking。 通过共享数据库或PID文件。 只有一台机器获得了locking状态,而没有一台机器静静地退出。

为了长话短说,你必须把你的cron脚本变成一些可以集群的应用程序。 作为轻量级或重量级的实现,他们仍然需要一件事情 – 在主节点故障切换之后能够正确恢复/重新启动操作(或恢复其状态)。 这个微不足道的例子就是它们是无状态的程序(或者“无状态的程序”),可以随时重新启动,并且可以做得很好。 这可能不是你的情况。 请注意,对于无状态程序,您不需要故障转移,因为您可以在所有节点上并行运行它们。

在通常情况下复杂的情况下,你的脚本应该放在集群的共享存储器上,应该把它们的状态存储在那里的文件中,应该只是primefaces地改变磁盘上存储的状态,并且应该能够在启动时检测到的瞬态状态下继续运行。

其实在这方面没有解决方法令人满意。 我们都试过了。 脚本解决scheme,cron心跳/心脏起搏器等等。 直到最近,唯一的解决scheme就是网格解决scheme。 自然,这不是我们想要的,因为网格解决scheme对于场景来说有点过分了。

这就是为什么我开始CronBalancer项目。 其工作方式与普通的cron服务器完全相同,除了分布式,负载均衡和HA(完成时)之外。 目前,前2个点已经完成(testing版),并使用标准的crontab文件。

医pipe局架构已到位。 剩下的只是确定故障切换和恢复操作所需的信号。

http://sourceforge.net/projects/cronbalancer/

夹头

我一直在使用Nagios 事件处理程序作为一个简单的解决scheme。

在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服务器上:

services.cfg

 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 } 

commands.cfg

 define command{ command_name autostart_crond command_line $USER1$/eventhandlers/autostart_crond.sh $SERVICESTATE$ $SERVICESTATETYPE$ $SERVICEATTEMPT$ $ARG1$ } 

autostart_crond.sh

 #!/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,因为这是确保资源一次只能在一个节点上运行的最佳解决scheme。

以下是我所做的步骤:

validationcrond 初始化脚本是否符合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 

那么可以通过以下方式将其添加到起搏器中:

 # crm configure primitive Crond lsb:crond \ op monitor interval="60s" 

crmconfigurationshow

 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来testing故障转移:

 [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 

让它在特定的机器上执行/不执行是微不足道的。 或者像脚本那样在/etc/cron.d中放置一个cron作业,或者在/etc/cron.d中将脚本永久化,但脚本本身会执行故障转移检查并决定是否执行。

这两者中常见(缺失)部分是脚本如何检查另一台机器上的脚本是否正在运行。

没有更多关于你想要做什么的信息,这是很难回答的。

我更喜欢Rcron这个特殊的问题。 你有一个状态文件,它只是说“主动”或“被动”,如果它是活动的,你的cron将在特定的机器上运行。 如果状态文件被设置为被动,它将不会运行。 就那么简单。

现在,您可以使用RedHat Cluster Suite或任何其他集群中间件来pipe理群集中的状态文件,也可以在某个节点上手动设置活动状态,就是这样。