EPS Kafka-Logstash; Dimensionamiento Indices Elasticsearch

Buenos días, pruebo a postear en Castellano porque las dudas que tengo ahora son mucho más abstractas y desconfío de mi capacidad de expresión en inglés.

Necesito contestarme a unas ciertas dudas que tengo acerca del comportamiento de un par cosas. ¿Podríais ayudarme por favor?

Logstash-Kafka-Logstash.

  • Logstash 1
    Para las maquinas que no permitan la comunicación con Kafka tengo un Logstash que realiza esta comunicación, esto funciona perfectamente. Envía a una buena velocidad, y se traga los picos con relativa tranquilidad.

    -¿Como puedo perfeccionar la eficacia de este output y de este Logstash en realidad?
    -¿Cuál es la configuración de tópics más eficiente¿ (Actualmente, para las versiones más grandes, nos planteamos la posibilidad de 2 tópics, un grupo de productores y uno de consumidores por cliente).

  • Logstash 2
    El segundo Logstash, es quien realizaría todos los mapeos y tendría RAM y procesador de sobra, pero tarda muchísimo en consumir los eventos almacenados en Kafka, incluso sin llevar acabo ningún mapeo ni filtro.
    He modificado el input, optando como hizo LinkedIn por el plugin pipe con el comando del consumidor de Kafka, y subiendo el autocommit a 1 minuto para que suba su rendimiento, pero incluso con recursos de sobra, no va al ritmo que desearía... y deja demasiados eventos en Kafka.

    -¿Cómo podría llevar al máximo a este Logstash para verificar la velocidad a la que es capaz de asimilar logs (obviando su integración con Kafka quizas)?
    -¿Cómo puedo perfeccionar esos plugins de entrada de Kafka?, porque es aquí donde más problemas le veo al SIEM...

Elasticsearch

El clúster con el que estoy practicando dispone de tres nodos maestros, tres de datos, y dos de cliente (para redundar Kibana). Funciona perfecto todo, pero tengo varias dudas al respecto:

  • Respecto al número de índices, tipos, shards y replicas.

Dos dudas:

-¿Cuál sería la configuración optima aquí para rentabilizar al máximo, tanto el tiempo de búsqueda como el almacenamiento, He de encontrar una buena relación de equilibrios en ambas, sobre todo para entornos AllInOne.
-¿Dispondríais de una relación índices-tipos-shards -> velocidad -> tamaño-almacenamiento? A pesar de todo lo que he leído, ando bastante confuso al respecto...
  • Respecto al número de datos agregados.

He leído debido a que no se pueden realizar joins en Elasticsearch, se deben realizar las búsquedas que impliquen varios documentos, (usuarios con mayor número de logins fallidos en todo nuestro sistema) de dos en dos, buscando primero al usuario X en nuestro índices de usuarios, y luego el número de logins que ha realizado. Y que la única forma de aumentar la eficiencia de búsqueda consistiría en añadir campos para evitar realizar este tipo de joins.

-¿Esto como maltrataría el tamaño del índice?
-¿De cuánto coste aproximado estaríamos hablando? es correcto, positivo ( y sobre todo asumible) aumentar el tamaño de los documentos indexados agregando datos de otros documentos para facilitar estas búsquedas multidocumentales?
  • Respecto a la compresión de los datos indexados.

Cuanto se estima que pueda pesar un índice de unos 100.000 millones de eventos (recogidos durante dos años), indexados por tres o cuatro campos, sin agregaciones de datos y comprimidos con "index.codec: best_compression".

Esta pregunta, se que es difícil de responder con un dato exacto, pero es que ahora mismo no se ni dar un numero estimado.

-¿Se podrían realizar re-indexaciones y re-compresiones para aligerar el índice? (Pero tienen que seguir pudiéndose realizar búsquedas sobre estos datos, aunque sean más costosas).
  • Logstash 1

-¿Como puedo perfeccionar la eficacia de este output y de este Logstash en realidad?
-¿Cuál es la configuración de tópics más eficiente¿ (Actualmente, para las versiones más grandes, nos planteamos la posibilidad de 2 tópics, un grupo de productores y uno de consumidores por cliente).

Aqui puedes encontrar informacion generica sobre esto: Just Enough Kafka for the Elastic Stack, Part 1 | Elastic Blog

  • Logstash 2

-¿Cómo podría llevar al máximo a este Logstash para verificar la velocidad a la que es capaz de asimilar logs (obviando su integración con Kafka quizas)?

Utilizando el Generator plugin input y ver hasta que cantidad de mensajes por segundo Logstash puede enviar. Tambien sino creando documentos fakes en Kafka y viendo hasta donde se mantiene de forma buena el pipeline.

-¿Cómo puedo perfeccionar esos plugins de entrada de Kafka?, porque es aquí donde más problemas le veo al SIEM...

Por que ves problemas con esto? No entiendo bien esta consulta

Elasticsearch

Dos dudas:

-¿Cuál sería la configuración optima aquí para rentabilizar al máximo, tanto el tiempo de búsqueda como el almacenamiento, He de encontrar una buena relación de equilibrios en ambas, sobre todo para entornos AllInOne.
-¿Dispondríais de una relación índices-tipos-shards -> velocidad -> tamaño-almacenamiento? A pesar de todo lo que he leído, ando bastante confuso al respecto...

Esto es algo que tienen que probar. Para distintos casos, distinta necesidad de configuracion por shards/indices. Generalmente el default (5/1) NO FUNCIONA correctamente ni es el ideal. Asi que pensando en indexing-rate y query-rate y entendiendo donde estan los shards/indices (en que nodos) pueden entender cuales nodos estan haciendo el trabajo, y que tanto pueden escalar de esa forma.

  • Respecto al número de datos agregados.
    He leído debido a que no se pueden realizar joins en Elasticsearch, se deben realizar las búsquedas que impliquen varios documentos, (usuarios con mayor número de logins fallidos en todo nuestro sistema) de dos en dos, buscando primero al usuario X en nuestro índices de usuarios, y luego el número de logins que ha realizado. Y que la única forma de aumentar la eficiencia de búsqueda consistiría en añadir campos para evitar realizar este tipo de joins.

-¿Esto como maltrataría el tamaño del índice?

Los joins no funcionan en Elasticsearch. No entiendo porque maltrataria al indice el tamaño si agregas campos. Simplemente como una DB lo que sucederia es que en cuanto mas grandes documentos/datos, mas grande los indices y el disco queopan.

-¿De cuánto coste aproximado estaríamos hablando? es correcto, positivo ( y sobre todo asumible) aumentar el tamaño de los documentos indexados agregando datos de otros documentos para facilitar estas búsquedas multidocumentales?

Esto es correcto, y es un patron generalmente utilizado.

  • Respecto a la compresión de los datos indexados.

Cuanto se estima que pueda pesar un índice de unos 100.000 millones de eventos (recogidos durante dos años), indexados por tres o cuatro campos, sin agregaciones de datos y comprimidos con "index.codec: best_compression".
Esta pregunta, se que es difícil de responder con un dato exacto, pero es que ahora mismo no se ni dar un numero estimado.
-¿Se podrían realizar re-indexaciones y re-compresiones para aligerar el índice?

No te podria decir, depende nuevamente del caso y que se este haciendo. Se me es imposible decirte como va a funcionar esto. Tendrian que probarlo. Tenemos un blog tambien a cerca de esto: Store compression in Lucene and Elasticsearch | Elastic Blog. Tambien sobre storage en Elasticsearch: Part 2.0: The true story behind Elasticsearch storage requirements | Elastic Blog. Si bien son blogs viejos, siguen vigentes al dia de hoy.

Espero que esta info te sea de ayuda. Cualquier cosa a las ordenes.

Saludos!
--Gabriel

Muchísimas gracias Gabriel.

Intento ir por orden:

  1. Creo que minimizare el numero de topics al máximo (con dos, uno para flujos y otro para eventos va muy bien), porque acabo de leer en ese post que no mantiene el orden cronológico entre varios topics.

  2. El generator ya esta currando, Gracias!!

  3. Pues que tengo la sensación de que el SIEM funciona e indexa muy bien, pero que logstash se cuaja al hablar con Kafka, porque siempre crece muchísimo el lag (documentos a la espera de ser recogidos) en los topics de kafka cuando le meto caña, luego siempre acaba bajando, pero no veo saturadas las maquinas... :confused: y no puedo aceptar ese comportamiento de forma habitual, porque para eso, enchufo directamente con los beats a Elasticsearch y los flujos por logstash y aborto kafka... pero no me gustaría perder Kafka...

  4. Entonces cada thread de consumo de kafka se encarga de consumir mensajes de una partition de un topic de kafka. De forma que ajustaremos el numero de topics X particiones = threads de consumo. Lo he entendido bien?

  5. Y en los entornos en los que solo dispongamos de una maquina (un logstash, un elasticsearch (con dos instancias) y un kibana) me recomiendas un solo shard de elasticsearch con una única replica?
    ¿Y en función del numero de nodos con los que vaya a trabajar, un shard por nodo disponible?

  6. Perfecto, agregar datos no solo no dispara el tamaño del indice, sino que es una practica común para aligerar las búsquedas.

  7. Entonces, la re-compresión de datos antiguos es posible? si tengo datos de mas de 6 meses que quiero tener disponibles para buscar, pero cuyos indices no requiero que sean muy pesados pues las búsquedas van a ser raras, hay forma de conseguirlo? ¿Y de automatizarlo?

Muchisimas gracias de nuevo Gabriel!! :smile_cat:

Hola rpoveda!

Respecto a los puntos 3 y 4, están relacionados: si incrementas el número de particiones de Kafka, incrementas su paralelismo. Por otro lado, la relación entre threads consumidores de tópicos y particiones de Kafka es 1 a 1: esto quiere decir que para aprovechar al máximo el número de particiones en las colas de Kafka tienes que configurar consumer_threads en el input de Kafka en logstash al número de particiones; por defecto es 1, así que el input de Kafka está trabajando en modo secuencial cuando no está configurado.
Creo que el primer paso para afinar la configuración es jugar con el número de particiones y consumidores, para aprovechar mejor los recursos de las máquinas.

Respecto al punto 5, hay un ejercicio muy interesante para averiguar el tamaño ideal de un shard para el caso de uso; después, se puede continuar el ejercicio con cuantos shards de ese tamaño puede manejar un nodo; con toda esta información se puede decidir cuantos shards/replicas habría por nodo. El ejercicio se encuentra en Capacity planning.

Finalmente, respecto a comprimir indices antiguos: los indices en Lucene ya están comprimidos por defecto. Hay una operación (costosa, no hay que hacerla a la ligera!) que consiste en forzar un merge de los segmentos Lucene. Es ideal para este caso: cuando un índice es viejo se puede minimizar el número de segmentos (y en el proceso, se eliminarán efectivamente los borrados que haya habido: cuando se borra algo en Lucene realmente lo que se hace es marcarlo como borrado, y en el posterior proceso de Merge se borra). Hay una herramienta en Elastic, Curator, que se usa para automatizar mantenimiento de índices. En este ejemplo se hace un force_merge de los índices que tienen más de dos días.

Espero que estas respuestas te ayuden.

Un saludo!
Ismael

no os imaginas cuanto!! :heart_eyes:
devoro lo que me habéis comentado los dos y os comento

Buenas tardes,

No soy capaz de mejorar eso, yo creo que ni instalándolo a pelo en el ESX subiría mucho mas, pues la maquina parece estar comoda.

Voy a sacar capturas de absolutamente todo, y por favor, necesito ayuda, he apostado fuerte por este software y no me puedo quedar colgado...

HARDWARE:
Esta maqueta representa un AllinOne de 4 cores y 8GB de RAM.
aparentemento le sobra con este hardware:



SOFTWARE:
Linux 3.10.0-327.36.3.el7.x86_64 x86_64
Logstash
Elasticsearch
Kibana
Todo esta actualizado a la ultima versión.

Configuraciones:

  • logstash:
    [root@elk-aio /]# cat /etc/logstash/logstash.yml | grep -v "^#"
    path.data: /var/lib/logstash
    path.config: /etc/logstash/conf.d
    path.logs: /var/log/logstash

[root@elk-aio /]# cat /etc/logstash/conf.d/00-input-generator0.conf | grep -v "^#"
input{
generator {
count => 0
message => "Mensaje de prueba del inputgenerator0"
threads => 4
}
}
(Tiene 10 inputs como este, del 0 al 9)
[root@elk-aio /]# cat /etc/logstash/conf.d/output-elasticsearch.conf | grep -v "^#"
output {
elasticsearch {
hosts => ["localhost:9200"]
}
stdout { codec => json }
}

  • elasticsearch:
    el .yml de este componente esta por defecto.

-Indice:
_cat/indices
yellow open logstash-2016.11.28 1uupWuPrSlGGvvcAt6ngUA 5 1 17279 0 2.3mb 2.3mb
yellow open logstash-2016.11.23 ay2GAj3bTUWdOF-FB0zf_Q 5 1 15066 0 5.5mb 5.5mb
yellow open logstash-2016.11.29 -kNTP3LEQuWa7yjP2ipOSQ 5 1 17280 0 2.1mb 2.1mb
yellow open logstash-2016.11.21 gq35DmS1QFCnzwgFbTjsBw 5 1 36702 0 12mb 12mb
yellow open logstash-2016.11.30 8ZqnRH0kRe299rj4F619bQ 5 1 17281 0 2mb 2mb
yellow open logstash-2016.11.24 vSGsKR7oTHqkT0O7DM9-jQ 5 1 2702482 0 1.9gb 1.9gb
yellow open logstash-2016.11.20 EDeRhTs8SraD9B5u_DDJpA 5 1 24526 0 9.4mb 9.4mb
yellow open .kibana Qgakl3-ZS6il5_EjX-SI0w 1 1 3 0 15.5kb 15.5kb
yellow open logstash-2016.11.26 3CF8iENVR7iOD0_AQcIXvQ 5 1 17280 0 2.9mb 2.9mb
yellow open logstash-2016.12.01 i9r8_UWxQE6N40t8yHCHow 5 1 9241688 0 772.3mb 772.3mb
yellow open logstash-2016.11.25 fzFyEgZzR1S6fKGnEUR_tQ 5 1 17279 0 3.5mb 3.5mb
yellow open logstash-2016.11.22 Fq1Imo2WQkmOha-NEUPaSQ 5 1 9561 0 3.6mb 3.6mb
yellow open logstash-2016.11.27 Wg5VsoynTh6N8I7LRmzNIA 5 1 17278 0 2.9mb 2.9mb

_cluster/health
{
"cluster_name": "elasticsearch",
"status": "yellow",
"timed_out": false,
"number_of_nodes": 1,
"number_of_data_nodes": 1,
"active_primary_shards": 61,
"active_shards": 61,
"relocating_shards": 0,
"initializing_shards": 0,
"unassigned_shards": 61,
"delayed_unassigned_shards": 0,
"number_of_pending_tasks": 0,
"number_of_in_flight_fetch": 0,
"task_max_waiting_in_queue_millis": 0,
"active_shards_percent_as_number": 50
}

  • kibana:
    [root@elk-aio /]# cat /etc/kibana/kibana.yml | grep -v "^#"
    server.host: "0.0.0.0"

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.