【问题标题】:Riak database fails after a short periodRiak 数据库在短时间内失败
【发布时间】:2013-06-23 21:38:14
【问题描述】:

我创建了一个简单的 erlang 应用程序,它定期收集所需的数据并将其放入 riak 数据库中。

当我启动我的应用程序时,它运行顺利.. 但一段时间后它卡住了,因为对 riak 数据库的 PUT 请求变得太慢了.. 这是来自我的应用程序的日志:

2013-06-26 12:44:09.090 [info] <0.60.0> data processed in [16476 ms]
2013-06-26 12:45:51.472 [info] <0.60.0> data processed in [18793 ms]
...
2013-06-26 12:57:28.138 [info] <0.60.0> data processed in [15135 ms]
2013-06-26 13:07:01.484 [info] <0.60.0> data processed in [488420 ms]
2013-06-26 14:03:11.561 [info] <0.60.0> data processed in [3370075 ms]

在 riak 崩溃日志中,我可以看到很多消息,例如

2013-06-26 17:06:20 =CRASH REPORT====
crasher:
initial call: riak_kv_index_hashtree:init/1
pid: <0.13660.7>
registered_name: []
exception exit: {{{badmatch,{error,{db_open,"IO error: ./data/anti_entropy/
    433883298582611803841718934712646521460354973696/MANIFEST-000004: 
    Cannot allocate memory"}}}, [{hashtree,new_segment_store,2,
    [{file,"src/hashtree.erl"},{line,499}]},
    {hashtree,new,2,[{file,"src/hashtree.erl"},{line,215}]},
    {riak_kv_index_hashtree,do_new_tree,2,
    [{file,"src/riak_kv_index_hashtree.erl"},
    {line,426}]},{lists,foldl,3,[{file,"lists.erl"},
    {line,1197}]},{riak_kv_index_hashtree,
    init_trees,2,[{file,"src/riak_kv_index_hashtree.erl"},
    {line,368}]},{riak_kv_index_hashtree,init,1,
    [{file,"src/riak_kv_index_hashtree.erl"},
    {line,225}]},{gen_server,init_it,6,[{file,"gen_server.erl"},{line,304}]},
    {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]},
    [{gen_server,init_it,6,[{file,"gen_server.erl"},{line,328}]},
    {proc_lib,init_p_do_apply,3,[{file,"proc_lib.erl"},{line,227}]}]}
ancestors: [<0.955.0>,riak_core_vnode_sup,riak_core_sup,<0.129.0>]
messages: []
links: []
dictionary: []
trap_exit: false
status: running
heap_size: 1597
stack_size: 24
reductions: 593
neighbours:

我可以在 Amazon AWS 和本地虚拟机上看到相同的行为。我的虚拟机很小,只有 512-1024 mb。AWS 是 Micro,所以它的内存量是一样的。

目前没有集群。只是一个运行 Riak 和我的应用程序的节点。

我检查了 riak 文档,他们建议做的基本事情是增加 ulimit 和更新 sysctl。所以,我的服务器 ulimit 显示:ulimit -n 65536 AND sysctl 按照建议更新。

我试过bitcask和eleveldb,但结果是一样的。

目前,我无法弄清楚发生了什么问题以及为什么 riak 无法分配内存.. 谢谢。

【问题讨论】:

  • 每个 put 请求有多大?每秒有多少个?
  • @ObsessiveSSOℲ Put 请求很小。实际上它是 json 格式的小数组。每秒大约有 20-30 个请求。
  • 嘿!为什么要减去我?
  • 任何人都可以对帖子投反对票。这很可能是因为它(从选民的角度来看)研究不力或写得不好。没有一个用户可以控制这一点。我建议你改进你的帖子,也许你能得到点赞。
  • @Muzaaya Joshua 谢谢你.. 我会尝试从 Riak 社区获得帮助。不幸的是,他们更喜欢使用邮件列表,使用起来不太舒服..

标签: erlang riak


【解决方案1】:

对于 Riak 节点来说,1GB RAM 是相当小的,而且当你也在其中运行你的应用程序时更是如此。 Riak 中的默认设置针对的是具有更多 RAM 和处理能力的环境,因此您需要调整默认的 settings 才能使其正常工作。以下是一些可能会有所帮助的建议:

  1. 由于您只有一个节点,请通过设置禁用 AAE {anti_entropy, {off, []}}
  2. 减小环尺寸。这将限制您向外扩展的能力,但很可能需要它才能使其正常工作。合适的起始值可能是 16,但也可能低至 8。
  3. 更改默认存储桶属性,使您拥有 n_valrwdw rw 全部设置为 1,否则您会将每条记录的多个副本写入磁盘。当您向外扩展并添加更多节点时,需要增加这些节点。
  4. 由于 bitcask 要求将所有密钥保存在内存中,因此使用 leveldb 作为后端可能是个好主意。但是,您很可能需要显着减小写入缓冲区和缓存的大小。您可能需要进行试验才能找到合适的级别。
  5. 由于这个环境很可能太小而无法运行 mapreduce,您也可以将 ma​​p_js_vm_countreduce_js_vm_count 配置参数设置为 0 以节省一些额外的内存。

【讨论】:

  • 谢谢!非常详细和有用的答案!实际上,即使第 (1) 点也解决了我的问题。一旦我禁用了 anti_entropy,Riak 即使在 512 mb VM 上也能完美运行。由于目前我不使用集群,因此我可以禁用该 anti_entropy。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2016-02-02
  • 1970-01-01
相关资源
最近更新 更多