2011-08-10 13 views
8

私はPython用の分散cronのようなフレームワークを探していて、Celeryを見つけました。しかし、ドキュメントでは、「一度に1つのスケジューラーしかスケジュールされていないことを確認する必要があります。それ以外の場合は、重複するタスクが発生します」とCeleryはスケジュールをローカル・ファイルに保管するcelery.beat.PersistentSchedulerを使用しています。分散セロリスケジューラ

私の質問では、スケジュールを「クラスタに」入れて、タスクの実行を調整して各タスクを1回だけ実行できるデフォルト以外の実装がありますか? 私の目標は、クラスタ内のすべてのホストで同じスケジュールのcelerybeatを実行できるようにすることです。

おかげ

答えて

0

私はcelerybeatが何をするかについて、いくつかの誤解があるかもしれないと思います。 Celerybeatは定期的なタスクを処理しません。それはそれらを公開するだけです。これは、定期的なタスクをキューに入れて、celerydワーカーによって処理されます。単一のcelerybeatプロセスと複数のcelerydプロセスを実行すると、タスクの実行はクラスタに分散されます。

+1

を私は私がしたいことは、複数のcelerybeatのインスタンスを実行できるようにすることです、ということを理解し、セロリビートを実行するホストがスケジューリングを停止すると、リスクを避けることができます。私。クラスタ化されたスケジューラ –

+1

いいえ、答えはいいえです。 https://github.com/ask/celery/issues/251 –

+0

ありがとうございます。あまりにもそれは2.3にそれを作ったことは悪い... –

0

Celerybeatを実行している3台のサーバーがある場合と同じ問題が発生しました。しかし、我々のソリューションは、単一のサーバー上でCelerybeatを実行するだけで、重複したタスクは作成されませんでした。なぜ、複数のサーバーでCelerybeatを実行したいのですか?

セロリーがダウンするのを心配しているのであれば、Celerybeatプロセスがまだ実行中であることを監視するスクリプトを作成するだけです。

$ ps aux | grep celerybeat 

これは、Celerybeatプロセスが実行されている場合に表示されます。次に、スクリプトを作成します。プロセスが停止している場合は、システム管理者に電子メールを送ります。 Here's a sample setupここでは、Celerybeatを1台のサーバーでのみ実行しています。

+3

実際にはここに答え。これは回避策に似ています。展開中に問題が発生します。複数の同種のノードにアプリケーションを配布する必要があるとします。 1つのノードだけがスケジューラを実行するということは、すべてのノードのための配置手順と、「スケジューラノード」のための別の配置手順とを有することを意味する。 – Sdra

1

tl; dr:いいえ、Celerybeatは使用例には適していません。 celerybeatという1つのプロセスを実行する必要があります。そうしないと、タスクは重複します。

これは非常に古い質問です。同じ問題/質問があるので、私は小さな要約をしようとします(2018年)。

背景:私たちはKubernetesクラスタでDjangoアプリケーション(セロリ付き)を実行しています。クラスタ(EC2インスタンス)とポッド(〜コンテナ)はオートスケールされています。単純に言えば、実行中のアプリケーションのインスタンス数とインスタンス数はわかりません。

celerybeatの1つのプロセスだけを実行するのはあなたの責任です。そうしないと、タスクが重複します。 [2] celerybeat のインスタンスが1つだけ、そのクラスタ全体に存在することを確認するために、ユーザに要求

が実質的な実装 負担(いずれかを作成する:[1]セロリリポジトリ内のこの機能要求がありました単一の障害点を作成するか、ユーザに自分自身の分散ミューテックスをロールバックするように促します)。

セロリビットは、誤って の並行処理を防止するメカニズムを提供するか、ドキュメントにベストプラクティス のアプローチを提案する必要があります。

しばらくして、この機能要求は、リソース不足のためにセロリの著者によって拒否されました。 [3] I   Githubのスレッド全体を読むことを強くお勧めします。そこに人々は、これらのプロジェクト/ソリューションをお勧めします。

メカニズム( http://docs.celeryproject.org/en/latest/tutorials/task-cookbook.html#ensuring-a-task-is-only-executed-one-at-a-time

をロック