GridFS:它为我们提供了什么

时间:2016-07-11 09:59:03

标签: mongodb replication nosql

我正在阅读“七周七个数据库”。能否请您解释下面的文字:

  

分布式系统的一个缺点可能是缺少单一系统   连贯的文件系统。假设您运营一个用户可以上传的网站   他们自己的形象。如果您在多个Web服务器上运行多个   不同的节点,您必须手动复制上传的图像   每个Web服务器的磁盘或创建一些替代的中央系统。   Mongo通过自己的分布式文件系统来处理这种情况   GridFS的。

  • 为什么需要复制手动上传的图片?他们是否意味着某些服务器将拥有Linux,其中一些是Windows?

  • 所有复制的数据存储都倾向于实现自己的文件系统吗?

2 个答案:

答案 0 :(得分:1)

在这种情况下,恕我直言,作者说明每个Web服务器都有自己的磁盘存储,而不是与其他人共享 - 有上传路径可能是/ home / server / app / uploads,因为它是服务器文件系统的一部分是根本不作为服务提供商的一种安全共享。要填充那些我们需要的脚本/作业,它将数据同步到幕后的其他地方。

这种情况可能是将GridFS与mongo一起使用的情况。

gridFS的工作原理:

  

GridFS将文件划分为多个部分或块1,然后存储每个文件   块作为单独的文档。默认情况下,GridFS使用块大小   255 kB;也就是说,GridFS将文件分成255 kB的块   最后一个块的例外。最后一个块只有大小   必要。同样,不大于块大小的文件   只有最后一块,只需要使用所需的空间加上一些空间   其他元数据。

回复评论: BSON是二进制格式,mongo具有用于复制集合数据的特殊复制机制(gridFS是一组特殊的2个集合)。它使用OpLog将差异发送到副本集中的其他服务器。 More here

欢迎任何评论!

答案 1 :(得分:1)

关于数据分发及其错综复杂的需要

让我们更详细地剖析一下这个例子。假设您有一个人们可以上传图像的Web应用程序。启动服务器,将映像保存到/home/server/app/uploads中的本地计算机,用户使用该应用程序。到目前为止,非常好。

现在,您的应用程序成为下一个重要的事情,您拥有数万个并发用户,而您的单个服务器根本无法再处理该负载。幸运的是,除了将图像存储在本地文件系统中之外,您还可以通过一种方式实现应用程序,以便轻松地建立另一个实例并在它们之间分配负载。但现在出现了问题:你的应用程序的第二个实例无法访问存储在第一个实例上的图像 - 这是件坏事。

有各种方法可以解决这个问题。我们以NFS为例。现在你的第二个实例可以访问图像,甚至可以存储新的图像,但这会将所有图像放在一台机器上,迟早会耗尽磁盘空间。

扩展存储容量很容易成为应用程序的非常昂贵的部分。这就是GridFS提供帮助的地方。它使用相当简单的MongoDB方法在多台机器上分配数据,这个过程称为sharding。基本上,它的工作原理如下:您可以通过MongoDB数据库驱动程序访问GridFS(以及其中包含的文件),而不是访问本地文件系统。

对于操作系统:通常,如果可能的话,我会避免在部署中混合使用不同的操作系统。如今,平均项目几乎没有理由这样做。我假设您指的是该文本的"不同节点" 部分。这仅涉及您涉及多台机器的事实。但它们完全可以运行相同的操作系统。

分片与复制

  

注意以下非常简化,因为详细说明会超出一本或多本书的范围。

你引用的摘录混合了两个概念,并且对于GridFS的工作原理还不够清楚。

让我们首先让两个涉及的概念更加清晰。 复制与RAID1大致相当:数据存储在两台或更多台机器上,每台机器都保存所有数据。

Sharding (也称为"数据分区")与RAID0大致相当:每台机器只保存一部分数据,尽管您可以访问整个数据集(在这种情况下为文件)透明,分布式存储系统负责查找您请求的数据(并在保存文件时决定存储数据的位置)

现在,MongoDB允许您使用混合形式,大致可与RAID10相媲美:数据在两个或多个分片之间分配("分区"或#34;分片") shard可能(并且几乎总是应该)由副本集组成,副本集是一组数量不均匀的MongoDB实例,它们都拥有相同的数据。这种混合形式称为"分片群集,复制因子为X" ,其中X表示non-hidden members per replica set

分片群集的优势在于不再存在单点故障:

  • 根据您的复制因素,一个或多个副本集成员可能会失败,并且群集仍在运行
  • 存在保存元数据的服务器(例如,哪些部分数据存储在哪个分片上)。这些被称为config servers。从MongoDB版本3.0.x(iirc)开始,它们自己形成一个副本集 - 如果一个节点出现故障,那就没什么问题了。
  • 您可以通过mongos sharded cluster query router访问分片群集,其中每个应用程序实例通常都有一个(通常与应用程序实例位于同一服务器上)。但是:大多数驱动程序可以被连接到多个mongos实例。因此,如果其中一个mongos实例失败,驱动程序将很乐意使用您配置的下一个。

另一个优点是,如果您需要添加额外的存储空间或具有比当前系统更多的IOPS,您可以添加另一个分片:MongoDB将负责在旧分片和新分片之间自动分发现有数据。有关如何完成此操作的详细信息,请参阅MongoDB文档中的introduction to Sharding

第三个优势 - 也是影响力最大的一个 - 是你可以在相对便宜的商品硬件上分发(和复制)数据,而在分片集群上提供GridFS优势的大多数其他技术都需要你有专业和昂贵的硬件。

缺点当然是这种设置只有在你有大量数据时才可行,因为设置分片集群需要很多机器:

  • 至少3个配置服务器
  • 至少一个分片,应该包含副本集。最小设置将是两个数据承载节点加上arbiter

但是:为了一般地使用GridFS,你甚至不需要副本集;)。 保持在上面的例子中:你的应用程序的两个实例都可以访问持有GridFS的同一个MongoDB实例。

所有复制的数据存储都倾向于实现自己的文件系统吗?

复制?不必要。例如,DRBD可以描述为"以太网上的RAID1"。

假设我们在上面有与上面相同的概念混合:分布式文件系统按照它们的定义实现文件系统。