2011-06-23 184 views
14

我正在尋找更好的解決方案來處理負載平衡環境中的cron任務。Cron在負載均衡的Web服務器上的任務

目前有:在負載平衡器後面的3個CentOS的服務器上運行

  • PHP應用程序。
  • 任務需要定期運行,但一次只能在一臺機器上運行。
  • 設置好舊的cron以在第一臺服務器上運行這些任務。
  • 如果第一臺服務器出於任何原因無法使用,則會出現問題。

尋找

  • 東西更強大和分散式。
  • 對任務進行負載平衡,以便多個任務只運行一次,但在隨機/不同服務器上分散負載。
  • 防止在第一臺服務器出現故障時不運行任務。
  • 能夠使用Web界面理想地管理任務並查看彙總報告。
  • 如果出現任何問題,通知。

該解決方案不需要在PHP中實現,但它會很好,因爲它可以讓我們輕鬆地調整它,如果需要的話。

我發現了兩個項目,看起來有保證。 GNUBatchJob Scheduler。最有可能進一步測試,但我不知道是否有人有更好的解決方案上述。

謝謝。

+0

一次一個可以通過一個cron作業解決最可靠的服務器(或其他服務器)完成其中一個實際的工作e服務器隨機通過SSH。由於只有一臺機器負責調度,所以您不必擔心所有服務器之間的同步/鎖定。 –

回答

5

您可以使用Redis的使用這個小庫創建一個臨時,定時鎖定:

https://github.com/AlexDisler/MutexLock

的服務器應該是相同的,並且具有相同的cron配置。首先創建鎖的服務器也將執行該任務。其他服務器將看到鎖定並退出而不執行任何操作。

例如,在執行計劃任務的PHP文件:

MutexLock\Lock::init([ 
    'host' => $redisHost, 
    'port' => $redisPort 
]); 

// check if a lock was already created, 
// if it was, it means that another server is already executing this task 
if (!MutexLock\Lock::set($lockKeyName, $lockTimeInSeconds)) { 
    return; 
} 

// if no lock was created, execute the scheduled task 
scheduledTaskThatRunsOnlyOnce(); 

要在非集中方式運行的任務和分散負載,來看看:https://github.com/chrisboulton/php-resque 這是一個PHP端口的紅寶石版本的resque和它存儲在相同的確切格式的數據,所以你可以使用https://github.com/resque/resque-webhttp://resqueboard.kamisama.me/來監控工作人員,並看到報告

3

假設您有一個可用的數據庫,但未在其中一臺服務器上託管;

寫一個「wrapper」腳本,放在cron中,並將你正在運行的程序作爲它的參數。它所做的第一件事是連接到遠程數據庫,並檢查最後一次條目何時插入到表中(爲此包裝器創建)。如果最後一次插入時間大於它應該運行的時間,則用當前時間向表中插入一條新記錄,然後執行包裝器的參數(您的cron作業)。

Cron在每個服務器上的包裝,每個集合X分鐘在另一個之後(服務器A運行在小時的頂端,服務器B運行在5分鐘,C在10分鐘等)。

第一臺服務器將總是首先執行cron,因此其他兩臺服務器永遠不會執行該命令。如果第一臺服務器關閉,第二臺服務器將看到它沒有運行,並且會運行它。

如果您還在表中記錄了執行該作業的服務器,您將記錄腳本執行的時間/位置。

+0

謝謝科瑞。我們已經找到了一些類似的解決方案。然而,這並不能真正達到我們的標準,與純粹的cron相比,唯一的好處就是在第一臺服務器出現故障時第二臺服務器或第三臺服務器上的回退。問題不在於如何編寫,而在於是否已經有經過測試的成熟解決方案。 – poisson

+0

我很好奇你現在在用什麼? –

+0

我們只使用我在「目前有」部分中描述的內容。這是cron直接在第一個盒子上激發所需的任務。 – poisson

0

這不是使用消息/任務隊列的理想情況嗎?

相關問題