MongoDB - 将文件存储在数据库中还是外部存储?

MongoDB - Storing the files in DB or on external storage?

我们正在使用 MongoDB。在我们的应用程序中,我们需要为每个用户存储多个文件。我们的应用程序将部署在 AWS 上。我正在考虑使用以下选项之一来存储文件 -

  1. 将文件存储在 MongoDB 本身。我知道 MongoDB 的最大文档大小限制为 16 MB,但很可能我们的文件不会超过这个限制。
  2. 使用MongoDB的GridFS来存储文件。
  3. 使用 Amazon S3 存储文件,这些文件的链接将存储在 MongoDB。
  4. 在 AWS 上使用本地文件 system/EBS 卷。

以上哪种方法更好?在性能、可扩展性方面? 哪种方法更具可扩展性?我还想使用 CDN 来缓存文件。 我更喜欢 AWS S3,因为我可以使用 CDN 来缓存文件,我的文件存储将与数据库无关。此外,我的数据库大小不会显着增加,因为我将文件存储在数据库之外。

首先我只会在开发模式下使用本地文件系统,在生产模式下我会使用 GridFS 或 Amazon S3。

让我们把这句话说得更清楚。

第一点(将文件存储在MongoDB本身。)

  1. 如果您处理的图像很小或小于 16MB,您应该存储 他们在你的 collections.

对比

每次查询的时候,要知道查询的是所有的collection,所以会花一点时间(可以排除字段'images'来避免这种情况) .

第二点(使用MongoDB的GridFS存储文件。)

  1. 如果您处理的图像大于 (16MB>)
  2. 您可以添加元数据(我喜欢这个)。

看看 GridFs Docs

This article talk about pros and cons about using GridFs 也有帮助

还有when should I use GridFS?

第三点(使用Amazon S3)

我对S3不是很熟悉(我从没用过)。

但这是来自亚马逊文档 when should I use Amazon S3?

S3 is free to join, and is a pay-as-you-go sevice, meaning you only ever pay for any of the hosting and bandwidth costs that you use, making it very attractive for start-up, agile and lean companies looking to minimize costs.

On top of this, the fully scalable, fast and reliable service provided by Amazon, makes it highly attractive to video producers and marketers all over the world.

Amazon offers S3 as a hosting system, with pricing dependent on the geographic location of the datacenter where you store your videos.

四点(使用本地文件系统)

我只在测试我的应用程序时使用文件系统,我从不在生产中使用它,因为从我的 POV 来看,它的可扩展性不强。

我个人认为我会使用 GridFS,但我认为您必须分析您的应用程序的要求,然后知道使用哪个存储适配器

我认为这里最好的选择是 GridFS 和 S3;我自己会选择后者。将文件推送到 S3,然后将存储桶名称和文件密钥存储在 Mongo 文档中。除非您的业务或查询要求所有数据都必须出现在文档中,否则我认为这是最好的方法。

我已经在生产环境中使用过这个解决方案,它的扩展性非常好。对您的 Mongo collection 的影响很小,您不必担心在那里存储大量数据。只需存储密钥,让 S3 处理所有这些。您以后可以随时将它们存储在其他地方,因为您的系统相当 storage-agnostic.