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

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

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

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

答案1

我认为 heartbeat / pacemaker 是最好的解决方案,因为它们可以为您处理大量竞争条件、隔离等问题,以确保作业一次仅在一台主机上运行。您可以自己设计一些东西,但它可能无法考虑到这些软件包所做的所有场景,最终您将不得不更换大部分(如果不是全部的话)轮子。

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

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

答案2

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

  1. 如果机器处于主从(可能有多个从属)关系,则修改脚本以检查它们运行的​​机器是否处于主状态。如果不是,则它们会安静地退出。我目前手头没有 HB 设置,但我相信您可以向 HB 查询此信息。

  2. 如果所有机器都是符合条件的主机器(例如在集群中),则使用某种锁定。通过共享数据库或 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

相关内容