mapreduce - example - riak kv
¿Cuál es la forma más eficiente de almacenar series de tiempo en Riak con lecturas pesadas? (2)
Agregando a la respuesta de @ macintux.
Basho ha tenido algunos clientes que han usado riak para las métricas de series de tiempo. Boundary tiene una agradable charla sobre cómo usan Riak con su software de monitoreo de red. Recopilan datos en diferentes períodos de tiempo (1 m, 5 m, 15 m) para su análisis. También tienen una serie de publicaciones en el blog sobre las lecciones aprendidas durante la implementación de este sistema.
Kivra también tiene una buena diapositiva sobre cómo usan los datos de series temporales con riak.
Puede enrollar sus datos en algún tipo de longitud de tiempo arbitraria, luego leer el rango que necesita emitiendo constantes K / V, y luego reconstruir la imagen más grande / reducir en su aplicación.
Mi enfoque actual:
- Tengo una clase de dominio - Solicitud
- Cada aplicación en mi sistema se almacena en el depósito de "aplicaciones" en la tecla APPLICATION_KEY
Además de los metadatos de la aplicación almacenados en este depósito, cada aplicación tiene su propio depósito llamado "time_metrics / APPLICATION_KEY" donde almaceno series de tiempo de una manera:
KEY - timestamp / VALUE - algunos atributos
Mi preocupación es la eficiencia de las consultas realizadas en un intervalo de tiempo específico para la aplicación determinada. Actualmente, para obtener series de tiempo de un intervalo de tiempo específico y eventualmente hacer algunas reducciones, tengo que hacer un mapa / reducir todo el segmento "time_metric / APPLICATION_KEY" , que lo que he encontrado no es el caso de uso recomendado para Riak Map / Reduce .
Mi pregunta: ¿cuál sería la mejor estructura de db para este tipo de sistema y qué tan eficientemente lo consultan?
Si tiene capacidad informática extra y sabe de antemano qué claves necesita, sin duda puede usar MapReduce de Riak, pero a menudo recuperar las claves y ejecutar su procesamiento en el cliente será tan rápido (y no afectará su clúster).
Algunas ideas generales:
- Enrolla tus datos en bloques más grandes
- Si le preocupa perder datos si su cliente se bloquea al almacenarlo en búfer, siempre puede almacenar los datos a medida que llegan.
- Idea similar: almacenar los datos tal como llegan, luego recuperarlos y enrollarlos en ciertos intervalos
- Puede caducar automáticamente los datos una vez que esté seguro de que se almacenan de manera confiable en bloques más grandes, utilizando los procesadores Bitcask o Memory.
- El backend de memoria es bastante útil (lo que permite RAM) para cualquier información que solo necesita almacenarse durante un período de tiempo limitado
- Relacionado: no tengas miedo de almacenar copias múltiples de tus datos para facilitar la lectura / informes más tarde
- Múltiples espacios de tiempo (bloques de 5 y 15 minutos, por ejemplo)
- Múltiples formatos de informes
Habiendo dicho todo eso, si está haciendo solicitudes directas de clave / valor (es ideal para poder calcular siempre las claves que necesita, en lugar de indexar o buscar), Riak puede soportar cargas de tráfico muy pesadas, por lo que no lo haría recomiendo pasar demasiado tiempo creando mecanismos de almacenamiento alternativos a menos que sepa que va a enfrentar problemas de latencia.