我正在致力於創建可以執行邏輯 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 服務上的觸發遺失。我猜測扳機被從某個隊列中拉出,最終在停止過程中被扔掉。