集群 cron 与一台服务器仅允许重叠

集群 cron 与一台服务器仅允许重叠

我已经设置了负载均衡器:(lb1主动)和lb2(被动)、Glustered Web 服务器:(web1主动)、web2(备份)和一些集群数据库。Web 服务器和数据库都A指向负载均衡器的 VIP。

两个 Web 服务器都有各自的 cron 作业副本。假设执行以下任务:

* * * * * echo $(hostname) >> crontab.txt
0 0 1 * * ~/bin/another/task 2>&1

使用一些随机锁算法:

lock_dir=~/.cronlock
pid_file=~/.cronlock/pid

if ( mkdir ${lock_dir} ) 2> /dev/null; then
    echo $$ > $pid_file
    trap 'rm -rf "$lock_dir"; exit $?' INT TERM EXIT

    # Crons

    rm -rf "$lock_dir"
    trap - INT TERM EXIT
fi

是否安全

* * * * * ./lock_algorithm -f LOCK_FILE1 -c "echo $(hostname) >> crontab.txt"
0 0 1 * * ./lock_algorithm -f LOCK_FILE2 -c "~/bin/another/task 2>&1"

我应该在哪里发送“每个 cron 命令”唯一的锁定文件名和要执行的命令?

我所说的“安全”是指web1ORweb2将运行,而不是同时运行。

如果我需要 cron 重叠 (例如:我每分钟执行一个限于当前分钟的长任务)?web1假设它web1是活动的“cron 运行程序”,如何让 的 cron 再次执行?

答案1

不确定以下是否适合您,但这是我的一个想法:

  • 不确定你正在使用哪个集群堆栈/软件,但你可以引入起搏器和 corosyncweb1和上web2,并使用 ocf 资源代理来实现这一点。为了让您了解,这是什么:

    primitive p_postfix ocf:heartbeat:postfix \
      params config_dir="/etc/postfix" \
      op monitor interval="10"
    primitive p_symlink ocf:heartbeat:symlink \
      params target="/srv/postfix/cron" \
        link="/etc/cron.d/postfix" \
        backup_suffix=".disabled" \
      op monitor interval="10"
    primitive p_cron lsb:cron \
      op monitor interval=10
    order o_symlink_before_cron inf: p_symlink p_cron
    colocation c_cron_on_symlink inf: p_cron p_symlink
    colocation c_symlink_on_postfix inf: p_symlink p_postfix
    
  • 这将产生以下效果:

    • 检查名为 的文件是否postfix已存在/etc/cron.d
    • 如果是,请将其重命名为postfix.disabled(请记住,cron忽略文件名中带有点的作业定义)。
    • (重新)创建postfix作业定义作为 的符号链接/srv/postfix/cron
    • cron完成后重新启动。
  • 此示例在主动/被动集群中运行postfix。getCron仅在主动postfix节点上执行。

  • 您可以对其进行修改以删除postfix或包含您的网络服务器。


编辑:如果以上内容对您来说“太多”,那么这里还有另一个想法:您可以设置HAProxy统计数据,在脚本中获取此网站,对其进行解析,并根据主机名和发出的状态采取相应的行动HAProxy

答案2

看起来你正在尝试创建一个跨服务器工作的信号量。虽然有人尝试过建造它我认为它还不能投入生产。与其突破技术极限,不如将问题重构为适合现有技术的东西。

您的网站有数据库吗?您可以使用它来进行协调。

如果没有,那么使用像 kafka 或 0mq 这样的分布式排队系统怎么样?

相关内容