情况如下:
我有一个 PHP/MySQL Web 应用程序,它接受用户上传(pdf 文件)。从这些 pdf 文件的页面中,会即时生成预览图像并呈现给 Web 应用程序的用户。有些 pdf 可能比较大,大多数不超过 50 MB,但某些极端情况下可能高达几百 MB。对于大型 pdf 文件,等待预览图像是可以接受的,但不能超过一分钟。目前,所有内容都在一台服务器上运行,但很快应用程序就会达到服务器的存储和处理能力极限。
我解决问题的想法:
为了处理这种情况,我的想法是根据需要使用一台或多台 pdf 处理服务器,以及一台或多台文件存储服务器。这两种类型的服务器使用 NFS 安装到实际运行应用程序的服务器上。然后,应用程序可以使用 GearMan 将 pdf 处理任务委托给这些处理服务器。处理服务器可以安装存储服务器并读取存储在那里的文件,对其进行处理并将其输出写入该服务器。我所说的服务器将是 amazon ec2 实例。
Web 应用程序返回指向存储服务器上所使用的结果 pdf 预览图像的链接,然后可以在前端使用该链接向用户显示图像。
我的问题:
我对使用多台服务器的应用程序毫无经验,这个想法可行吗?或者有更好的方法吗?对于这种情况,NFS 设置是否足够快速和可靠?
答案1
您的想法肯定是正确的,但根据我的经验,虚拟机上的共享存储很少具有良好的性能,因此我怀疑在这种情况下我是否真的会采用 NFS 路线。
最大的缺点是 EBS 上的 NFS 存在单点故障,这可能很难缓解。在非虚拟数据中心,我会使用集群 NAS 设备来处理故障转移 NFS。在 EC2 上,我不确定该怎么做。
如果您已经使用 Amazon EC2 执行工作任务,那么为什么不将资产存储在 S3 存储桶中呢? 性能良好,并且可以使用 HTTP 访问方法从世界任何地方访问存储桶。
您需要做的就是上传到 S3,让工作人员抓取文件,处理它,然后将生成的资产放回到 S3 上。
您甚至可以在本地安装 S3 存储桶。https://stackoverflow.com/questions/10801158/how-stable-is-s3fs-to-mount-amazon-s3-as-a-local-directory
事实上,你可以更多地使用 Amazon 堆栈并使用他们的简单消息服务来代替(或以及)gearman。