web-dev-qa-db-ja.com

セロリ-1台のサーバーで異なるワーカーを実行する

私には2種類のタスクがあります:Type1-いくつかの優先度の高い小さなタスク。 Type2-優先度の低い大量のタスク。

最初はデフォルトのルーティングを使用した単純な構成でしたが、ルーティングキーは使用されませんでした。それは十分ではありませんでした-時々すべての労働者がType2タスクで忙しかったので、タスク1は遅れました。ルーティングキーを追加しました:

CELERY_DEFAULT_QUEUE = "default"
CELERY_QUEUES = {
    "default": {
        "binding_key": "task.#",
    },
    "highs": {
        "binding_key": "starter.#",
    },
}
CELERY_DEFAULT_EXCHANGE = "tasks"
CELERY_DEFAULT_EXCHANGE_TYPE = "topic"
CELERY_DEFAULT_ROUTING_KEY = "task.default"

CELERY_ROUTES = {
        "search.starter.start": {
            "queue": "highs",
            "routing_key": "starter.starter",
        },
}

つまり、優先度の高いタスクと低いタスクの2つのキューがあります。

問題は-異なる同時実行設定で2つのセロリを開始する方法?

以前はセロリがデーモンモードで使用されていたため( これに応じて )、開始は/etc/init.d/celeryd startが必要でしたが、今はキューと同時実行性が異なる2つのセロリを実行する必要があります。どうすればできますか?

34
Andrew

答えのようです-celery-multi-現在、十分に文書化されていません。

私が必要とすることは、次のコマンドで行うことができます:

celeryd-multi start 2 -Q:1 default -Q:2 starters -c:1 5 -c:2 3 --loglevel=INFO --pidfile=/var/run/celery/${USER}%n.pid --logfile=/var/log/celeryd.${USER}%n.log

私たちがしていることは、異なる並行性-c:​​1 5 -c:2 3で異なるキュー(-Q:1がデフォルト、Q:2がスターター)をリッスンしている2つのワーカーを開始することです。

33
Andrew

上記の回答に基づいて、次の/ etc/default/celerydファイルを作成しました(元は、ここのドキュメントで説明されている構成に基づいています: http://ask.github.com/celery/cookbook/daemonizing.html )これは、同じマシンで2つのセロリワーカーを実行する場合に機能し、各ワーカーは異なるキューにサービスを提供します(この場合、キュー名は「デフォルト」と「重要」です)。

基本的にこの回答は、前の回答を拡張したものであり、同じことを行う方法を示しているだけですが、デーモンモードのセロリについてのものです。ここではDjango-celeryを使用していることに注意してください。

CELERYD_NODES="w1 w2"

# Where to chdir at start.
CELERYD_CHDIR="/home/peedee/projects/myproject/myproject"

# Python interpreter from environment.
#ENV_PYTHON="$CELERYD_CHDIR/env/bin/python"
ENV_PYTHON="/home/peedee/projects/myproject/myproject-env/bin/python"

# How to call "manage.py celeryd_multi"
CELERYD_MULTI="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryd_multi"

# How to call "manage.py celeryctl"
CELERYCTL="$ENV_PYTHON $CELERYD_CHDIR/manage.py celeryctl"

# Extra arguments to celeryd
# Longest task: 10 hrs (as of writing this, the UpdateQuanitites task takes 5.5 hrs)
CELERYD_OPTS="-Q:w1 default -c:w1 2 -Q:w2 important -c:w2 2 --time-limit=36000 -E"

# Name of the celery config module.
CELERY_CONFIG_MODULE="celeryconfig"

# %n will be replaced with the nodename.
CELERYD_LOG_FILE="/var/log/celery/celeryd.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"

# Name of the projects settings module.
export Django_SETTINGS_MODULE="settings"

# celerycam configuration
CELERYEV_CAM="djcelery.snapshot.Camera"
CELERYEV="$ENV_PYTHON $CELERYD_CHDIR/manage.py celerycam"
CELERYEV_LOG_FILE="/var/log/celery/celerycam.log"

# Where to chdir at start.
CELERYBEAT_CHDIR="/home/peedee/projects/cottonon/cottonon"

# Path to celerybeat
CELERYBEAT="$ENV_PYTHON $CELERYBEAT_CHDIR/manage.py celerybeat"

# Extra arguments to celerybeat.  This is a file that will get
# created for scheduled tasks.  It's generated automatically
# when Celerybeat starts.
CELERYBEAT_OPTS="--schedule=/var/run/celerybeat-schedule"

# Log level. Can be one of DEBUG, INFO, WARNING, ERROR or CRITICAL.
CELERYBEAT_LOG_LEVEL="INFO"

# Log file locations
CELERYBEAT_LOGFILE="/var/log/celerybeat.log"
CELERYBEAT_PIDFILE="/var/run/celerybeat.pid"
34
eedeep

もう1つの方法は、-n引数を使用して、ワーカープロセスに一意の名前を付けることです。

同じ物理ハードウェアで2つのPyramidアプリを実行しており、それぞれに独自のセロリインスタンス(独自のvirtualenv内)があります。

どちらも、スーパーバイザーが両方を制御し、どちらも独自のsupervisord.confファイルを使用しています。

app1:

[program:celery]                                            
autorestart=true                                            
command=%(here)s/../bin/celery worker -n ${Host}.app1--app=app1.queue -l debug
directory=%(here)s     

[2013-12-27 10:36:24,084: WARNING/MainProcess] [email protected] ready.

app2:

[program:celery]                                 
autorestart=true                                 
command=%(here)s/../bin/celery worker -n ${Host}.app2 --app=app2.queue -l debug
directory=%(here)s                               

[2013-12-27 10:35:20,037: WARNING/MainProcess] [email protected] ready.
11
maz

アップデート:

Celery 4.xでは、以下が正しく機能します。

celery multi start 2 -Q:1 celery -Q:2 starters -A $proj_name

または、インスタンスの名前を指定する場合は、次のことができます。

celery multi start name1 name2 -Q:name1 celery -Q:name2 queue_name -A $proj_name

ただし、celery multiを使用すると、これらのインスタンスを起動するためのスクリプトショートカットにしか見えないため、画面に詳細ログが出力されないことがわかりました。

これらのインスタンスを1つずつ手動で開始する場合、異なるノード名を指定することでも機能すると思いますが、少し時間の無駄ですが-Aは同じ$proj_nameです。

ところで、 公式ドキュメント によると、次の方法ですべてのセロリワーカーを殺すことができます。

ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9

0
Alexww