目前我们在单个云服务器上设置了所有内容,包括:
- 数据库服务器
- Apache
- celery
- redis 作为 celery 和其他一些任务的代理
- 等等
现在我们正在考虑将主要组件分解为单独的服务器,例如独立的数据库服务器,媒体文件的独立存储,负载平衡器后面的网络服务器。原因是不为一台重型服务器付费,而是使用负载均衡器按需创建服务器以降低成本并提高整体速度。
我真的只对 celery 感到困惑,有没有人在负载均衡器后面的多个生产服务器上使用过 celery?任何指导将不胜感激。
考虑一个小用例,目前它是如何在单个服务器上完成的(令人困惑的是当我们使用多个服务器时如何完成):
- 用户上传一个
abc.pptx文件->引用存储在数据库中->存储在服务器磁盘上 - 任务(将文档转换为 pdf)被创建并进入 redis(代理)队列
- 在同一台服务器上运行的 celery 从队列中选择任务
- 读取文件,使用名为
docsplit的软件将其转换为 pdf - 在服务器磁盘上创建一个文件夹(稍后将用作静态内容)放置pdf文件及其缩略图和纯文本以及原始文件
- 读取文件,使用名为
考虑到上述用例,您如何设置可以执行相同功能的多个网络服务器?
请您参考如下方法:
将大大简化您的处理的是一些共享存储,可从所有协作服务器访问。通过这样的设计,您可以将工作分配给更多的服务器,而不必担心下一个处理步骤将在哪台服务器上完成。
使用 AWS S3(或类似的)云存储
如果您可以使用某些云存储,例如 AWS S3,请使用它。
如果您的服务器也运行在 AWS 上,则您无需为同一地区的流量付费,而且传输速度非常快。
主要优点是,您的数据可从所有服务器使用相同的存储桶/ key 名称获得,因此您不必担心谁在处理哪个文件,因为所有服务器都在 S3 上共享存储。
注意:如果您需要删除旧文件,您甚至可以在给定的存储桶上设置一些策略文件,例如删除超过 1 天或 1 周的文件。
使用其他类型的共享存储
有更多选择
- 桑巴舞
- 中央文件服务器
- FTP
- Google 存储(与 AWS S3 非常相似)
- Swift(来自 OpenStack)
- 等等
对于小文件,您甚至可以使用 Redis,但出于充分的理由,此类解决方案很少见。
