使用NoSQL数据库作为文件存储的建议以及优缺点分析

3
我们正在评估替代静态文件存储的选择(该存储在多个地理位置中托管)。
我们使用Microsoft.NET平台(C#,ASP.NET,WEB API,SQL SERVER)。
我们想要将数字资产,大多数是二进制(AI,PSD,JPG,PNG,PDF,XLS,DOC ...)文件存储在任何NoSQL DB上。
对于图像文件,它可以包含缩略图(小尺寸)和原始艺术品(大文件:范围从300 MB到超过1 GB)。
缩略图将显示在网页上,但原始版本将作为附件提供,并具有编辑选项(用户可以下载原始版本并使用相应程序进行编辑和更新版本)。
每个缩略图和原始版本都需要存储多个版本。
我们不会在第三方平台(如Amazon S3,Azure)和CDN上托管这些数字资产。
这些数字资产可以根据用户系统配置托管在不同的地理环境中。 (美国用户可以将服务器/数据库存储在美国,欧洲或亚洲)。
每个存储都需要复制。
我们正在研究MongoDB。是否有人可以根据上述假设或其他替代方案提出优缺点建议?
一些MongoDB研究结果如下:
磁盘空间消耗比原始数据大小大3倍
可以通过-oplogSize参数减少空间消耗
如果我们尝试读取块并将其流式传输到浏览器,则速度比从静态文件存储中读取慢6倍。
复制不是双向的,它作为主服务器和从服务器工作。
我已经创建了原型来从静态文件系统中读取数字资产并将其存储到MongoDB GridFS中的默认块中。在将缩略图和原始版本存储到MongoDB时,哪种方法更好?由于缩略图始终小于16MB,但原始版本可能超过16MB,因此默认情况下是否应将所有图像资产存储在GridFS中?
我可以预见根据内容类型创建不同的数据库,例如:一个用于PDF,Excel,Word,另一个用于Image。
如何在不同的服务器之间进行复制?
如何在不同区域的不同MongoDB实例之间存储它?
我非常感谢任何意见。
谢谢。

1
你对ACID方面有什么要求?除了NoSQL解决方案外,你是否调查过使用SQL Server 2008(及更新版本)的FILESTREAM功能? - Lucero
为什么要将文件本身存储在数据库中?为什么不将文件存储在S3上并将路径存储到数据库中呢?有特定的原因吗?将文件存储在数据库中的问题之一是,它使得难以实时操作文件,例如:调整大小、压缩等。 - DarthVader
@Lucero 谢谢你的回复。我们将使用 HttpHandler 或 Web API 从 MongoDB 流式传输缩略图到基于 web 的应用程序中,因此它应该始终可用。我们确实使用 SQL Server 2008R2,但尚未评估将其存储为 BLOB。在有数千张图片的情况下,它如何扩展?另外,我们不会将同一台服务器用作数据库和数字资产,所以我们需要获取多个 SQL Server 许可证,这可能增加成本。 - Rajul
@DarthVader 感谢您的回复。所有数据库和文件服务器都需要托管在客户环境中。这就是为什么S3不是一个选择的原因。 - Rajul
@user1810385,它的扩展性非常好,这似乎非常适合FILESTREAM的设计。所有数据都存储在文件系统中,并且它的扩展性与您的文件系统一样(通常是NTFS,但也支持SAN),这对于许多文件来说非常好。它还支持SQL Server复制。请查看此白皮书 - Lucero
@Lucero 当然可以。我会看一下的。谢谢。 - Rajul
1个回答

0
一些MongoDB研究表明,磁盘空间消耗比原始数据大小大3倍。可以通过-oplogSize参数减少空间消耗。如果我们尝试读取分块并流式传输到浏览器,则速度可能比从静态文件存储中读取慢6倍。复制不是双向的,并且它作为主控和从属工作。你是否尝试过存储数据或只是在某处找到了一些信息?无论使用哪种数据库,与纯文件存储相比,都存在额外开销。为什么?好吧,你有索引和元信息。

MongoDB是一个共享无强制一致性数据库。因此,您可以将数据写入一个节点,然后进行复制。但是,您可以使用WriteConcerns(http://docs.mongodb.org/manual/core/write-operations/#write-concern)来等待并确保您的数据已被写入到副本集中的多个节点、大多数节点等。通过复制,您可以在不停机的情况下进行滚动升级,并且使用分片非常容易进行扩展。并使用分片标记将文档“固定”到特定的分片上。请参见:http://www.kchodorow.com/blog/2012/07/25/controlling-collection-distribution/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接