管理触发冲突的一次性服务的 systemd 定时器

管理触发冲突的一次性服务的 systemd 定时器

我正在创建可以执行逻辑 MySQL 备份以及物理 MySQL 备份的服务。逻辑备份每 4 小时进行一次,而物理备份每天在特定时间进行一次。两者都依赖于关闭备份所基于的 MySQL 从属服务器。它们还需要处理不同时运行的问题。此外,在启动/重新启动时,不应在第一次调用时运行这些服务。

逻辑备份正在使用mysqldump然后上传到 S3。物理备份正在对 EBS 进行快照。

我一直在运行一个简单的压力案例版本,其中两者以 1 分钟的间隔触发。数据库是空的,很小。EBS 卷是 1GiB。两者都可以在一分钟内完成。

我使用定时器服务来触发单触发。我还使每个定时器Conflicts相互关联,并在 中重新启动定时器ExecStopPost

服务文件的示例如下。每个文件都引用另一个文件

[Unit]
After=mysql-slave.service
Conflicts=other-backup-type.timer

[Service]
Type=oneshot
# Just arbitrary name for this example
ExecStart=do_backup.sh
ExecStopPost=/bin/systemctl start other-backup-type.timer

我所看到的systemctl list-timers是两个定时器是同步的。当两个定时器都达到 0 时,一个定时器会触发。我发现一旦完成,另一个定时器就不会被触发。似乎在这种情况下,定时器确实停止了,但另一个单次触发永远不会被触发。

有没有办法在不偏移时间的情况下正确处理这个问题?我发现如果我稍微偏移一下时间段,它就会起作用(秒不能是 60 的倍数)。我正在检查是否有更好/更优雅的方式来支持这一点。

答案1

我不太确定这是否是 100% 正确的答案。我试过很多种排列组合,并在此基础上得出了这个答案。

从观察来看,如果我有 2 个定时器(A 和 B),它们的设置Conflicts=与另一个定时器相同,并且在到期时发生冲突(例如,两者都设置为每分钟触发一次),则触发的定时器(假设是 A)首先停止另一个定时器,然后触发其服务。但是,此停止会导致定时器 B 服务上的触发器丢失。我猜触发器是从某个队列中拉出的,最终在停止过程中被丢弃。

相关内容