Riak性能-意外结果

16

最近我尝试了一下Riak。初始设置比我想象的要容易得多。现在我有一个由3个节点组成的集群,为了测试而在同一个虚拟机上运行。

我承认,我的虚拟机硬件配置非常降低(1 CPU,512 MB RAM),但我仍然对Riak的性能缓慢感到相当惊讶。

Map Reduce

通过玩弄map reduce,我在一个bucket中有大约2000个对象,每个对象大小约为1k-2k,格式为json。我使用了以下map函数:

function(value, keyData, arg) {
    var data = Riak.mapValuesJson(value)[0];

    if (data.displayname.indexOf("max") !== -1) return [data];
    return [];
}

仅执行 HTTP 请求并返回结果就需要超过 2 秒的时间,不包括客户端代码反序列化 JSON 结果所需的时间。移除三个节点中的两个似乎略微提高了性能,使其降至接近 2 秒以下,但这对我来说仍然太慢了。

这是正常现象吗?这些对象的字节大小并不大,而一个存储桶中有 2000 个对象也并不算多。

插入

批量插入约 60,000 个与上述相同大小的对象需要很长时间,实际上并没有真正工作。

我的脚本在插入对象到 riak 时在大约 40,000 个左右死亡,并表示无法再连接到riak 节点。在 riak 日志中,我发现了一个错误消息,指示节点已用尽内存并死机。

问题

这是我第一次尝试 riak,所以肯定有可能是我弄错了什么。

  • 有哪些设置可以调整?
  • 硬件设置是否太受限制?
  • 也许我用于与 riak 交互的 PHP 客户端库是限制因素?
  • 在同一台物理机上运行所有节点相当愚蠢,但如果这是一个问题-我该如何更好地测试 riak 的性能
  • Map Reduce 真的那么慢吗?我在 riak 邮件列表中读到了 Map Reduce 对性能的影响,但如果 Map Reduce 很慢,您应该如何实现几乎实时需要的数据“查询”?我知道 riak 不像 redis 一样快。

如果有经验丰富的 riak 用户能够帮助回答这些问题,那将对我非常有帮助。


1
为什么不在Riak邮件列表上询问呢?大多数Basho员工都在那里,可以帮助您解决问题。 - Joshua Partogi
我知道这个问题已经有答案了,但是要强调一下:“RAM是最重要的因素之一 - RAM的可用性直接影响您应该使用哪种Riak后端(请参见下面的问题),并且还需要进行复杂的MapReduce查询。”来源:http://basho.com/top-five-questions-about-riak-2/ - scape
3个回答

31
这篇回答有些晚了,但我想指出Riak的MapReduce实现主要是为了与链接一起使用,而不是整个存储桶。
实际上,Riak的内部设计在很大程度上是针对不使用整个存储桶进行优化的。这是因为存储桶不被视为连续表格,而是分布在节点集群中的键空间。这意味着随机访问非常快 - 可能是O(log n),但不要引用我 - 而串行访问非常、非常、非常慢。按顺序访问,按照Riak目前的设计,必然意味着要询问所有节点的数据。
顺便说一下,在Riak术语中,“存储桶”令人困惑和失望地没有按照你想象的方式实现。Riak所称的桶实际上只是一个命名空间。在内部,只有一个存储桶,而键以存储桶名称作为前缀存储。这意味着无论你的存储桶大小是多少,枚举单个大小为n的存储桶中的键需要m时间,其中m是所有存储桶中键的总数。
这些限制是Basho的实现选择,不一定是设计缺陷。Cassandra实现了与Riak完全相同的分区模型,但支持对大量键进行高效的顺序范围扫描和MapReduce。Cassandra还实现了真正的存储桶。

你能详细说明一下Cassandra如何实现真正的“桶”吗? - Carlo Pires
自Riak 1.0以来,可以使用多个后端,这对于需要不同存储引擎或不同配置的情况非常有用。或者在这种情况下,如果您需要遍历桶中的所有条目而不会因其他桶中的条目而受到性能惩罚,则可以使用多个后端。使用多个后端,m 将减少到相同后端所有桶中键的总数。 - Ulrik
@CarloPires:在Cassandra中,单独的keyspace(类似于Riak的buckets)被分别存储和索引。 - Alexander Staubo
我想知道为什么他们不能保持一个单独的桶=>键映射,以便将m的值降至约n。查阅键列表,然后使用那个固定的键列表获取记录。你可以通过其他数据存储(如Redis)单独执行此操作,但似乎在Riak内部执行这个常见场景更好。 - d11wtq

4
一条建议是,随着时间的推移和几个新版本的Riak出现,我建议不要再依赖于完整的桶映射/减少操作,因为这不是一种优化的操作,而且很有可能有其他方法可以优化你的映射/减少,使您不必查看太多的数据来提取所需的内容。
在较新版本的Riak中,现在提供了次要索引功能,这肯定是一个好的选择。在你想要找到的对象上放置一个索引(可能命名为“ismax_int”,值为0或1)。您可以在微秒内映射/减少二级索引,而完整的桶扫描需要多秒才能考虑。

2

我没有Riak的直接经验,但有一些与其类似的Cassandra的工作经验。

首先,性能可能会很大程度上取决于可用的核心数量和内存。这些系统通常具有重度流水线处理和并发处理,并受益于许多核心。4个或以上核心和4GB或以上内存将是一个很好的起点。

其次,MapReduce是为批处理而设计的,而不是实时查询。

Riak和所有类似的键值存储都是为高写入性能、简单查找的高读性能而设计的,没有复杂的查询。

仅供比较,单节点的Cassandra(6核心,6GB)可以每秒执行20,000个单独的插入操作。


MapReduce MapReduce是为批处理而设计的,不适用于实时查询。完全正确。- 谢谢,这正是我想知道的:我是在错误地使用MapReduce还是它只是不适合我尝试做的事情。非常感谢您的见解! - Max
1
实际上,MapReduce是为批处理而发明的,但它只是一种计算的抽象模型。Riak的实现已经被设计用于实时查询,但仅限于链接跟踪,而不是整个存储桶。 - Alexander Staubo

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