在AWS上监控和扩展基于Docker的Celery工作者群集
所以我有一个docker镜像,通过supervisor运行一个芹菜工作器,在单一docker Elastic Beanstalk(相当长的任务,所以acks late = true
, concurrency = 1
和prefetch multiplier = 1
)上工作得很好。
麻烦的是我想根据工作人员的有效任务负载来扩展实例,而EB只允许整个networking和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上运行,但我不确定以下几点:
- 我们应该实施什么样的芹菜监视器,代码运行在哪里? 例如,通常的芹菜工监控命令似乎不是一个很好的解决scheme来监控工作人员的繁忙程度,我们需要处理在docker工人中运行工人的额外复杂性
- 集群缩放function应该在哪里运行? 在与AWS工程师聊天之后,似乎AWS Lambda可能是一个潜在的解决scheme,但是将集群实例加载到lambda片段的报告似乎相当复杂且难以维护
- 作为一个额外的问题,如果我们需要迁移到ECS,我们还需要重写我们的部署脚本来手动触发版本交换,因为这是由EBpipe理的。 最好的办法是什么?
任何帮助表示感谢,谢谢!
- 无法通过我的gmail电子邮件ID从弹性beanstalk环境发送电子邮件
- Elastic Beanstalk和Dockerfile ARG指令
- 具有Docker和持久存储的弹性Beanstalk
- AWS Elastic Beanstalk中的Docker:在$ PATH中找不到可执行文件“
- 在Elastic Beanstalk / Docker Nginx / PHP-FPM实例中访问客户端IP
- 如何将docker-compose.yml转换为Django的Dockerrun.aws.json
- 在Elastic Beanstalk中暴露Docker的多个端口
- dockerbuild设失败 – “无法分配内存”
- 在AWS EBS microservice docker环境中使用Kafka,以避免丢失用户请求并处理更多并发点击