让人们在AWS负载平衡环境中上传文件的最佳方法是什么?

时间:2013-06-27 23:23:32

标签: amazon-web-services amazon-s3 distributed-filesystem glusterfs

假设您在AWS中运行了instance1,instance2和instance3。

他们都在运行Apache,并且您运行的Web应用程序需要允许用户上传图像,这是许多项目中的情况。

此外,当您显示图像时,需要将其裁剪为正确的尺寸,因此您基本上需要确保所有实例始终可以访问相同的文件。

因此,假设用户将图像上传到instance1,而另一个用户正在访问同一图像以100x100大小显示的页面,并且他点击了instance2。另一个用户试图在instance3上看到300x300大小的相同图像。还有许多其他不容易预测的尺寸。

所以你基本上需要一个分布式文件系统,我正在使用Gluster FS。所以所有实例都可以访问相同的文件,当看到图像的请求时,我有一个PHP脚本,检查该图像是否已经调整到给定的尺寸,如果是,它将显示它们,如果不是它将调整大小它然后再显示。

Gluster FS工作非常顺利,我很满意,除了我认为我正在重新发明轮子,AWS应该有一些解决方案。使用top命令,我可以看到glusterfs总是使用我的一些CPU。

我还使用CloutFront来缓存调整大小脚本的输出,这会大大降低服务器负载,但Gluster FS的运行成本仍然很高。

你可以使用rsync和某种类型的cron作业来做同样的事情,而不需要Gluster FS,但这需要很多工作而且不太可靠,因为你需要知道何时触发rsyncing过程,你仍然无法获得Gluster FS提供的巨大好处。我也尝试过s3fs,我只想说这绝对是一场噩梦。

与Gluster FS相比,NFS驱动器似乎也非常原始,我认为它们使用UDP,因此它们会对您的数据进行处理,这无关紧要。

那么做这样的事情最好的方法是什么?我试图找到AWS提供的分布式文件系统,因为我认为许多开发人员会遇到相同或类似的问题但是没有。

你可以说只是上传到s3,但是s3对我不起作用,我需要知道图片是否已经调整大小,然后调整大小并提供服务或者只是服务,所以我需要一些我可以编写脚本的东西对

您也可以说好,为什么不首先调整所有图像的大小,然后将它们全部上传到s3,我不能这样做的原因是

  1. 大约有100万张图片和100种尺寸,所以我们正在寻找大量要转换的文件
  2. 每天可能会添加新尺寸,因此调整第一个策略不起作用

1 个答案:

答案 0 :(得分:0)

我会用2个S3桶来接受它:

  • 主图像存储桶:以网站上使用的原始分辨率/最佳分辨率上传图像,没有到期时间。
  • 缓存存储桶:创建按需映像,您可以使用timthumb创建所请求的大小并设置到期时间。

当用户请求图像时,检查是否存在于缓存桶中,否则您创建它,将其存储在缓存桶中并从那里发送。

考虑:

  • 请注意timthumb,旧版本存在安全问题,您可以检查替代方案。
  • Squid-cache也可以提供帮助,你可以用另一个ec2实例替换缓存桶

这只是我的方法,但随时回复并深入了解