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

Posted

技术标签:

【中文标题】将数以亿计的小图像存储到键/值存储或其他 nosql 数据库是个好主意吗?【英文标题】:Is it a good idea to store hundreds of millions small images to a key/value store or other nosql database? 【发布时间】:2011-05-09 00:28:50 【问题描述】:

我正在开发一个 Web 系统来处理一组非常大的小图像,大约 1 亿张 50kb ~ 200kb 的图像,正在处理 ReiserFS

现在,非常difficult to backup and sync 那些大量的小文件。

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

【问题讨论】:

您的目标是解决备份/同步问题 - 还是前端性能问题?我会想象它们可能是相互竞争的目标。 【参考方案1】:

首先,看看这个: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 文件,这些文件可以轻松传输而无需太多开销。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

如果您的所有图像,或者至少是访问次数最多的图像都可以放入内存,那么 mongodb GridFS 的性能可能会优于原始文件系统。你必须试验才能发现。

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

【讨论】:

以上是关于将数以亿计的小图像存储到键/值存储或其他 nosql 数据库是个好主意吗?的主要内容,如果未能解决你的问题,请参考以下文章

在不超过 inode 或硬盘空间的情况下存储大量 jpeg 图像(Python)

没有数据集或数据阅读器如何将数据库值存储在其他对象中

启用版本控制后,Amazon S3 对存储桶请求的 HTTP 503 响应显著增加

如何将控件的 BackColor(或其他属性)绑定到存储在 DataSource 中的字符串值?

MonoTouch - 上传/保存图像(或访问图库图像)

我需要将值存储到int类型的变量,但int是不够的?