2017-04-07 73 views
0

目前,我有一個應用程序在一臺服務器上運行。有一個crontab根據指定的規則設置,有些任務在某些時候運行。在Docker集羣中安排任務的最佳方法是什麼?

現在,我正在考慮將我的應用程序遷移到docker容器中,以便能夠獨立運行我的應用程序的多個實例。我想知道如何做的事情是如何安排跨多個碼頭集裝箱的任務

比方說,我有一個PHP命令,每小時通過API從第三方應用程序獲取新數據。目前,我會使用一個cron來安排它:0 */1 * * * php /some/path/index.php mycommand。可以有多個以不同頻率啓動的類似命令。

我不能簡單地將crontab打包到我的docker鏡像中,因爲當有5個容器運行時,命令將啓動5次。我想在運行容器數量上獨立運行一次。

什麼是實現此目標的理想解決方案?

回答

2

您可以使用類似redis的鎖定機制。基本上它會這樣工作。

劇本醒來,它的第一件事就是嘗試並取得鎖定。如果它獲得鎖定,則它向前移動,如果有其他鎖定,則退出。做腳本做什麼,然後釋放鎖。

由於每次只有一個腳本可以獲取鎖,因此它只會允許腳本運行一次。

當腳本完成時,刪除鎖定非常重要,並且還要向鎖中添加一個TTL,以便如果腳本在釋放鎖之前死亡,鎖定將在TTL過期後自動打開。

以下是關於如何使用Redis作爲分佈式鎖的一些文檔。 https://redis.io/topics/distlock

+0

我想領事是這個場景的理想人選。 –

+0

感謝您提供解決方案,特別是建議如何使用Redis完全實現它! @ f-society你認爲Consul是理想的嗎? – simPod

1

在你的情況下一個簡單的策略是使用具有不同角色的容器。例如,使用5個容器來響應HTTP請求並運行cron,而不是使用5個容器運行你的應用程序,只有一個容器運行cron作業。

如果您需要擴展您的cron作業來添加更多節點,那麼您需要一個分佈式隊列/鎖定解決方案,如@Ken Cochrane所述。

+0

謝謝你的解決方案。由於這看起來非常可行,我會接受Ken的解決方案,因爲正如您所說的那樣,這是可擴展的,可能需要較爲複雜的部署設置。但肯定投票了! – simPod

相關問題