【问题标题】:Is GridFS fast and reliable enough for production?GridFS 对于生产来说是否足够快速和可靠?
【发布时间】:2011-03-25 16:41:34
【问题描述】:

我开发了一个新网站,我想使用 GridFS 作为所有用户上传的存储,因为与普通文件系统存储相比,它提供了很多优势。

nginx 服务的 GridFS 的基准表明,它不如 nginx 服务的普通文件系统快。

Benchmark with nginx

是否有人已经在生产环境中使用 GridFS,或者会将其用于新项目?

【问题讨论】:

标签: mongodb nginx gridfs


【解决方案1】:

我在我们的一台服务器上使用 gridfs,该服务器是价格比较网站的一部分,具有可观的流量统计数据(每天约有 25,000 名访问者)。服务器没有太多 ram,2gigs,甚至 cpu 也不是很快(Core 2 duo 1.8Ghz),但服务器有足够的存储空间:raid 0 配置中的 10Tb(sata)。服务器所做的工作很简单:

我们的比价器上的每个产品都有一个图像(根据我们的产品数据库,大约有 1000 万个产品),服务器的工作是下载图像,调整它的大小,将其存储在 gridfs 上,然后将其交付给访问者浏览器...如果它不存在于网格中...或者...如果它已经存储在网格中,则将其传递给访问者浏览器。因此,这可以称为“传统 cdn 架构”。

自该服务器启动并运行以来,我们已在该服务器上存储和处理了 400 万张图像。调整大小和存储的东西是由一个简单的 php 脚本完成的……但可以肯定的是,python 脚本或类似 java 的东西可能会更快。

当前数据大小:11.23g

当前存储大小:12.5g

指数:5

索引大小:849.65m

关于可靠性:这是非常可靠的。服务器不加载,索引大小还可以,查询很快

关于速度:当然,它不如本地文件存储快,可能慢 10%,但足够快,即使在需要处理图像时也可以实时使用,在我们的例子中,非常依赖于 php .维护和开发时间也减少了:删除单个或多个图像变得如此简单:只需使用简单的删除命令查询数据库。另一个有趣的事情:当我们重新启动我们的旧服务器时,使用本地文件存储(数千个文件夹中的数百万个文件),它有时会挂起几个小时,因为系统正在执行文件完整性检查(这真的需要几个小时......)。 gridfs 不再有这个问题,我们的图像现在存储在大 mongodb 块中(2gb 文件)

所以...在我看来...是的,gridfs 足够快速和可靠,可以用于生产。

【讨论】:

  • 我很震惊有人会使用 raid 0 作为生产网站上的主存储。即使有良好的备份,增加存储故障的可能性也是为提高性能付出的相当高昂的代价。
  • 我们使用raid 0,因为在我们的特殊情况下,图像数据可能是不稳定的。图片丢失没关系,我们会从商家网站重新下载。务实地,我们可以认为我们的服务器是一个简单的图像缓存服务器。
  • 但是您正在积极增加失败的机会(初始驱动器故障系数乘以主轴数)。如果您需要的写入多于读取,则 Raid 10 将是理想的选择;如果您需要的读取多于写入,则 Raid 5/6 将是理想的选择。
  • @ManuEidenberger 为什么要使用 GridFS 来存储宁愿存储在 MongoDB 文档中的图像?我猜你没有达到 16 MB 的文档大小限制。并且将图像作为 BLOB 存储在 MongoDB 文档中会更有效,因为您不需要 MongoDB 文档之上的 GridFS 层。
  • 我也很好奇@ArnaudBouchez 的问题。是否有一些好处使您选择 GridFS 而不是简单地将其作为二进制数据存储在文档中,Manu?谢谢!
【解决方案2】:

但请注意修复大型数据库 - 我们正在开发一个新系统,mongo 并没有完全退出,修复 7TB GridFS 看起来需要 130 小时。

因此,我想我会考虑切换到 OpenStack Swift 或 Ceph。 不过,在那之前它还不错。并且 nginx-gridfs 模块很贴心。

【讨论】:

  • 那你过得怎么样?
【解决方案3】:

如前所述,它可能不如普通文件系统快,但与 ordinary filesystems 相比,它为您提供了优势,我认为值得放弃一点速度。

最终,通过分片,您可能会达到一个点,但是 GridFS 存储实际上成为比普通文件系统和单个节点更快的选择。

【讨论】:

    【解决方案4】:

    除非您知道自己在做什么,否则我不建议您使用 gridfs。 GridFS 只是抽象层,它将文件拆分为块并将文件存储在两个集合中。更多文件 - 更多开销。如果您希望文件大小几乎相同,不超过 32M 左右 - 您是对的。 不要尝试在 gridfs 上存储大文件。为什么?

    1. 不同语言的驱动程序在读取文件的一小部分时可能会读取整个文件(例如块)。
    2. 修改文件可能会影响所有块并增加数据库负载 如果您的文件系统正在成长,您将不得不决定对 gridfs 进行分片。当心!分片初始化时不保证一致性!

    如果您考虑读取加载项目 - 考虑将文件直接加载到文档中(如果大小为 16M 或更小)或选择另一个 clusterfs,并将文件名/inode 链接到您的逻辑。

    希望这会有所帮助。

    【讨论】:

    • 我对 GridFS 还很陌生,但据我了解,GridFS 不仅仅是一个使文件数量翻倍的抽象层。 GridFS 提供了一种利用 MongoDB 的复制和分片功能的简单方法。我相信其他人也提到文件存储在 2GB 的块中,我想这会减少文件的总数,特别是如果有人有大量的小图像。
    • +1 你是对的。使用 GridFS 存储即使更小的文件也不会受益。如果您的文件可以存储在 MongoDB 文档中(即 compose.io/articles/gridfs-and-mongodb-pros-and-cons
    【解决方案5】:

    mdirolf 的 nginx-gridfs 模块非常棒,而且设置起来相当容易。我们在paint.ly 的生产中使用它来服务所有的画,到目前为止没有任何问题。

    【讨论】:

    • paint.ly 似乎不再可用。 :(
    猜你喜欢
    • 2013-06-27
    • 1970-01-01
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2012-09-10
    • 2018-10-12
    相关资源
    最近更新 更多