Riak数据库在短时间内失败

cyr*_*llk 2 erlang riak

我创建了一个简单的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]
Run Code Online (Sandbox Code Playgroud)

在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:
Run Code Online (Sandbox Code Playgroud)

我可以在Amazon AWS和本地虚拟机上看到相同的行为.我的VM非常小512-1024 mb.AWS是Micro,所以它具有相同的内存量.

目前没有集群.只需单个节点就可以运行Riak和我的应用程序.

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

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

目前,我无法弄清楚什么是破碎的,为什么riak无法分配内存..谢谢.

Chr*_*ist 7

对于Riak节点,1GB RAM非常小,甚至更多,因为您还在那里运行应用程序.Riak中的默认设置针对具有更多RAM和处理能力的环境,因此您需要调整默认设置才能使其正常工作.以下是一些可能有用的提示:

  1. 由于您只有一个节点,请通过设置{anti_entropy,{off,[]}}来禁用AAE .
  2. 减小戒指尺寸.这将限制您向外扩展的能力,但最有可能是为了使其发挥作用.一个合适的起始值可能是16,但可能甚至低至8.
  3. 更改默认存储桶属性,以便将n_val,r,w,dwrw都设置为1,否则您将将每个记录的多个副本写入磁盘.当您向外扩展并添加更多节点时,需要增加这些.
  4. 由于bitcask要求将所有密钥保存在内存中,因此将leveldb用作后端可能是个好主意.但是,您很可能需要显着减小写缓冲区和缓存的大小.您可能需要尝试找到合适的级别.
  5. 由于此环境很可能太小而无法以任何方式运行mapreduce,因此您还可以将map_js_vm_countreduce_js_vm_count配置参数设置为0,以便节省一些额外的内存.