2016-05-16 71 views
1

我正在构建网络目录存档程序,使用celeryhttrack异步镜像。我目前有一个由三台服务器组成的集群,每台服务器有五个工作站。每个任务可能需要两到六个小时才能执行。 RabbitMQ被用作代理,在rpc通道上有一些反向链接。芹菜 - 工作人员不接受新任务

我会为每个服务器芹菜以下配置:

# Celery init script for ingestion workers 
# Set _BIN, _CHDIR, _LOGFILE and _OPTS for the enviroment used. 

# This specific configuration is for ingest PROD 2 only 
# Define worker nodes to start 
CELERYD_NODES="ingest_prod_2_1 ingest_prod_2_2 ingest_prod_2_3 ingest_prod_2_4 ingest_prod_2_5" 

# Absolute path to celery executable 
CELERY_BIN="/home/ubuntu/.virtualenvs/proj2.7/bin/celery" 

CELERYD_CHDIR="/home/ubuntu/project/proj" 

# App instance used 
CELERY_APP="ingest.tasks" 

#Log file location 
CELERYD_LOG_FILE="/home/ubuntu/project/logs/django/%N.log" 
CELERYD_LOG_LEVEL="DEBUG" 
CELERYD_PID_FILE="/home/ubuntu/project/celery_%N.pid" 

CELERYD_ACKS_LATE=True 
CELERYD_PREFETCH_MULTIPLIER=1 

# Celery options, define broker backtalk 
CELERYD_OPTS="-b amqp://user:[email protected]/vhost -Q long_task_queue -c 1 -Ofair" 

# Workers should run as an unprivileged user and create dirs if missing 
CELERYD_USER="ubuntu" 
CELERYD_GROUP="ubuntu" 
CELERY_CREATE_DIRS=1 

对于压力测试的锻炼,我把200个任务的任务队列。起初,所有工作人员都很活跃,但是很快毕竟两个服务器上的工作人员在完成初始任务后没有完成任务。只有一台服务器继续运行,所有五名员工都在运行现在,两天后,一台服务器只有一个活动工人,其他人都闲置。其结果是,代替在〜附近150项任务执行时,我只看到40.

这是`芹菜-A ingest.tasks检查活性“结果:

-> [email protected]_1: OK 
    - empty - 
-> [email protected]_2: OK 
    - empty - 
-> [email protected]_3: OK 
    - empty - 
-> [email protected]_1: OK 
    - empty - 
-> [email protected]_2: OK 
    - empty - 
-> [email protected]_3: OK 
    - empty - 
-> [email protected]_1: OK 
    - empty - 
-> [email protected]_2: OK 
    - empty - 
-> [email protected]_3: OK 
    - empty - 
-> [email protected]_1: OK 
    - empty - 
-> [email protected]_2: OK 
    - empty - 
-> [email protected]_3: OK 
    - empty - 
-> [email protected]_1: OK 
    * {u'args': u"[u'url', 35637]", u'time_start': 464085.760026547, u'name': u'ingest.tasks.html.download', u'delivery_info': {u'priority': None, u'redelivered': False, u'routing_key': u'backlog.#', u'exchange': u'celery'}, u'hostname': u'[email protected]_3', u'acknowledged': True, u'kwargs': u'{}', u'id': u'083b575c-8e52-4426-90a5-e9a6ceb117a4', u'worker_pid': 28807} 
-> [email protected]_2: OK 
    - empty - 
-> [email protected]_3: OK 
    - empty - 

这是一个RabbitMQ的管理插件的队列标签

enter image description here

我已经设置了队列的截图是backlogingest。所有其他人都由rabbitmq设置。我不确定如何解释这些。

所以我不确定这里发生了什么。

+0

兔排队呢?任务仍在经纪人中或消息已被消费?可能是预取你的问题http://docs.celeryproject.org/en/latest/configuration.html#std:setting-CELERYD_PREFETCH_MULTIPLIER –

+0

我认为,这就是为什么我添加了'ACKS_LATE = True'和'PREFETCH_MULTIPLIER = 1'到配置。似乎没有效果。可能不得不作为经纪人切换到redis ... – Jason

+0

奇怪。我刚刚检查了在职员工,他们都在一台机器上。群集中的其他两台服务器处于空闲状态。 – Jason

回答

2

在聊天中讨论后,我真的认为你的问题是将RabbitMQ配置为CELERY_RESULT_BACKEND,这看起来很清楚,这些队列中有一些名称UIIDs,其中一些消息未消耗大量消息。

这意味着任务正在将结果存储回代理,但没有人正在消耗导致RabbitMQ放慢速度并冻结。 这是即使在旧文档中提到它被saing

旧AMQP后端(严重)模拟一个基于数据库的后端。

对CELERY_RESULT_BACKEND使用noSQL或缓存系统。

但是,在较新版本中,这些消息应该自动过期,从而减少了在docs中写入的兔子MQ的问题。

+0

文档链接已损坏或已过期。 –

+0

谢谢,答案已经改变。 –

相关问题