我已经设置了负载平衡器: lb1 (active)和lb2 (passive),Glustered Web服务器: web1 (active), web2 (备份)和一些集群数据库。 Web服务器和数据库都是A指向负载均衡器的VIP。
两个Web服务器都有它们的cron作业副本。 假设以下任务:
* * * * * echo $(hostname) >> crontab.txt 0 0 1 * * ~/bin/another/task 2>&1
随着一些随机lockingalgorithm:
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"
我在哪里发送一个“per-cron-command”唯一的锁文件名和要执行的命令?
“安全”我的意思是web1或web2将运行,而不是两个。
如果我需要cron重叠(例如:每分钟执行一个长时间的任务限于当前分钟)? 如何让web1的cron再次执行,假设web1是活跃的“cron亚军”?
不知道以下是否可能,但这是我的想法:
不知道你正在使用哪个集群堆栈/软件,但可以在web1和web2上引入pacemaker和corosync ,并使用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
这将做什么是以下几点:
/etc/cron.d是否存在名为postfix的文件。 postfix.disabled (请记住, cron忽略文件名中带有点的作业定义)。 postfix作业定义作为/srv/postfix/cron的符号链接。 cron 。 这个例子不在运行postfix的主动/被动群集之外。 Cron get只能在活动的postfix节点上执行。
你可以改变这个删除postfix ,而是包括你的networking服务器。
编辑:如果上面的内容对你来说太“太”了,这里还有另外一个想法:你可以设置HAProxy统计,在你的脚本中获取这个网站,parsing它并根据主机名和HAProxy发出的状态进行相应的操作。
看起来你正在尝试创build一个跨服务器的信号量。 虽然有人试图build立,我没有看到它是生产准备。 而不是推动技术的发展,可能会把你的问题重构成适合现有技术的东西。
你的网站有一个数据库吗? 你可以用它来协调。
如果没有,那么使用像kafka或0mq这样的分布式排队系统怎么样?