2

这是我第一次设计一个必须考虑图像上传/下载流量以及使用亚马逊网络服务器的网络应用程序。我一直在阅读,但我仍然对如何最好地解决我的问题感到困惑。

我正在构建一个网络应用程序,该应用程序将具有大量图像流量,我注意到它Amazon RDSAmazon S3. 通常在我用来构建的网站中,我不需要担心本地存储与数据库存储。

通过将所有图片存储在数据库而不是本地(S3)中,我会丢失任何东西吗?

这让我认为最好将图像存储在Amazon RDS. 因此,我想知道:

用户一般会上传 4 张图片:mainPicThumbmainPic和。每个还将具有字段和. 为了提高效率,我应该将每种图片类型放在不同的表格中还是不应该成为问题?我的意思是,如果我将不同表格中的图片分开,我会获得更快的访问速度和搜索速度还是获得什么?secondPicsecondPicThumbnamesize

大多数用户查询也将返回 10 个不同的 Thumb 图像

我正在使用 PHP 构建后端并使用 ORM ( Propel )。

我将不胜感激任何指导/建议。

4

3 回答 3

7

我在 AWS 上为 Stock 摄影网站构建了解决方案,该网站存储了数百万张跨越 TB 的图像,希望分享一些 AWS 中的最佳实践以满足您的要求:

P1) 将原始图像文件存储在 S3 标准选项中

P2) 在 S3 减少冗余选项 (RRS) 中存储可重现的图像(如拇指等)以节省成本

P3) 包括 S3 URL 在内的关于图像的元数据可以存储在 Amazon RDS 或 Amazon DynamoDB 中,具体取决于查询的复杂性。查询来自 Amazon RDS 的条目。如果您的查询很复杂,将元数据存储在 Amazon CloudSearch 或 Apache Solr 中也是常见的做法。

P4) 使用 Amazon CloudFront 以低延迟将您的拇指交付给用户。

于 2013-05-28T22:30:50.173 回答
5

您在计算成本时犯了一些基本的计算错误。将数据存储在关系数据库中永远不会比将数据存储在完全优化的平面数据存储系统中便宜。

在 S3 中存储数据时,您将只按实际存储使用量和实际网络使用量计费。这是整个月平均的准确数据量,每 GB/月 0.095 美元(较低层级从 1TB/月开始),加上每 10000 个外部 GET 请求 0.004 美元,加上每 GB 数据传输到 Internet 0.120 美元(较低层级)从 10TB/月开始申请)。

在 RDS 中存储数据时,您需要为实例支付每小时费用,外加每 GB/月 0.125 美元的存储费用,以及底层存储上的每次 IO 操作成本。单个查询请求数兆字节的二进制数据,很容易触发数百或数千个 IO 操作 - 如果结果恰好被缓存,则不会触发。很难预测 IO 使用情况,除了根据定义它与执行的查询量和传输的数据量没有线性关系。作为指导,我刚刚检查了一台 LAMP 服务器,因为它是半夜,负载大约为 0.60,并且它在其存储磁盘上每秒持续处理大约 50~150 次 IO 操作(OS、swap 和 /tmp 在另一个上) ,而几乎没有做任何事情。

对于存储在 RDS 中的数据,实际检索数据仅意味着您已将其传输到您的 EC2 实例或其他访问方式。然后,您仍将承担实际处理请求并将数据从那里传输到 Internet 的全部费用。

总结:将数据存储在 RDS 中而不是 S3 中总是会更昂贵。很难预测它的价格是 10 倍、100 倍还是 1000 倍。使用 S3 存储文件,这就是简单存储服务的用途。它的性能也会更远、更远,尤其是当您将其绑定到 CloudFront 以利用其缓存边缘位置时。

(提及的所有价格均假设亚马逊最便宜的位置 - 其他地方的价格可能略有不同)

于 2013-05-28T00:16:33.790 回答
0

在 SQL 数据库中存储图像是可能的,但不是最佳实践。

另一方面,如果你真的想在数据库中存储图像,一些数据库对文件存储的支持更好。例如,CouchDBMongoDBRiak

这是一个权衡:好处是您的开发更加“便携”,因为您可以开发/测试而不会产生亚马逊成本。不利的一面是,当它增长时,您将面临扩展。

大多数人宁愿利用 S3,并在数据库中保留最少数量的关于图像的元数据。

为了提高效率,我应该将每种图片类型放在不同的表格中还是不应该成为问题?

如果您认为您的缩略图大小是固定的,您可以为每个图像存储一行,然后在代码中生成所有变体。(即 pic123/orig.jpg pic123/small.jpg、pic123/medium.jpg)

如果您认为您可能不经常添加尺寸,请为每个尺寸制作列。(即插入图像值(名称='pic123','orig'='y','small'='y')。)

于 2013-06-17T12:30:08.977 回答