17 January 2018

¿Debo usar Logstash o los nodos de ingesta de Elasticsearch?

By Christian Dahlqvist

Logstash es uno de los componentes originales de Elastic Stack y, durante mucho tiempo, fue la herramienta para analizar, enriquecer o procesar datos. Con los años, se fueron agregando muchos módulos de entrada, salida y filtro, lo que hizo que se convirtiera en una herramienta flexible y potente, apta para una variedad de arquitecturas diferentes.

Los nodos de ingesta se presentaron con Elasticsearch 5.0 como una forma de procesar documentos en Elasticsearch antes de la indexación. Estos nodos dan lugar a arquitecturas más sencillas con un mínimo número de componentes, en las que las aplicaciones envían datos directamente a Elasticsearch para procesar e indexar. A menudo, esto simplifica el inicio con Elastic Stack, pero también escala horizontalmente cuando los volúmenes de datos aumentan.

No obstante, los nodos de ingesta duplican algunas de las funcionalidades de Logstash, por lo que muchos usuarios preguntan con frecuencia cuál deben usar.  En este artículo del blog analizaremos los aspectos arquitectónicos que debe tener en cuenta a la hora de elegir entre los dos, con el objetivo de ayudarlo a tomar una mejor decisión informada.

Esta es la tercera entrega de nuestra serie sobre preguntas frecuentes que tienen los usuarios. Las anteriores fueron:

¿Cómo entran y salen los datos?

Una de las diferencias principales entre Logstash y el nodo de ingesta es la forma en que los datos entran y salen.

A medida que el nodo de ingesta se ejecuta dentro del flujo de indexación de Elasticsearch, los datos deben transferirse mediante solicitudes bulk o de indexación. Por lo tanto, debe haber un proceso que escriba datos activamente en Elasticsearch. Los nodos de ingesta no pueden extraer datos de una fuente externa, como una cola de mensajes o una base de datos.

Logstash, por otro lado, cuenta con una variedad de módulos de entrada y salida, y puede usarse para admitir diversas arquitecturas. Puede actuar como servidor y aceptar datos transferidos por los clientes por TCP, UDP y HTTP, además de extraer datos activamente desde, por ejemplo, bases de datos y colas de mensajes. En lo que respecta a la salida de datos, hay una gran variedad de opciones disponibles, por ejemplo, colas de mensajes como Kafka y RabbitMQ o sistemas de ficheros externos como S3 o HDFS.

¿Qué hay de las colas y la contrapresión?

Cuando envía datos a Elasticsearch, sea directamente o mediante un proceso de ingesta, los clientes deben poder ocuparse del caso cuando Elasticsearch no puede aceptar más datos. Esto es lo que denominamos aplicar «contrapresión». Si los nodos de datos no pueden aceptar datos, el nodo de ingesta dejará de aceptar datos también.

Las arquitecturas en las que no hay un mecanismo de cola incorporado al procesamiento, sea en la fuente o a lo largo del proceso, tienen el potencial de perder datos si no se puede acceder a Elasticsearch o este no puede aceptar datos durante un período extenso. Esto incluye Beats que no pueden almacenar ni leer datos desde el archivo, además de otros procesos que pueden escribir datos directamente en Elasticsearch, como syslog-ng.

Logstash puede poner datos en cola en un disco mediante la función de colas persistentes, que permite que Logstash ofrezca garantías de entrega de al menos una vez y búfer a nivel local, críticos durante los picos de ingesta. Logstash también admite la integración con diversos tipos de colas de mensajes, lo que permite contar con varios patrones de implementación compatibles.

¿Cómo enriquezco y proceso mis datos?

El nodo de ingesta viene con más de 20 procesadores diferentes, que cubren la funcionalidad de los módulos más usados de Logstash. Sin embargo, una de las limitaciones es que el proceso del nodo de ingesta solo funciona en el contexto de un único evento. Asimismo, en general, los procesadores no pueden comunicarse con otros sistemas ni leer datos del disco, lo que limita los tipos de enriquecimiento que pueden llevar a cabo.

Logstash cuenta con una selección significativamente más grande de módulos para elegir. Esto incluye módulos para agregar o transformar contenido definido en archivos de configuración, Elasticsearch o bases de datos relacionales.

Beats y Logstash también permiten filtrar y anular eventos en función de criterios configurables, algo que no es posible en el nodo de ingesta por el momento.

¿Cuál es más fácil de configurar?

Este es un tema muy subjetivo, ya que la respuesta depende de su experiencia y conocimiento. Cada procesamiento de nodo de ingesta se define en un documento JSON, que se almacena en Elasticsearch. Se puede definir una gran cantidad de procesamientos diferentes, pero los documentos solo pueden ser procesados por uno cuando atraviesan el nodo de ingesta. Este formato puede ser un poco más fácil de usar que el formato de archivo de configuración de Logstash, al menos para procesos bien definidos y razonablemente simples. Para procesos más complejos con múltiples formatos de datos, el hecho de que Logstash admita el uso de condicionales para control de flujo a menudo es una ventaja que facilita la operación. Asimismo, Logstash admite la definición de múltiples procesos separados lógicamente, que pueden administrarse a través de una interfaz de usuario basada en Kibana.

También vale la pena mencionar que la monitorización y optimización del procesamiento es, generalmente, más fácil con Logstash, ya que admite el monitoreo y ofrece una excelente interfaz de usuario (UI) de visualización de procesamiento que puede usarse para detectar atascos y problemas potenciales rápidamente.

¿Cómo afecta al consumo de recursos?

Una de las mayores ventajas de los nodos de ingesta es que admiten arquitecturas muy simples, en las que Beats puede escribir directamente en un procesamiento de nodo de ingesta. Cada nodo en un cluster de Elasticsearch puede actuar como nodo de ingesta, lo que permite mantener el consumo de recursos acotado y simplificar la complejidad de la arquitectura, al menos para los casos de uso más pequeños.

Una vez que los volúmenes de datos aumentan o el procesamiento se vuelve más complejo, y se genera mayor carga de la CPU en el cluster, generalmente se recomienda cambiar a nodos de ingesta dedicados. En este punto, se necesita hardware adicional para alojar los nodos de ingesta dedicados o Logstash, y los consumos de recursos dependerán, en gran medida, del caso de uso.

¿Los nodos de ingesta pueden hacer algo que Logstash no pueda?

Hasta ahora, parece que los nodos de ingesta ofrecen un subconjunto de la funcionalidad que admite Logstash, pero esto no es totalmente cierto.

Los nodos de ingesta admiten el módulo de procesador de datos adjuntos de ingesta, que puede usarse para procesar e indexar datos adjuntos en formatos comunes, como PPT, XLS y PDF. Actualmente, no hay módulos equivalentes disponibles para Logstash, por lo que, si planea indexar diversos tipos de datos adjuntos, es posible que necesite el nodo de ingesta.

Dado que el procesamiento de ingesta se ejecuta justo antes de la indexación de datos, también es el método más confiable para agregar una marca de tiempo que indique cuándo se indexó el evento, por ejemplo, para medir y analizar las demoras de ingesta de forma precisa. Configurar esto antes de que los datos lleguen correctamente a Elasticsearch puede resultar engañoso, ya que puede haber demoras entre la fijación de la marca de tiempo y la indexación de datos en Elasticsearch, por ejemplo, si se aplica contrapresión o si el cliente se ve forzado a reintentar la indexación de datos varias veces. Este tipo de marcas de tiempo puede usarse para medir la demora de ingesta por documento.

¿Puedo usar Logstash y el nodo de ingesta en conjunto?

Si bien la mayoría de las veces se elige una opción por encima de la otra, naturalmente es posible usar ambas en conjunto, ya que Logstash admite el envío de datos a un procesamiento de ingesta. Para arquitecturas más complejas, puede haber múltiples flujos lógicos con requisitos muy diferentes. Algunos pueden pasar por Logstash, mientras que otros se envían directamente a los nodos de ingesta de Elasticsearch.

Conclusiones

Hay cierta superposición de funcionalidades entre Logstash y el nodo de ingesta de Elasticsearch. Esto quiere decir que algunas arquitecturas pueden implementarse con cualquiera de estas tecnologías. Ambas opciones tienen sus pros y sus contras, por lo que es importante analizar los requisitos y la arquitectura de su procesamiento completo, y seleccionar el método más adecuado en función de los criterios expuestos en este artículo del blog. La elección no es siempre de un método por encima del otro, ya que pueden usarse en conjunto o en paralelo para diferentes partes del procesamiento.