Как использовать django с эластичным Benastalk, который также будет запускать задачи сельдереем только на основном узле?Как запустить работника сельдерея с приложением Django, масштабируемым AWS Elastic Beanstalk?
ответ
Вот как я установил сельдерей с django на эластичном бобовом стебле с улучшенной масштабируемостью.
Пожалуйста, имейте в виду, что «leader_only» вариант для container_commands работает только на среде перестраивать или развертывание приложения. Если сервис работает достаточно долго, лидерский узел может быть удален с помощью эластичного бобового стебля. Чтобы справиться с этим, вам может потребоваться применить защиту экземпляра для вашего узла-лидера. Проверка: http://docs.aws.amazon.com/autoscaling/latest/userguide/as-instance-termination.html#instance-protection-instance
Добавить скрипт bash для работника сельдерея и настроить бит.
Добавить файл корневая_папка/.ebextensions/файлы/celery_configuration.txt:
#!/usr/bin/env bash
# Get django environment variables
celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g' | sed 's/%/%%/g'`
celeryenv=${celeryenv%?}
# Create celery configuraiton script
celeryconf="[program:celeryd-worker]
; Set full path to celery program if using virtualenv
command=/opt/python/run/venv/bin/celery worker -A django_app --loglevel=INFO
directory=/opt/python/current/app
user=nobody
numprocs=1
stdout_logfile=/var/log/celery-worker.log
stderr_logfile=/var/log/celery-worker.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998
environment=$celeryenv
[program:celeryd-beat]
; Set full path to celery program if using virtualenv
command=/opt/python/run/venv/bin/celery beat -A django_app --loglevel=INFO --workdir=/tmp -S django --pidfile /tmp/celerybeat.pid
directory=/opt/python/current/app
user=nobody
numprocs=1
stdout_logfile=/var/log/celery-beat.log
stderr_logfile=/var/log/celery-beat.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 600
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998
environment=$celeryenv"
# Create the celery supervisord conf script
echo "$celeryconf" | tee /opt/python/etc/celery.conf
# Add configuration script to supervisord conf (if not there already)
if ! grep -Fxq "[include]" /opt/python/etc/supervisord.conf
then
echo "[include]" | tee -a /opt/python/etc/supervisord.conf
echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf
fi
# Reread the supervisord config
supervisorctl -c /opt/python/etc/supervisord.conf reread
# Update supervisord in cache without restarting all services
supervisorctl -c /opt/python/etc/supervisord.conf update
# Start/Restart celeryd through supervisord
supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd-beat
supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd-worker
Береги о выполнении сценария во время развертывания, но только на главном узле (leader_only: истина). Добавить файл корневая_папка/.ebextensions/02-python.config:
container_commands:
04_celery_tasks:
command: "cat .ebextensions/files/celery_configuration.txt > /opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh && chmod 744 /opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh"
leader_only: true
05_celery_tasks_run:
command: "/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh"
leader_only: true
- Удар настраивается без необходимости перераспределения, с отдельными приложениями Джанго: https://pypi.python.org/pypi/django_celery_beat.
- Сохранение результатов выполнения задач является хорошей идеей: https://pypi.python.org/pypi/django_celery_beat
Файл requirements.txt
celery==4.0.0
django_celery_beat==1.0.1
django_celery_results==1.0.1
pycurl==7.43.0 --global-option="--with-nss"
Настройка сельдерей для Amazon SQS брокера (Получить нужную конечную точку из списка: http://docs.aws.amazon.com/general/latest/gr/rande.html) root_folder/django_app/settings.py:
...
CELERY_RESULT_BACKEND = 'django-db'
CELERY_BROKER_URL = 'sqs://%s:%[email protected]' % (aws_access_key_id, aws_secret_access_key)
# Due to error on lib region N Virginia is used temporarily. please set it on Ireland "eu-west-1" after fix.
CELERY_BROKER_TRANSPORT_OPTIONS = {
"region": "eu-west-1",
'queue_name_prefix': 'django_app-%s-' % os.environ.get('APP_ENV', 'dev'),
'visibility_timeout': 360,
'polling_interval': 1
}
...
конфигурации Сельдерей для Джанго django_app приложение
Добавить файл корневая_папка/django_app/celery.py: файл
from __future__ import absolute_import, unicode_literals
import os
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_app.settings')
app = Celery('django_app')
# Using a string here means the worker don't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
# should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')
# Load task modules from all registered Django app configs.
app.autodiscover_tasks()
Изменить корневая_папка/django_app/__ init__.ру:
from __future__ import absolute_import, unicode_literals
# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from django_app.celery import app as celery_app
__all__ = ['celery_app']
Проверьте также:
- How do you run a worker with AWS Elastic Beanstalk? (решение без масштабирования)
- Pip Requirements.txt --global-option causing installation errors with other packages. "option not recognized" (решение проблем, поступающих от obsolate пип на упругом Beanstalk, что cannto дело с глобальными вариантами должным образом решая pycurl зависимость)
Не могли бы вы взглянуть на этот вопрос? Я следовал вашему примеру, но получил следующую ошибку: http://stackoverflow.com/questions/43481540/django-celery-elastic-beanstalk-supervisord-no-such-process-error –
@BorkoKovacev Спасибо, я обновил исправление набора для перезапуска supervisorctl. – smentek
@smentek это может быть немного поздно, но я сделал именно то, что вы сказали выше, и до сих пор он работал нормально, за исключением того, что при развертывании я делаю это со мной https://stackoverflow.com/questions/44268539/running-celery -s-daemon-with-supervisor-and-django-on-elastic-beanstalk, похоже, что-то связано с тем, что pycurl не найден? –