这是我第一次设计一个必须考虑图片上传/下载流量的网络应用。也使用亚马逊网络服务器。我一直在读书,但我仍然很困惑如何最好地解决我的问题。
我正在构建一个带有大量图片流量的网络应用,我注意到Amazon RDS
比Amazon S3
便宜。通常在我习惯构建的网站中,我不需要担心本地存储与数据库存储。
通过将所有图片存储在db而不是local(S3)中,我会丢失任何东西吗?
然后让我认为最好将图像存储在Amazon RDS
中。因此,我想知道:
用户一般会上传4张图片:mainPicThumb
,mainPic
,secondPic
和secondPicThumb
。每个字段还包含字段name
和size
。为了提高效率,我应该将每种图片类型放在不同的表格中,还是不应该出问题?我的意思是,如果我将不同表格中的图片分开,我会获得更快的访问速度和搜索速度,还是获得任何收益?
大多数用户查询也会返回10个不同的Thumb图像
我正在使用PHP构建我的后端并使用ORM(Propel)。
我将不胜感激任何指导/建议。
答案 0 :(得分:6)
我在AWS上有针对库存摄影网站的架构解决方案,这些网站存储了数百万TB的图像,希望根据您的要求分享AWS中的一些最佳实践:
P1)将原始图像文件存储在S3标准选项
中P2)将可重现的图像(如拇指等)存储在S3 Reduced Redundancy选项(RRS)中以节省成本
P3)根据查询的复杂性,可以将包含S3 URL的图像的元数据存储在Amazon RDS或Amazon DynamoDB中。查询Amazon RDS中的条目。如果您的查询很复杂,通常的做法是将元数据存储在Amazon CloudSearch或Apache Solr中。P4)使用Amazon CloudFront向您提供低延迟的用户。
答案 1 :(得分:4)
您在计算成本时出现了一些基本的计算错误。将数据存储在关系数据库中永远不会比将其存储在完全优化的平面数据存储系统中便宜。
在S3中存储数据时,您只需按实际存储使用情况和实际网络使用情况收费。这是整个月平均的精确数据量,每GB / mth为0.095美元(从1TB / mth开始应用的较低层),加上每10000个外部GET请求0.004美元,再加上每GB数据传输到互联网0.120美元(较低层)从10TB / mth开始申请。
在RDS中存储数据时,您需要支付每小时的实例费用,以及每GB / mth的0.125美元的存储费用,以及底层存储的每IO操作费用。请求兆字节二进制数据的单个查询可以轻松触发数百或数千个IO操作 - 如果结果恰好被缓存,则不会触发。除了根据定义与执行的查询量和传输的数据量之间没有线性关系之外,很难预测IO使用情况。作为指导,我刚刚检查了一台LAMP服务器,大约是0.60负载,因为它是半夜,并且它在其存储磁盘上连续处理大约每秒50~150次IO操作(OS,swap和/ tmp在另一个上) ,虽然几乎没有做任何事情。
对于存储在RDS中的数据,实际检索数据仅表示您已将其传输到EC2实例或其他访问方式。然后,您仍然需要支付全部费用来实际处理请求并将数据从那里传输到互联网。
总结:将数据存储在RDS而不是S3中总是会更昂贵。很难预测它的价格是10倍,100倍还是1000倍。使用S3存储文件,这就是Simple Storage Service的用途。它也将远远超过 FAR 更高性能,特别是如果您将其绑定到CloudFront以利用其缓存边缘位置。
(提到的所有价格都假设亚马逊地区最便宜 - 其他地方的价格可能略有不同)
答案 2 :(得分:0)
将图像存储在SQL数据库中可能但不被视为最佳做法。
另一方面,如果您确实希望将图像存储在数据库中,则某些数据库可以更好地支持文件存储。例如,CouchDB,MongoDB和Riak。
这是一个权衡:好处是你的开发更“便携”,因为你可以开发/测试而不会产生亚马逊的成本。不利的一面是,当它增长时,你可以进行缩放。
大多数人宁愿利用S3,并在数据库中保留最少量的图像元数据。
为了提高效率,我应该将每种图片类型放在不同的表格中,还是不应该出问题?
如果您认为缩略图大小是固定的,则可以为每个图像存储一行,然后在代码中生成所有变体。 (即pic123 / orig.jpg pic123 / small.jpg,pic123 / medium.jpg)
如果您认为可能不经常添加尺寸,请为每种尺寸制作列。 (即插入图像值(name ='pic123','orig'='y','small'='y')。)