【问题标题】:Share media between multiple django(VMs) servers在多个 django(VM) 服务器之间共享媒体
【发布时间】:2022-01-25 21:46:50
【问题描述】:

我们已经部署了一个 django 服务器 (nginx/gunicorn/django),但是为了扩展服务器,有多个相同的 django 应用程序实例正在运行。

这是图表(架构):

每个蓝色矩形都是一个虚拟机。

HAProxy 将所有到 example.com/admin 的请求发送到服务器 3。其他请求在服务器 1 和服务器 2 之间分配。(负载平衡)。

老问题:

每台机器都有一个媒体文件夹,当管理员上传内容时,上传的媒体仅在服务器 3 上。(普通用户无法上传任何内容)

我们通过将所有到 example.com/media/* 的请求发送到服务器 3 来解决这个问题,并且来自服务器 3 的 nginx 为所有静态文件和媒体提供服务。

现在有问题

我们也在使用 sorl-thumbnail。

当一个请求来自 example.com/ 时,sorl-thumbnail 尝试访问该媒体文件,但它在这台机器上不存在,因为它在 Server3 上。

所以现在对那台机器(服务器 1 或 2)的所有请求都为该媒体文件获得 404。

想到的一个解决方案是在所有 3 台机器之间创建一个共享分区并将其用作媒体。 另一种解决方案是在每次上传后同步所有媒体文件夹,但这个解决方案有问题,即我们每秒有近 2000 个请求,有时同步可能不够快,sorl-thumbnail 创建空文件的数据库记录并发生 404。

提前致谢,很抱歉问了这么长的问题。

【问题讨论】:

  • 我们使用单独的机器来存储 NFS 安装到应用程序服务器的静态和媒体。它有效,但我们几乎没有你的负载......

标签: python django


【解决方案1】:

您应该使用对象存储来保存和提供用户上传的文件。 django-storages 让实现变得非常简单。

如果您不想使用基于云的 AWS S3 或同等产品,您可以使用 minio 托管您自己的本地 S3 兼容对象存储。

在您当前的设置中,我没有看到任何简单的方法来修复 vm 的数量根据负载而动态变化的位置。

如果您有部署自动化,那么也许可以试试rsync,以便 vm 负责与其他 vm 同步文件。

【讨论】:

  • 似乎 minio 和 django-storage 是解决方案,但问题正在迁移。我该怎么办?是否可以创建一个连接到minio的VM并一个一个替换我当前的VM?
  • 你有多少数据?所有 3 个虚拟机都一样吗?尽管如此,您应该始终将基础设施视为“牛而不是宠物”devops.stackexchange.com/questions/653/…。 Minio 是另一个需要长期维护/扩展的野兽,我强烈建议使用 AWS S3、DigitalOcean Spaces 之类的东西(几乎所有云提供商都有 S3 兼容的对象存储产品)。您还可以通过其中大部分获得免费的自动 CDN。
  • 所有虚拟机的媒体都是相同的,正如我所说,普通用户无法上传任何内容,所以只有管理员。现在它大约 4 GB 并且正在增加,主要是图像。问题是我们无法访问 AWS s3 或其他服务,运行 minio 是一个更好、更稳定的解决方案。
  • 对于迁移,您需要做一些研究和编写脚本。我以前没有这样做过,但这可以作为一个起点stackoverflow.com/a/42188942
  • 或者如果它太多了,就使用共享分区。我认为所有这些迁移和 minio 并没有让事情变得如此复杂有什么大的优势。特别是当您没有获得任何 CDN 时。
【解决方案2】:

问题:问题出在哪里?

我们在其他机器上得到 404,因为正常请求(请求模板的请求)会在缩略图媒体上找不到 404。 真正的问题是 sorl-thumbnail 模板标签。

这是我们最终要做的:

在需要缩略图的模型中,我们添加了创建特定缩略图的函数。

并在管理机器中使用post-save signal 调用所有这些函数,以确保在保存后创建所有缩略图并且填充sorl-thumbnail 的表。

现在在模板中而不是调用 sorl-thumbnail 模板标签现在我们在模型中调用函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多