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


8

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

在/etc/cron.d中移动文件应该可以解决问题,但是是否有简单的HA解决方案来执行此类操作?如果可能的话,不要心跳;)


作为记录,我终于用心跳完成了这项工作。但是,有一个更简单的解决方案,如果您的计算机位于同一子网中并且可以进行多播,我建议您使用ucarp。比心跳简单得多-> ucarp.org
Falken

1
rcron?Gnubatch?木偶?
symcbean 2014年

我第二个rcron。我目前正在使用它,并且设置几乎相同(负载均衡器后面有2个ubuntu服务器)。
阿里

Answers:


5

我认为心跳/起搏器将是最好的解决方案,因为它们可以为您照顾很多比赛条件,击剑等,以确保这项工作一次只能在一个主机上运行。可以自己设计一些东西,但可能无法解决这些软件包所做的所有情况,最终您将不得不替换大部分(如果不是全部)轮子。

如果您真的不太在意这些事情,并且想要一个简单的设置。我建议将服务器上的cron作业错开几分钟。然后,当作业在主服务器上启动时,它可能会以某种方式在作业所使用的任何共享资源上留下标记(您未指定此名称,所以我故意含糊)。如果是数据库,他们可以更新表中的字段,或者如果它位于共享文件系统上,则锁定文件。

当作业在第二台服务器上运行时,它可以检查标记的存在并中止标记的存在。


1

我们根据需求使用两种方法。两者都涉及到在所有机器上都存在并运行cron,但是涉及一些健全性检查:

  1. 如果计算机处于主服务器和辅助服务器(可能有多个辅助服务器)的关系,则将修改脚本以检查其上运行的计算机是否处于主服务器状态。如果没有,那么他们只是安静地退出。我目前暂无HB设置,但我相信您可以向HB查询此信息。

  2. 如果所有计算机都是合格的主计算机(例如群集中的计算机),则将使用某些锁定。通过共享数据库或PID文件。只有一台机器获得了锁定状态,而那些没有悄悄退出。


1

长话短说,您必须将cron脚本转换为某种可群集的应用程序。作为实现所需的轻量级或重量级的实现,他们仍然需要一件事-能够在主节点故障转移之后正确地恢复/重新启动操作(或恢复其状态)。琐碎的情况是它们是无状态程序(或“足够无状态”的程序),可以随时随地重新启动就可以了。这可能不是您的情况。请注意,对于无状态程序,您不需要故障转移,因为您可以简单地在所有节点上并行运行它们。

在通常复杂的情况下,您的脚本应位于群集的共享存储中,应将其状态存储在文件中,应仅原子地更改存储在磁盘上的状态,并应能够从启动时检测到的任何瞬时状态继续执行操作。


1

实际上,在这方面没有令人满意的解决方案。我们已经尝试了所有。脚本解决方案,具有心跳/起搏器的cron等。直到最近,唯一的解决方案是网格解决方案。自然,这不是我们想要看到的,因为网格解决方案对于该场景而言远不过是多余的。

这就是为什么我启动了CronBalancer项目的原因。除了分布式,负载平衡和HA(完成后)外,它的工作原理与普通cron服务器完全相同。目前,前2分已经完成(测试版),并且可以与标准crontab文件一起使用。

HA框架已经到位。剩下的就是确定故障转移和恢复操作所需的信号。

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

卡盘


1

我一直在使用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服务器上:

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
}

命令

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,因为它是确保资源一次仅在一个节点上运行的最佳解决方案。

这是我已完成的步骤:

验证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

0

使它在特定机器上执行/不执行是微不足道的。根据您的建议,要么有一个脚本将cron作业放在/etc/cron.d中,要么将该脚本永久地放在/etc/cron.d中,但让脚本本身进行故障转移检查并决定是否执行。

这两者的共同点(缺失)是脚本如何检查另一台计算机上的脚本是否正在运行。

如果没有有关您要执行的操作的更多信息,这很难回答。


0

对于这个特殊的问题,我更喜欢Rcron。您有一个状态文件,该文件仅显示“ active”或“ passive”,如果处于活动状态,则cron将在特定计算机上运行。如果状态文件设置为被动,则它将不会运行。就那么简单。

现在,您可以使用RedHat Cluster Suite或任何其他集群中间件来管理整个集群的状态文件,或者您可以手动在某个节点上将其设置为活动状态。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.