Estamos buscando desarrollar una herramienta para capturar y analizar datos de flujo de red, de los cuales reunimos enormes cantidades de. Cada día capturamos alrededor de ~ 1.400 millones de registros de flujo que se verían así en formato json:
{
"tcp_flags": "0",
"src_as": "54321",
"nexthop": "1.2.3.4",
"unix_secs": "1352234521",
"src_mask": "23",
"tos": "0",
"prot": "6",
"input": "105",
"doctets": "186",
"engine_type": "0",
"exaddr": "2.3.4.5",
"engine_id": "2",
"srcaddr": "9.8.7.6",
"dst_as": "12345",
"unix_nsecs": "752265174",
"sysuptime": "2943529544",
"dst_mask": "24",
"dstport": "80",
"last": "2943523241",
"srcport": "52672",
"dpkts": "4",
"output": "111",
"dstaddr": "6.5.4.3",
"first": "2943517993"
}
Nos gustaría poder realizar búsquedas rápidas (menos de 10 segundos) en el conjunto de datos, muy probablemente en intervalos de tiempo estrechos (intervalos de 10 a 30 minutos). También queremos indexar la mayoría de los puntos de datos para poder hacer búsquedas en cada uno de ellos rápidamente. También nos gustaría tener una vista actualizada de los datos cuando se ejecutan las búsquedas. Sería genial permanecer en el mundo del código abierto, pero no nos oponemos a buscar soluciones patentadas para este proyecto.
La idea es mantener aproximadamente un mes de datos, que serían ~ 43.2 mil millones de registros. Una estimación aproximada de que cada registro contendría aproximadamente 480 bytes de datos equivaldría a ~ 18.7 terabytes de datos en un mes, y tal vez tres veces más que con los índices. Finalmente, nos gustaría aumentar la capacidad de este sistema para almacenar billones de registros.
Hemos evaluado (muy básicamente) couchbase, cassandra y mongodb en la medida de lo posible como candidatos para este proyecto, sin embargo, cada uno propone sus propios desafíos. Con couchbase, la indexación se realiza a intervalos y no durante la inserción de los datos, por lo que las vistas no están actualizadas, los índices secundarios de cassandra no son muy eficientes para devolver resultados, ya que generalmente requieren escanear todo el clúster en busca de resultados, y mongodb parece prometedor, pero parece ser mucho más difícil de escalar ya que es maestro / esclavo / fragmentado. Algunos otros candidatos que planeamos evaluar son elasticsearch, mysql (no estoy seguro de si esto es aplicable) y algunas bases de datos relacionales orientadas a columnas. Cualquier sugerencia o experiencia del mundo real sería apreciada.