将数亿个小图像存储到键/值存储或其他nosql数据库中是一个好主意吗?

时间:2010-11-12 11:12:31

标签: mongodb scalability nosql

我正在开发一个网络系统来处理一大堆小图像,大约1亿张50kb~200kb的图像,处理ReiserFS

目前,这些大量的小文件非常difficult to backup and sync

我的问题是,如果将这些小图像存储到键/值存储或其他nosql数据库(例如GridFS (Mongodb)Tokyo TyrantVoldemort以获得更高性能并提供更好的备份支持?

3 个答案:

答案 0 :(得分:3)

首先,请看一下:Storing a millon images in the filesystem。虽然它不是关于备份,但它是对手头主题的一个有价值的讨论。

是的,大量的小文件很讨厌;它们占用了inode,需要空间来存放文件名和c。 (并且需要时间来备份所有这些元数据)。基本上听起来你得到了文件的服务;如果你在nginx上运行它,前面有一个varnish,那么你很难让它更快。在其下添加数据库只会使事情变得更复杂;在备份方面也是如此。唉,我建议更加努力地采用就地FS备份策略。

首先,您是否尝试rsync -az - 开关(分别是归档和压缩)?它们往往非常有效,因为它不会一次又一次地传输相同的文件。

或者,我的建议是将tar + gz转换为多个文件。在伪代码中(假设你将它们放在不同的子文件夹中):

foreach prefix (`ls -1`):
    tar -c $prefix | gzip -c -9 | ssh -z destination.example.tld "cat > backup_`date --iso`_$prefix.tar.gz"
end

这将创建一些.tar.gz文件,这些文件很容易转移而不需要太多开销。

答案 1 :(得分:1)

如果您的所有图像或至少是最常访问的图像都适合内存,那么mongodb GridFS可能会胜过原始文件系统。你必须尝试找出答案。

当然,根据您的文件系统,将图像分解成文件夹会影响图像。在过去,我注意到ReiserFS更适合在单个目录中存储大量文件。但是,我不知道那是否仍然是这项工作的最佳文件系统。

答案 2 :(得分:1)

另一种方法是将图像存储在SVN中,实际上Web服务器上的图像文件夹是图像的svn沙箱。这简化了备份,但对性能的净影响为零。

当然,请确保将Web服务器配置为不提供.svn文件。