在NoSQL存储中存储图像

17
我们的应用程序将通过HTTP提供大量小型缩略图大小的图像(大小约为6-12KB)。我被要求调查是否使用NoSQL数据存储是一个可行的解决方案。理想情况下,我们希望我们的数据存储具有容错性和分布式特性。
在NoSQL存储中存储二进制大对象是一个好主意吗?哪种NoSQL存储适合这样做?此外,NoSQL是否是我们问题的好解决方案,还是更好地将图像存储在文件系统中,并直接从Web服务器提供服务(附带说明,CDN目前对我们不可用)?
5个回答

15

将图片存储在数据库中还是文件系统中有时会引起一些“圣战”类型的争论;每一方都认为他们的做法是正确的。一般来说:

将图片存储在数据库中:

  • 更容易在一个地方管理备份/复制所有数据。
  • 有助于保持数据的一致性和完整性。您可以将BLOB字段设置为不允许为空,但您无法防止外部文件被删除。(虽然这对NoSQL不适用,因为没有传统的约束条件)。

将图片存储在文件系统中:

  • 文件系统专为提供文件服务而设计。让它发挥作用。
  • 数据库通常是应用程序的瓶颈。减轻它所承担的负荷越多,就越好。
  • 更容易在CDN上提供服务(您提到这在您的情况下并不适用)。

我倾向于使用文件系统,因为它的可扩展性更好。但根据您的项目大小,任何选择都可能很好。 对于NoSQL,差异甚至更加不明显。


2
问题是关于在分布式键值存储中存储 blobs。文件系统不具备容错性或分布式性,因此实际上没有可比性。 - Seun Osewa
3
根据文件系统的不同,它可以同时具备容错性和分布式特点 - 例如 MogileFS、Hadoop DFS 和 GlusterFS。 - El Yobo
1
这些并不完全是文件系统。 - Eugeniu Torica

11

Mongo DB 可以很好地为您服务。我还没有用它来处理二进制大对象 (blobs),但这里有一篇很不错的 FLOSS Weekly 播客采访,采访了 Mongo DB 团队的 Michael Dirolf,他在其中解答了这种用例。


你可以跳过那个播客的前13分钟 :) - Reza S

4
我在为一个个人项目寻找类似的解决方案时,发现了Riak,对我来说,这似乎是一个解决此问题的惊人解决方案。基本上,它将每个文件的指定副本分布到网络中的服务器上。它被设计成这样一个服务器进出都没什么大不了的系统。离开的服务器上所有的副本都会分布到其他服务器上。
通过正确的配置,Riak可以处理整个数据中心崩溃的情况。
哦,还有商业支持可用。

3
很明显,CDN是一个很好的选择。既然不可行,我认为你最好的选择是在两个或更多负载均衡器(如F5)后面拥有自己的私有数据中心(无论对你来说意味着什么),以实现容错和负载平衡。这将是你最容易管理的系统,你可以根据硬件预算获得尽可能多的容错性。你不需要任何新的软件专业知识,只需使用XCOPY即可。
如果要实现真正的容错性,你需要地理分散,否则你就会受到任何挖掘机的影响。
(Gravatars?)

1
CDN加上NoSQL数据库作为源是一个很好的组合。我已经看到有几次成功地使用了MongoDB(及其GridFS模块)来实现这一点。 - dm.

2
如果你在Python环境中,考虑使用y_serial模块:http://yserial.sourceforge.net/ 不到10分钟,你就可以以压缩形式存储和访问你的图像(实际上是任意Python对象,包括网页) - NoSQL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接