为什么要使用文档存储而不是常规文件存储?

克拉默65

我将构建一个Web服务,其中将存储大量图像和PDF。为了存储此文件,我可以选择将文件存储为常规文件,并将它们的文件名以及可能的标题,注释等记录在数据库中。另一方面,我还可以使用文档存储,例如Cassandra或MongDB。鉴于我没有使用文档存储的经验,因此我不确定为什么要使用该选项。

据我了解,文档存储的优点主要是可伸缩性和复制可能性,而使用简单文件的主要优点(至少对我而言)是其简单性。

您还会说其他哪些原因不利于选择一个?欢迎所有提示!

马库斯·W·马尔伯格

好吧,从您的描述中,我想到了几件事:

我将存储大量的图像和PDF。

好的,让我们假设每个用户将要存储大约10 MB,这实际上并不多。现在,假设您有10000个用户。这仅是100GB的数据,没问题,您可以轻松地将其存储在文件系统中(它有其他缺点,但稍后会介绍更多)。现在,假设您的应用程序很受欢迎,您的用户数乘以10。现在,我们有1TB的数据,即使在最大的磁盘上,我们也应该开始寻找扩展的方法,而对于EBS,您已经很难了限制。您可以选择扩展的方法是设置群集文件系统(这并不容易管理),或者使用网络文件系统进行手动分区。现在,如果这些服务器之一发生故障,会发生什么?自动故障转移?不幸的是,您必须自己设置一个高可用性解决方案。易于设置冗余吗?倒霉 整合两者吗?这不是一件容易的事,您确实需要知道自己在做什么。

使用MongoDB,向外扩展要容易得多(尽管要正确地进行扩展并不容易)。如果您知道自己在做什么,则可以相当快地建立复制的分片群集。分片群集是分布在一个到数百个甚至数千个节点上的存储,这实质上意味着读写分布在整个群集上,并且群集共享其资源,从而可以存储数据PB。由于运行数百或数千台群集时,群集中的一台计算机很可能发生故障,因此MongoDB附带了一种自动故障转移机制,称为副本集。因此,一个分片至少包含两个数据承载节点,当其中一个发生故障时,另一个将自动接管。

我从将文件存储在MongoDB中看到的另一个好处是:无论如何您都必须访问数据库,而且我看不到询问数据库文件可能在哪里,等待数据库响应然后访问文件的意义。系统(首先进行所有必要的检查,以防访问失败)在我可以首先从数据库将文件发送回给我时检索文件。

将元数据存储在数据库和文件系统中的文件中的另一个细微问题是,保持元数据和实际文件之间的一致性要困难得多。毕竟,数据存储在两个未连接的系统中。

这就是我要做的事情:如果极有可能文件大于16MB(MongoDB中BSON文档的限制),我将使用MongoDB的GridFS并存储对各自所有者的引用在单个文件的元数据中在某些情况下,将对文件的引用存储在所有者文档中可能是合理的。

如果单个文件几乎没有机会超过16MB的限制,则可以使用标准的MongoDB集合来存储文件。

一些建议,以防您决定使用MongoDB:

  • 如果是商业项目,明智的做法是至少租用MongoDB DBA一段时间。尽管MongoDB似乎非常容易,但仍有一些警告需要处理。由于这些通常取决于个人情况,因此在这里我不能给出太多一般性建议。
  • 尽早计划扩展策略如果有最小的机会打破硬件限制,我建议从具有单个分片的分片群集开始。
  • 始终具有由至少具有两个数据承载节点的一个副本集和一个仲裁器组成的各个分片(根据经验:更多的数据承载节点会更好。)否则,您将没有自动故障转移,维护群集将始终导致停机或数据不可用。取决于您的写关注设置,万一您的分片不包含副本集且目标分片已关闭,数据甚至可能在写操作期间静默丢失。再说一次:群集的碎片总是由副本集组成!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么我需要在 Firebase 远程配置中存储配置设置而不是使用常规的 Firestore 文档?

来自分类Dev

苹果为什么要使用分配而不是弱者来存储代表?

来自分类Dev

为什么要使用重复的嵌套键更新Redux存储?

来自分类Dev

为什么要使用Maven存储库管理器

来自分类Dev

为什么要使用字符串而不是直接方法调用来触发Redux存储中的操作?

来自分类Dev

为什么要使用命名管道而不是文件?

来自分类Dev

为什么要使用命名管道而不是文件?

来自分类Dev

为什么这么多 Android 游戏要求完全访问文件而不是使用内部存储?

来自分类Dev

为什么 AWS 存储桶文件 URL 使用 HTTP 而不是 HTTPS?

来自分类Dev

在Akka Testkit中,为什么要使用事件而不是常规方法来获取参与者状态?

来自分类Dev

laravel存储库-为什么需要调用接口而不是直接调用存储库文件?

来自分类Dev

为什么要使用Express而不是AngularJS?

来自分类Dev

为什么要使用ImageIcon而不是Image?

来自分类Dev

为什么要使用Runnable而不是Thread?

来自分类Dev

为什么要使用移位而不是for循环?

来自分类Dev

为什么要使用Char而不是String?

来自分类Dev

为什么要使用fillRect而不是translation?

来自分类Dev

为什么要使用资源而不是路由?

来自分类Dev

为什么要使用isinstance()而不是type()?

来自分类Dev

为什么Maven的文档包使用JAR而不是ZIP文件?

来自分类Dev

CentOS,我们可以使用哪些存储库,为什么要使用它们?

来自分类Dev

分配值时为什么要使用数组存储位置?

来自分类Dev

为什么要使用链接到stdin的文件描述符,而不是直接使用stdin?

来自分类Dev

为什么可移动USB存储不能以常规USB记忆棒的形式显示在启动器或文件中?

来自分类Dev

为什么要使用Django的collectstatic而不是直接从静态目录中直接提供文件?

来自分类Dev

为什么要使用随机字符串作为文件名而不是逻辑名称?

来自分类Dev

我是否需要使用JSON Web令牌令牌的会话存储?为什么不仅仅使用cookie?

来自分类Dev

为什么使用虚函数而不是常规函数?

来自分类Dev

为什么gzip使用CRC而不是常规的哈希算法?

Related 相关文章

  1. 1

    为什么我需要在 Firebase 远程配置中存储配置设置而不是使用常规的 Firestore 文档?

  2. 2

    苹果为什么要使用分配而不是弱者来存储代表?

  3. 3

    为什么要使用重复的嵌套键更新Redux存储?

  4. 4

    为什么要使用Maven存储库管理器

  5. 5

    为什么要使用字符串而不是直接方法调用来触发Redux存储中的操作?

  6. 6

    为什么要使用命名管道而不是文件?

  7. 7

    为什么要使用命名管道而不是文件?

  8. 8

    为什么这么多 Android 游戏要求完全访问文件而不是使用内部存储?

  9. 9

    为什么 AWS 存储桶文件 URL 使用 HTTP 而不是 HTTPS?

  10. 10

    在Akka Testkit中,为什么要使用事件而不是常规方法来获取参与者状态?

  11. 11

    laravel存储库-为什么需要调用接口而不是直接调用存储库文件?

  12. 12

    为什么要使用Express而不是AngularJS?

  13. 13

    为什么要使用ImageIcon而不是Image?

  14. 14

    为什么要使用Runnable而不是Thread?

  15. 15

    为什么要使用移位而不是for循环?

  16. 16

    为什么要使用Char而不是String?

  17. 17

    为什么要使用fillRect而不是translation?

  18. 18

    为什么要使用资源而不是路由?

  19. 19

    为什么要使用isinstance()而不是type()?

  20. 20

    为什么Maven的文档包使用JAR而不是ZIP文件?

  21. 21

    CentOS,我们可以使用哪些存储库,为什么要使用它们?

  22. 22

    分配值时为什么要使用数组存储位置?

  23. 23

    为什么要使用链接到stdin的文件描述符,而不是直接使用stdin?

  24. 24

    为什么可移动USB存储不能以常规USB记忆棒的形式显示在启动器或文件中?

  25. 25

    为什么要使用Django的collectstatic而不是直接从静态目录中直接提供文件?

  26. 26

    为什么要使用随机字符串作为文件名而不是逻辑名称?

  27. 27

    我是否需要使用JSON Web令牌令牌的会话存储?为什么不仅仅使用cookie?

  28. 28

    为什么使用虚函数而不是常规函数?

  29. 29

    为什么gzip使用CRC而不是常规的哈希算法?

热门标签

归档