2011-06-23 15 views
14

ロードバランス環境でcronタスクを処理するためのより良いソリューションを探しています。ロードバランサの背後にある3台のCentOSのサーバー上で実行されているロードバランスされたWebサーバのCronタスク

  • PHPアプリケーション:

    現在を持っています。

  • タスクは定期的に実行する必要がありますが、一度に1台のマシンでのみ実行する必要があります。
  • 良い古いcronは、最初のサーバーでこれらのタスクを実行するように設定されています。
  • 何らかの理由で最初のサーバーが動作していない場合の問題。
  • 探し

:より堅牢とデ集中管理

  • 何か。
  • 複数のタスクが1回だけ実行されるようにタスクの負荷分散を行いますが、ランダム/異なるサーバーで負荷を分散させます。
  • 最初のサーバーがダウンしたときにタスクを実行しないようにします。
  • Webインターフェイスを使用してタスクを管理し、集計レポートを理想的に参照できます。
  • 何か問題が発生した場合の通知。

解決策はPHPで実装する必要はありませんが、必要に応じて簡単に修正することができればうれしいです。

私は約束しているような2つのプロジェクトを見つけました。 GNUBatchおよびJob Scheduler。おそらくさらに両方のテストを行いますが、私は誰かが上記のよりよい解決策を持っているのだろうかと思います。

ありがとうございました。

+0

レポートを見ることができるので、それはまったく同じ形式でデータを保存する1つずつ上のcronジョブを持つことによって解決することができます最も信頼性の高いサーバ(または他の何らかのサーバ)が、実際のジョブをth SSH経由で無作為にeサーバに接続します。 1台のマシンだけがスケジューリングを担当するので、すべてのサーバー間で同期/ロックを心配する必要はありません。 –

答えて

5

あなたは一時的な時限ロックを作成するためのRedisを使用して、この小さなライブラリを使用することができます。最初にロックを作成するサーバーもタスクを実行します。他のサーバーは何も実行せずにロックと終了を表示します。例えば

、スケジュールされたタスクを実行するPHPファイルに:それは、PHPのポートですhttps://github.com/chrisboulton/php-resque

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(); 

はデ一元的にタスクを実行し、負荷を分散するには、見てみましょうresqueのルビーバージョンの、あなたが労働者を監視するためにhttps://github.com/resque/resque-webまたはhttp://resqueboard.kamisama.me/を使用して

3

これらの3つのサーバーのいずれかでホストされていないデータベースがあるとします。

cronに入っている「ラッパー」スクリプトを作成し、実行しているプログラムを引数として受け取ります。最初に行うのは、リモート・データベースに接続し、項目が(このラッパー用に作成された)表に最後に挿入された時刻をチェックすることです。最後の挿入時間が実行されるべき時よりも大きい場合は、現在の時刻で新しいレコードをテーブルに挿入し、ラッパーの引数(cronジョブ)を実行します。

各サーバーのラッパーをアップします。各セットはX分後に設定されています(サーバーAは1時間上、サーバーBは5分、Cは10分など)。

最初のサーバは常にcronを実行するので、他の2つのサーバは決して実行されません。最初のサーバがダウンした場合、2番目のサーバは実行されていないことを確認して実行します。

また、ジョブを実行したサーバーをテーブルに記録すると、スクリプトが実行されたときのログが記録されます。

+0

Coreyありがとうございます。私たちは既に同様の方法で動作するいくつかのソリューションを見つけました。しかし、これは本当に私たちの基準を満たしておらず、純粋なcronと比較して唯一の利点は、最初のものがダウンした場合、2番目または3番目のサーバーのフォールバックです。問題はそれを書く方法についてのものではなく、すでにテスト済みの成熟した解決策があるかどうかということでした。 – poisson

+0

今使っているものが好きですか? –

+0

私は「現在持っている」セクションで説明したものだけを使用します。これは、最初のボックスに必要なタスクをトリガーリングするcronです。 – poisson

0

これはメッセージ/タスクキューを使用するのに理想的な状況ではないでしょうか?

https://github.com/AlexDisler/MutexLock

サーバが同一である必要があり、同じcronの設定を持っている:

関連する問題