在AWS上监控和扩展基于Docker的Celery工作集群

时间:2015-12-01 13:38:02

标签: amazon-web-services docker celery elastic-beanstalk

所以我有一个通过主管运行芹菜工作者的docker镜像,并且可以很好地处理单停靠者Elastic Beanstalk(相当长的任务,所以acks late = trueconcurrency = 1prefetch multiplier = 1) 。

问题是我想根据工作人员的有效任务负载来扩展实例,而EB只允许整体网络和CPU负载。

添加规则以扩大CPU负载可以正常工作,但我无法保证EB在任务中间不会决定缩小规模。这会触发一个docker stop,并有效地杀死任何不能很快完成的芹菜(如果我没弄错的话可以10秒)。

理想情况下,我需要一个基于CPU活动和队列中任务的监视器,伪代码如下:

while check interval has passed if task queue is empty (or workers are not busy) if running instances is greater than 1 scale down 1 instance else if CPU load is higher than threshold scale up 1 instance

现在的问题是,这种逻辑水平似乎在EB中无法实现,更有可能在ECS上运行,但我不确定以下内容:

  • 我们应该实现什么样的芹菜监视器以及代码应该在哪里运行?例如通常celery worker monitor commands似乎不是一个很好的解决方案来监控工人的忙碌程度,我们需要处理在docker中运行工人的额外复杂性
  • 群集扩展功能应该在哪里运行?在与AWS工程师聊天之后,似乎AWS Lambda可能是一个潜在的解决方案,但挂起群集实例将报告加载到lambda片段似乎相当复杂且难以维护
  • 作为奖励问题,如果我们需要迁移到ECS,我们还需要重写我们的部署脚本以手动触发版本交换,因为这目前由EB管理。最好的方法是什么?

任何帮助表示感谢,谢谢!

1 个答案:

答案 0 :(得分:4)

您可以利用AWS弹性beanstalk服务,只需提供docker镜像即可。它还附带仪表板,您可以在其中提供环境变量或根据CPU /请求/内存等扩展应用程序/工作程序。

你已经制作了芹菜工人的船坞形象。因此,而不是缩放CPU或内存。您可以根据队列中的许多任务来扩展实例。你可以自己设置缩放约束。

以下是您可以计算队列中芹菜任务的不同方法。 选择将监视放在任务队列上的选项。

使用鼠兔:

import pika

pika_conn_params = pika.ConnectionParameters(
    host='localhost', port=5672,
    credentials=pika.credentials.PlainCredentials('guest', 'guest'),
)
connection = pika.BlockingConnection(pika_conn_params)
channel = connection.channel()
queue = channel.queue_declare(
    queue="your_queue", durable=True,
    exclusive=False, auto_delete=False
)

print(queue.method.message_count)

使用PyRabbit:

from pyrabbit.api import Client
cl = Client('localhost:55672', 'guest', 'guest')
cl.get_messages('example_vhost', 'example_queue')[0]['message_count']

使用HTTP

语法:

curl -i -u user:password http://localhost:15672/api/queues/vhost/queue

示例:

curl -i -u guest:guest http://localhost:15672/api/queues/%2f/celery 

注意:默认vhost是/需要转义为%2f

使用CLI:

$ sudo rabbitmqctl list_queues | grep 'my_queue'

现在,根据您选择的选项(CLI或Python),您可以应用以下解决方案来扩展您的芹菜工作者。两个逻辑之间的共同点是需要连续运行。

如果选择CLI。您可以创建一个脚本,该脚本将持续监视任务数,并在超过提供的限制时应用扩展逻辑。如果您使用kubernetes,那么扩展部署将非常容易。否则,您需要按照您的系统要求进行操作。

使用python,您可以遵循相同的路径,但唯一的好处是,如果将来逻辑变得太复杂,它可以在将来作为服务工作。