存储数百万张图像[关闭]
Posted
技术标签:
【中文标题】存储数百万张图像[关闭]【英文标题】:Storage for millions of images [closed] 【发布时间】:2012-11-19 16:14:39 【问题描述】:我需要为数亿张图片准备存储空间(现在我有 7000 万张,而且这个数字还在增长)。每个图像大约有。 20kB。当然,我可以将它们存储在文件系统中,但我害怕 inode 的数量。我已经测试过 MongoDB 和 Cassandra。它们都有缺点(我的硬盘资源有限):
MongoDB - 磁盘空间消耗是原始数据大小的 3 倍 Cassandra - 磁盘空间消耗与原始数据的大小相似,但 Cassandra 需要大量可用空间来进行压缩过程任何人都可以为此类问题提出适当的解决方案吗?
【问题讨论】:
目前我的文件系统只有 1.8 亿个 inode(以及大约 6000 万个空闲 inode)。这意味着我将在几个月内用完空闲的 inode。如果别无选择,也许我应该用更大的最大 inode 数重新格式化我的文件系统。 在文件系统解决方案的情况下 - 通过 apache 网络服务器。在“nosql/database”解决方案的情况下 - 通过我们自己的服务部署到我们应用程序的服务层 【参考方案1】:在我的生活中,我使用 S3(包括 Rackspace 云文件)和 MongoDB 完成了视频分发。
大多数人会毫不犹豫地选择 S3,但我发现两者都有其缺点。最大的问题之一是 S3 不是 CDN,它实际上是特定区域内的冗余存储,不会复制到其他 S3 区域,这意味着您将需要在 S3 之上使用 cloudfront 之类的东西来 ping 您的图像如果您要在您的网站上获得严重的负载,请使用某种缓存。
S3 还具有其他功能,使其不像 CDN 那样多,而更像是一个存储仓库。话虽如此,对于不常访问的文件,S3 的速度非常快。
这种双层当然会产生复杂性,例如维护。不仅如此,CDN 还可以在 TTL 上工作,尽管现在许多 CDN 都具有边缘清除功能,但它们仍然不是 100% 确保您的文件不可访问的方法。
因此,由于设置和访问(也应该删除的文件的可能访问),这可能很快就会变得非常昂贵。
这是 MongoDB 可以获胜的地方。根据您的情况,MongoDB 在这里实际上可能更便宜,因为您可以在 AWS 上使用一大堆微型实例来实际保存您的信息,为这些实例添加现场实例预留(非常便宜)以及您所需要的一切是单机上的大磁盘。
天啊,您甚至可以使用 S3 来存储图像,然后使用 MongoDB 作为云端替代品。
当您想将图像 ping 到不同的区域时,您只需在该目标区域中创建几个 Spot 实例,然后让 MongoDB 复制它的数据。您也可以对复制做一些很酷的事情,以确保仅将来自该区域的经常访问的文件放置在该区域中。
所以我不会抛弃 MongoDB(甚至是 Cassandra),而是会在两者之间进行经济状况调查。
编辑
作为关于 S3 定价的附加说明,如果您将文件存储在 RR(减少冗余)中,那么价格会减半(大约),这使得 S3 非常便宜,但是,您仍然存在 S3 不是 CDN 的问题。
进一步编辑
因为我真的只是从@cirrus 的回答中继续,我实际上会重新评估你上面已经回答的问题。
例如,Youtube 实际上将他们所有的图像存储在单个计算机上,然后分发,因此他们可以轻松地管理 200m 的缩略图和......嗯......每天从文件系统轻松获得很多视图。所以我认为你对文件系统的担心被高估了。
至于哪个数据库更好...我不知道,这取决于您的测试。
我的意思是,您的问题的答案取决于您的场景、预算、硬件和资源,即如果您有 AWS 服务器,这将是与专用内部服务器完全不同的答案。
【讨论】:
【参考方案2】:为什么不将它们保存在 Amazon 的 S3 或 Azure Blob 存储中?它们更合适,您不会有空间或内存问题,也不必管理部署。
【讨论】:
+1 因为它会扩展以适应您可能需要的几乎任何尺寸,并且是一个强大的环境。您可能会考虑在另一个域中提供指向该文件的“cdn”式链接,以避免 cookie 开销等。 目前我不知道我们应该期望多大的流量,所以我们无法计算 S3 解决方案的成本。但是,是的,我知道从技术角度来看这是完美的解决方案:)。 无论如何,您都可以根据最佳/最坏情况大小进行比较,我认为一旦您在服务器、RAID10、管理等方面花费了成本,您会发现 S3 总体上会比 MongoDB 便宜。您最终可以使用自己的专用场构建比 S3 更便宜且具有相同可靠性和性能的东西,但这只有在您的数量非常非常大时才具有经济意义。 S3 的优势在于您可以从 0 开始,并以可预测的成本一路向上扩展。以上是关于存储数百万张图像[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
当您在 LAMP 服务器上拥有数百万用户时,存储和获取图像的最快和最有效的方法是啥?