在Riak中存储二进制数据的缺点是什么?

17

在Riak中存储二进制数据存在哪些问题(如果有的话)?

这是否影响了集群的可维护性和性能表现?

与使用分布式文件系统相比,使用Riak进行此操作的性能差异将是多少?

5个回答

12

除了 @Oscar-Godson 的出色回答之外,如果值超过50MBs,您可能会遇到问题。 Bitcask 最适合少量 KBs 的值。如果要存储大型值,您可能需要考虑替代的存储后端,例如 innostore

我没有存储二进制值的经验,但我们有一个中等规模的生产集群(5个节点,约100M个值,10多TB),我们经常看到插入和检索大小为数百KB的值相关的错误。在这种情况下,性能不稳定-有时它运行正常,有时它不运行正常-因此,如果您要测试,请在大规模环境下测试。

当运行 map-reduce 查询时,我们也会遇到大值问题-它们只是超时。但这可能与二进制值无关...(如@Matt-Ranney提到的)。

还请参见@Stephen-C的答案 here


嗨,Ben - 如果对象大小小于1MiB,您不应该遇到任何性能问题。如果您想在riak-users邮件列表上提供有关您的集群的信息,我们Bashos中的一位可以帮助诊断。请确保您已根据文档中的建议调整了系统。 - Luke Bakken

7
我唯一能想到的问题是存储大于50MB的二进制数据,他们建议不要这样做。Riak的整个重点就在于此:
另一个选择Riak的原因是数据建模方面的灵活性。Riak以内容无关的方式存储您告诉它的任何数据 - 它不强制表、列或引用完整性。这意味着您可以将二进制文件与JSON或XML等更透明的格式放在一起存储。
来源:Riak中的模式设计 - 介绍

1
请注意,约50MB的问题是由Erlang网络分发缓冲区的硬编码大小限制引起的,而不是Riak中的任何内容引起的。 - seancribbs
2
它是Erlang的默认设置,是否有原因?只是“最佳实践”,还是会导致性能问题? - Oscar Godson

4

Riak建议每个对象的最大大小为2MB。如果超过这个大小,建议使用Riak CS,它已经测试过可以存储长达5TB的对象(以1MB对象的形式存储在Riak中),或者将大型对象自然地分成2MB块,并通过键和后缀进行链接。


3
我个人没有注意到在Riak中存储图像和文档(包括DOC和PDF)等数据时出现任何问题。我没有性能数据,但如果我记得的话可能会收集一些。
值得注意的是,使用Riak可以使用Luwak,它提供了一个用于存储大文件的API。这非常有用。

Luwak是否随Riak的其余数据一起分布? - mikeal
此外,Luwak 是否通过 HTTP API 暴露?我只看到了 Erlang API。 - mikeal
1
据我所知,Luwak只是Riak上的一层,它为您处理数据分块。其他所有内容都是Riak的正常业务。 - Nick Campbell
1
我通过RiakJS使用Luwak,而在RiakJS中,它只支持HTTP API。 - Nick Campbell
1
Luwak具有HTTP API,并将数据分布在群集中。http://wiki.basho.com/Luwak.html - Matt Ranney

1

一个问题可能是,如果不是不可能的话,使用JavaScript map/reduce跨越二进制数据会很困难。你可能需要Erlang来解决这个问题。


1
在CouchDB中,有一个单独的API用于存储二进制数据(附件),专门处理这种情况。只有关于附件的元数据才会传输到map/reduce。 - mikeal
请查看Riak链接。您可以拥有一个适用于m/r的元数据对象,然后将链接添加到可选二进制对象中。 - Matt Ranney
链接如何将其他链接对象排除在Map/Reduce之外? - mikeal
你可以根据标签来过滤要包含的链接-请参阅http://wiki.basho.com/Links-and-Link-Walking.html。 - Nick Campbell

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