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

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

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

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

【问题讨论】:

  • 您的目标是解决备份/同步问题 - 还是前端性能问题?我会想象它们可能是相互竞争的目标。

标签: mongodb scalability nosql


【解决方案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 更适合将大量文件存储在单个目录中。但是,我不知道这是否仍然是最适合这项工作的文件系统。

      【讨论】:

        猜你喜欢
        • 2019-05-25
        • 2010-11-15
        • 2010-10-30
        • 1970-01-01
        • 2011-12-03
        • 2016-05-01
        • 1970-01-01
        • 2015-01-04
        • 2018-10-17
        相关资源
        最近更新 更多