erlang - desventajas - La base de datos Riak falla después de un corto período
riak ventajas y desventajas (1)
Creé una aplicación erlang simple que periódicamente recopila los datos requeridos y los coloca en una base de datos riak.
Cuando inicio mi aplicación, funciona sin problemas ... pero después de un período de tiempo, las solicitudes PUT de riak se vuelven demasiado lentas. Son registros de mi aplicación:
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]
En los registros de bloqueo de riak puedo ver muchos mensajes como
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:
Puedo ver el mismo comportamiento en Amazon AWS y la máquina virtual local. mis máquinas virtuales son bastante pequeñas 512-1024 mb. AWS es micro, por lo que tiene la misma cantidad de memoria.
No hay clúster actualmente. Solo un nodo con Riak y mi aplicación ejecutándose en él.
Revisé la documentación de riak y las cosas básicas que recomiendan hacer es aumentar ulimit y actualizar sysctl. Entonces, mi servidor ulimit muestra: ulimit -n 65536 AND sysctl actualizado como se recomienda.
He probado bitcask y eleveldb, pero el resultado es el mismo.
Actualmente, no puedo entender qué está roto y por qué Riak no puede asignar memoria ... Gracias.
1 GB de RAM es bastante pequeño para un nodo Riak, y más aún dado que también está ejecutando su aplicación allí. La configuración predeterminada de Riak está orientada a entornos con mucha más memoria RAM y más potencia de procesamiento, por lo que deberá ajustar la configuración predeterminada para que funcione. Aquí hay algunos consejos que pueden ayudar:
- Como solo tiene un nodo, desactive AAE configurando {anti_entropy, {off, []}} .
- Reduce el tamaño del anillo. Esto limitará su capacidad para escalar, pero es muy probable que sea necesario para que funcione. Un valor inicial adecuado podría ser 16, pero posiblemente incluso tan bajo como 8.
- Cambie las propiedades predeterminadas del depósito para que tenga n_val , r , w , dw y rw, todo en 1, ya que de lo contrario estará escribiendo múltiples copias de cada registro en el disco. Estos deberán aumentarse cuando se escala y agrega más nodos.
- Como bitcask requiere que todas las claves se conserven en la memoria, probablemente sea una buena idea utilizar leveldb como back-end. Sin embargo, lo más probable es que necesite reducir significativamente el tamaño de los búferes de escritura y la memoria caché. Es posible que deba experimentar para encontrar un nivel adecuado.
- Como es muy probable que este entorno sea demasiado pequeño para poder ejecutar mapreduce de todos modos, también puede establecer los parámetros de configuración map_js_vm_count y reduce_js_vm_count en 0 para guardar algo de memoria adicional.