将数以亿计的小图像存储到键/值存储或其他 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 Tyrant
、Voldemort
)以获得更高的性能并带来更好的备份支持是否是个好主意?
【问题讨论】:
您的目标是解决备份/同步问题 - 还是前端性能问题?我会想象它们可能是相互竞争的目标。 【参考方案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 响应显著增加