我已经设置了负载均衡器:(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 命令”唯一的锁定文件名和要执行的命令?
我所说的“安全”是指web1
ORweb2
将运行,而不是同时运行。
如果我需要 cron 重叠 (例如:我每分钟执行一个限于当前分钟的长任务)?web1
假设它web1
是活动的“cron 运行程序”,如何让 的 cron 再次执行?
答案1
不确定以下是否适合您,但这是我的一个想法:
不确定你正在使用哪个集群堆栈/软件,但你可以引入起搏器和 corosync在
web1
和上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 这样的分布式排队系统怎么样?