C# 关于使用NoSQL DB作为文件存储的建议,以及利弊;欺骗

C# 关于使用NoSQL DB作为文件存储的建议,以及利弊;欺骗,c#,mongodb,gridfs,C#,Mongodb,Gridfs,我们正在评估静态文件存储(托管在多个地理位置之间)的替代方案 我们使用的是Microsoft.NET平台(C#、ASP.NET、WEB API、SQL SERVER) 我们希望在任何NoSQL数据库上存储数字资产,主要是二进制文件(AI、PSD、JPG、PNG、PDF、XLS、DOC…) 对于图像文件,它可以包含缩略图(小尺寸)到原始艺术品(大文件:范围从300 MB到超过1 GB) 缩略图将出现在网页上,但原件将作为附件提供,并带有编辑选项(用户可以下载原件并使用相应的程序进行编辑并更新版本

我们正在评估静态文件存储(托管在多个地理位置之间)的替代方案

  • 我们使用的是Microsoft.NET平台(C#、ASP.NET、WEB API、SQL SERVER)
  • 我们希望在任何NoSQL数据库上存储数字资产,主要是二进制文件(AI、PSD、JPG、PNG、PDF、XLS、DOC…)
  • 对于图像文件,它可以包含缩略图(小尺寸)到原始艺术品(大文件:范围从300 MB到超过1 GB)
  • 缩略图将出现在网页上,但原件将作为附件提供,并带有编辑选项(用户可以下载原件并使用相应的程序进行编辑并更新版本)
  • 每个缩略图和原件都需要存储多个版本
  • 我们不会在第三方平台(如AmazonS3、Azure)和CDN上托管这些数字资产
  • 根据用户系统配置,此数字资产可以托管在不同的地理环境中。(美国用户可以存储美国、欧洲或亚洲的服务器/db)
  • 每个存储都需要复制
为此,我们正在调查MongoDB。是否有人可以根据上述假设或任何其他备选方案提出利弊建议

MongoDB的一些研究表明

  • 磁盘空间消耗是原始数据大小的3倍
  • 可以通过-oplogSize参数减少空间消耗
  • 如果我们尝试将块和流读取到浏览器,速度可能比从静态文件存储读取慢6倍
  • 复制不是双向的,它可以作为主复制和从复制
我已经创建了从静态文件系统读取数字资产的原型,并将其存储到MongoDB GridFS的默认块中。将缩略图和原件存储到MongoDB的更好方法是什么?因为缩略图总是小于16MB,但原始图像不能大于16MB,所以默认情况下我应该将所有图像资源存储在GridFS上吗

我可以设想根据内容类型创建不同的数据库,例如:一个用于PDF、Excel、Word,另一个用于图像

  • 我们如何在不同的服务器之间进行复制
  • 如何将其存储在不同地区的不同MongoDB实例中
我非常感谢您的任何意见

多谢各位

MongoDB的一些研究表明

磁盘空间消耗是原始数据大小的3倍 如果尝试读取,则通过-oplogSize参数减少空间消耗 块和流到浏览器的速度可能比 从静态文件存储读取它。复制不是双向的 它是主人和奴隶

您是否尝试存储数据或只是在某处找到一些信息?如果您使用的是数据库(无论是哪个数据库),而不是普通的文件存储,那么总有一个开销。为什么?你有索引和元信息


mongodb是一个无共享的强一致性数据库。因此,将数据写入一个节点,然后进行复制。但您可以使用WriteConcerns()等待,因此请确保您的数据已写入复制集中的多个、多数等节点。通过复制,您可以在不停机的情况下进行滚动升级,而且使用分片进行扩展也非常容易。并使用碎片标签将文档“固定”到特定碎片。请参见此处:

您的要求是什么?除了NoSQL解决方案之外,您是否调查过SQL Server 2008(及更新版本)FILESTREAM的使用?为什么要将文件本身存储在数据库中?为什么不将文件存储在S3上并存储到数据库的路径?有什么特别的原因吗?将文件存储在数据中的问题之一是,它使操作变得困难,即:动态调整大小、压缩文件。@Lucero感谢您的回复。我们将使用HttpHandler或Web API将缩略图从MongoDB流式传输到基于Web的应用程序。因此,它应该随时可用。我们确实使用SQLServer2008R2,但尚未评估是否将其存储为BLOB。在我们有数千张图片的地方,它是如何放大的?此外,我们不会将同一台服务器用作数据库和数字资产,因此我们必须获得多个sql server许可证,这可能会增加成本。@DarthVader感谢您的回复。所有的数据库和文件服务器都需要托管在客户端环境中。这就是为什么S3不是一个选项。@user1810385,它的伸缩性非常好,这似乎非常适合FILESTREAM的设计。然后,所有数据都存储在文件系统中,它的扩展性与文件系统一样好(通常是NTFS,但也支持SAN),这对于许多文件来说都非常好。它还支持SQL Server复制。看一看。