【发布时间】:2021-07-29 04:35:36
【问题描述】:
我知道怎么做,但我想知道它是否有效。据我所知,MongoDB 有非常高效的集群,我可以灵活地控制集合和它们所在的服务器。唯一的问题是文件的大小和通过 MongoDB 访问它们的速度。
我应该探索 Apache Hadoop 之类的东西,或者如果我智能地集群 MongoDB,我会得到类似的访问速度结果吗?
【问题讨论】:
标签: mongodb hadoop file-upload store ceph
我知道怎么做,但我想知道它是否有效。据我所知,MongoDB 有非常高效的集群,我可以灵活地控制集合和它们所在的服务器。唯一的问题是文件的大小和通过 MongoDB 访问它们的速度。
我应该探索 Apache Hadoop 之类的东西,或者如果我智能地集群 MongoDB,我会得到类似的访问速度结果吗?
【问题讨论】:
标签: mongodb hadoop file-upload store ceph
不管怎样,我做了一点调查。简短的结论是:如果您需要存储用户头像,您可以使用 MongoDB,但前提是它是单个头像(您不能在 MongoDB 中存储很多 blob)并且如果您需要存储视频或只是很多重文件,那么你需要像 CephFS 这样的东西。
我为什么这么认为?问题是,当我在慢速实例上测试 MongoDB 和媒体文件时,重达 10mb(通常约为 1 兆字节)的文件在 3000 毫秒内返回。这是一个令人无法接受的漫长时间。当有很多文件(100+)时,它可能会变得很痛苦。真的很痛苦。
Ceph 专为存储文件而设计。存储 PB 级信息。这正是我们所需要的。
您如何在实际项目中实现这一点?如果您使用 MongoDB(Mongoose)的 OOP 实现,您只需向访问 Ceph 的数据库对象添加方法并执行您需要的操作即可。您可以制作“加载文件”、“删除文件”、“计数”等方法,然后像往常一样将它们一起使用。不要忘记维护 Ceph,根据需要添加服务器,一切都会完美运行。文件本身只能通过您的 Web 服务器访问,而不是直接访问,即当用户需要提供文件并将 Ceph 的响应返回给用户时,Web 服务器应该向 Ceph 发出请求。
我希望我能帮助的不仅仅是我自己。我会把 Ceph 添加到我的标签中。祝你好运!
【讨论】:
GridFS 是为了方便而提供的,它并非旨在成为终极二进制 blob 存储平台。
MongoDB 对其存储的每个文档都有 16 MB 的限制。例如,这与许多允许存储更大值的关系数据库不同。
由于许多应用程序都处理大型二进制 blob,因此 MongoDB 解决此问题的方法是 GridFS,其工作原理大致如下:
因此,乍一看,问题就解决了——应用程序可以直接存储任意大的 blob。然而,深入挖掘,GridFS 存在以下问题/限制:
尽管存在这些问题,但 GridFS 对于许多用例来说可能是一个很好的解决方案:
【讨论】:
好的做法是将图片上传到某个地方(您的服务器或云),然后只将图片url 存储在MongoDB 中。
【讨论】: