在多个服务器上的django-celery基础设施,经纪人是redis

时间:2014-05-08 20:24:23

标签: python django architecture celery

目前,我们在单个云服务器上设置了所有设置,包括:

  • 数据库服务器
  • 的Apache
  • 芹菜
  • redis作为芹菜的经纪人和其他一些任务

现在我们正在考虑将主要组件拆分为单独的服务器,例如单独的数据库服务器,媒体文件的单独存储,负载平衡器后面的Web服务器。原因是不支付一台重型服务器并使用负载平衡器按需创建服务器以降低成本并提高整体速度。

我对芹菜很困惑,有没有人在负载均衡器后面的多个生产服务器上使用过芹菜?任何指导都将不胜感激。

考虑一个小用例,目前在单个服务器上是如何完成的(混淆是当我们使用多个服务器时如何完成):

  • 用户上传abc.pptx文件 - >参考存储在数据库 - >存储在服务器磁盘上
  • 创建任务(将文档转换为pdf)并进入redis(代理)队列
  • 在同一台服务器上运行的芹菜从队列中挑选任务
    • 阅读文件,使用名为docsplit
    • 的软件将其转换为pdf
    • 在服务器磁盘上创建一个文件夹(稍后将用作静态内容)put pdf文件及其缩略图和纯文本以及原始文件

考虑到上述用例,如何设置多个可以执行相同功能的Web服务器?

2 个答案:

答案 0 :(得分:4)

强大简化处理的是一些共享存储,可从所有协作服务器访问。通过这样的设计,您可以在更多服务器之间分配工作,而无需担心下一个处理步骤将在哪个服务器上完成。

使用AWS S3(或类似)云存储

如果您可以使用某些云存储,例如AWS S3,请使用它。

如果您的服务器也在AWS上运行,您不需要为同一区域内的流量付费,并且传输速度非常快。

主要优点是,您的数据可以在相同存储桶/密钥名称下的所有服务器上获得,因此您无需担心谁在处理哪个文件,因为所有文件都在S3上有共享存储。

注意:如果您需要删除旧文件,您甚至可以在给定存储桶上设置一些策略文件,例如:删除超过1天或1周的文件。

使用其他类型的共享存储

还有更多选项

  • 桑巴
  • 中央文件服务器
  • FTP
  • Google存储空间(非常类似于AWS S3)
  • Swift(来自OpenStack)

对于小文件,你甚至可以使用Redis,但这样的解决方案是有充分理由的,很少见。

答案 1 :(得分:2)

Celery实际上非常简单,因为您已经将任务放在队列中了。随着更多工作人员的变化,每个工作人员都会接受队列中的下一个工作 - 因此多个工作人员可以一次处理,每个工作人员都在自己的机器上。

这有三个部分,你已经有了其中一部分。

  1. 共享存储,以便所有计算机都可以访问相同的文件
  2. 可以将任务分发给多个工作人员的经纪人 - redis可以用于
  3. 多台机器上的工人
  4. 以下是您设置的方式:

    • 用户将文件上传到前端服务器,该服务器存储在您的共享存储中(例如S3,Samba,NFS等),并将引用存储在数据库中
    • 前端服务器启动芹菜任务来处理文件,例如

    def my_view(request): # ... deal with storing the file file_in_db = store_file(request) my_process_file_task.delay(file_in_db.id) # Use PK of DB record # do rest of view logic...

    • 在每台加工机器上,运行celery-worker: python manage.py celery worker --loglevel=INFO -Q default -E

    然后,当您添加更多计算机时,您将拥有更多工作人员,并且工作将在它们之间进行分配。

    要确保的关键事项:

    • 您必须拥有共享存储空间,否则会变得更加复杂
    • 每个工作机器必须具有正确的Django / Celery设置才能找到redis代理和共享存储(例如S3存储桶,密钥等)