在我的系统中,用户可以上传非常大的文件,我需要将其存储在Couchbase中。我不需要这么大的对象来保存在内存中,但是我希望它们始终可以从/向磁盘读/写。这些文件是只读的(从不修改)。用户可以上传,删除,下载,但永远不会更新。对于某些技术限制,我的系统无法将这些文件存储在文件系统中,因此必须将它们存储到数据库中。
我做了一些研究并发现一篇文章[1]说将大型对象存储在数据库中通常是一个坏主意,特别是对于Couchbase,但同时提供了一些建议:创建一个低的二级桶RAM配额,调整价值/完全驱逐政策。我担心的是作者提到的20Mb的限制。我的文件会比那些文件大得多。
将大型文件存储到Couchbase而不将其保留在内存中的最佳方法是什么?是否可以提高20Mb的限制以防万一?我应该创建一个具有极低RAM配额和完全驱逐策略的辅助存储桶吗?
[1] http://blog.couchbase.com/2016/january/large-objects-in-a-database
答案 0 :(得分:1)
通常,Couchbase工程师建议您不要在Couchbase中存储大文件。相反,您可以将文件存储在某个文件服务器(如AWS或Azure Blob等)上,而是将文件的元数据存储在Couchbase中。
答案 1 :(得分:1)
有一个couchbase blog posting可以详细说明如何在Couchbase中执行您想要做的事情。
这是特定于Java API的,但一般方法可以与任何Couchbase SDK一起使用,我实际上正在使用节点SDK做一些非常相似的事情。
我不能代表沙发基地工程师推荐的内容,但他们已经发布了这篇博客文章,详细说明了如何做到这一点。
对于大型文件,您肯定希望拆分成块。不要尝试将大文件存储在一个文档中。我正在研究的方法是将数据块化,并将其插入文件sha1哈希下。所以文件“Foo.docx”将被分成4个块,即“sha1 | 0”,“sha1 | 1”等等,其中sha1是文档的哈希值。这还可以启用一个设置,您可以在其中以多个不同的名称存储相同的文件。
权衡 - 如果您可以选择与Amazon S3集成,那么您可能会更好。一般来说,数据库中的分块数据就像我描述的那样实现起来要比使用像Amazon S3这样的东西要复杂得多,而且速度要慢得多。但这必须与其他要求进行交换,例如您是否可以在S3中保留敏感文件,或者是否要处理维护文件系统及其相关缩放。
所以这取决于你的要求。如果你想要速度/性能,不要把你的文件放在Couchbase中 - 但你能做到吗?当然。我自己完成了,上面的博客文章描述了一种单独的方法。
根据您的需要,您可能希望实施各种有趣的扩展。例如,如果您通常存储具有相似内容的许多不同文件,则可以实施阻止策略以允许单个存储许多常见段,以节省空间。像S3这样的其他解决方案会很乐意存储副本副本的副本,并且会兴高采烈地向你收取大量资金。
编辑作为后续行动,this other Couchbase post谈论为什么在数据库中存储可能不是一个好主意。需要考虑的合理事项 - 但这又取决于您的应用程序特定要求。 “使用S3”我认为这通常是一个很好的建议,但对每个人都不适用。
答案 2 :(得分:0)
MongoDB可以选择执行这种操作,并且几乎所有驱动程序都支持它:GridFS。您可以在Couchbase中执行GridFS之类的操作,以制作具有固定大小的Blob的元数据集合(存储桶)和块集合。 GridFS允许您更改每个文件的Blob大小,但是所有Blob的大小必须相同。文件大小存储在元数据中。典型的块大小为2048,并且限制为2的幂。
您不需要文件的内存缓存,您可以将块排队等待下载到应用服务器中。您可能想先在Mongo上尝试GridFS,然后查看是否可以使其适应Couchbase,但是总会有这样的情况:https://github.com/couchbaselabs/cbfs
答案 3 :(得分:0)
这是最佳实践:不要将沙发数据库作为主数据库,而是将其视为同步数据库,因为无论您如何将数据分成小块,它都会超过20MB的大小,从长远来看会打击您,因此诸如MySQL之类的强大数据库位于中间,将有助于保存这些大数据,然后将其用于实时和仅用于同步。