存储数百万张图像

时间:2012-11-19 16:14:40

标签: image mongodb filesystems cassandra storage

我需要为数以亿计的图像准备一个存储空间(现在我有7000万像素,这个数字还在增长)。每张图片都有约。 20KB。当然我可以将它们存储在文件系统中,但我很害怕inode的数量。我测试了MongoDB和Cassandra。它们都有缺点(我的HDD资源有限):

  • MongoDB - 磁盘空间消耗是原始数据大小的3倍
  • Cassandra - 磁盘空间消耗类似于原始数据的大小,但Cassandra需要大量的可用空间进行压缩过程

任何人都可以为这类问题提出适当的解决方案吗?

2 个答案:

答案 0 :(得分:4)

在我的生活中,我使用S3(包括Rackspace云文件)和MongoDB完成视频分发。

大多数人,没有第二眼,会选择S3,但我发现两者都有缺点。其中一个大问题是S3不是CDN,它实际上是一个特定区域内的冗余存储,没有复制到其他S3区域,这意味着您需要在S3之上使用类似cloudfront的东西来ping您的图像如果您要在您的网站上受到严重负担,请使用某种缓存。

S3还具有其他功能,使其更少CDN-ish和更多的存储仓库。话虽如此,对于不经常访问的文件,S3速度非常快。

这个双层当然会产生复杂性,例如维护。不仅如此,CDN还可以用于TTL,即使现在很多CDN都有边缘清除功能,但它们仍然不是100%确定无法访问文件的方法。

因此,由于设置和访问(应该删除的文件的可能访问),这可能会非常快速地花费很多。

这是MongoDB 可以获胜的地方。 MongoDB可以根据您的情况实际上更便宜,因为您可以在AWS上使用一大堆微实例来实际保存您的信息,为这些实例添加现场实例预留(便宜)以及您需要的所有内容是一台机器上的大磁盘。

天啊,你甚至可以使用S3来存储图像,然后使用MongoDB作为云端替代品。

如果要将图像ping到不同的区域,只需在该目标区域中创建一些点实例,然后让MongoDB复制它的数据。您也可以使用复制执行一些kool工作,以确保只有该区域中经常访问的文件才会放在该区域中。

所以我不会抛出MongoDB(甚至是Cassandra),而是我会在两者之间进行均值测试。

修改

作为关于S3定价的补充说明,如果您将文件存储在RR(减少冗余)中,那么价格减半(约)会使S3非常便宜,但是,您仍然存在S3不是CDN的问题。 / p>

进一步编辑

由于我真的只是从@cirrus的回答中继续,我实际上会重新评估你的问题,这在上面有点回答。

作为一个例子,Youtube实际上将所有图像存储在随后分发的单台计算机上,因此他们可以轻松管理200米缩略图......以及......每天很容易从文件系统中查看很多视图。所以我认为你对文件系统的担心被高估了。

至于哪个数据库更好......我不知道,这取决于你的测试。

我的意思是您的问题的答案取决于您的方案和预算以及您的硬件和资源,即如果您拥有AWS服务器,这将是一个完全不同于室内服务器专用的答案。

答案 1 :(得分:1)

为什么不将它们粘贴在亚马逊的S3或Azure Blob存储中?它们更适合您,并且您不会遇到空间或内存问题,并且您不必管理部署。