Introducción a Elasticsearch: Qué es, casos de uso, instalar…

Iniciamos con este primer post lo que pretendemos que se convierta en una serie de posts técnicos sobre Elasticsearch, donde poder tener recogidas algunas funcionalidades interesantes de la tecnología, así como poder documentar algunos casos de éxito en clientes o nuevas funcionalidades interesantes que vayan surgiendo.

El objetivo de este primer post es hacer una pequeña introducción a Elasticsearch. Indicaremos sus principales características, los conceptos básicos que son necesarios conocer para trabajar con la tecnología e introduciremos Elastic Stack. Comencemos pues…

¿Qué es Elasticsearch?

Esta es la primera pregunta que nos viene en la cabeza al oír por primera vez “Elasticsearch”…
¿Qué es Elasticsearch y para qué sirve? ¿Aplica a mi proyecto?

ElasticSearch es un motor de búsqueda y recuperación de documentos de tipo JSON basado en Apache Lucene, que puede proveer a diferentes aplicaciones de capacidades de búsqueda a texto completo a través de una API web RESTful.

ElasticSearch está desarrollado en Java y está publicado como código abierto bajo las condiciones de la licencia Apache. Así pues la respuesta podríamos resumirla en que Elasticsearch es un motor de búsqueda con capacidades analíticas.

Principales características

Acceso al dato

Elasticsearch provee un completo Query DSL (Domain Specific Language) basado en JSON para definir las búsquedas.

Podemos añadir y posteriormente buscar y analizar sobre grandes cantidades de datos en tiempo real de forma distribuida. La configuración y el acceso a los datos podremos realizarlo mediante su RESTful API. Así mismo también dispone de diversas librerías para clientes (Java, Ruby, PHP, .NET, Python, etc)

Scalability

Permite una arquitectura distribuida, escalable horizontalmente y en alta disponibilidad.

Rapidez

Diseñado para permitir búsquedas de texto completo (Full-Text) muy rápidas.

Orientado a documentos

Permite almacenar documentos JSON indexando todos sus campos (schemaless). Útil para soluciones NoSQL.

Use Cases

La capacidad que ofrece Elasticsearch a la hora de indexar contenido, así como su escalabilidad y su gran velocidad ofrecen multitud de casos de uso de aplicación. A continuación indicamos los más comunes en los que Elasticsearch será un gran aliado en nuestro proyecto.

Buscador

Si vamos a necesitar realizar búsquedas de texto, una opción a valorar debería ser Elasticsearch. Además de poder realizar búsquedas Full-Text, nos permite realizar búsquedas optimizadas por idiomas sobre nuestros documentos. Podemos definir búsquedas por palabras o frases, obteniendo los documentos que aplican a nuestras condiciones de búsqueda.

Sin entrar en detalle, ya que se escapa al objetivo de este artículo, comentar que el uso de analizadores (analyzers) en Elasticsearch nos permite mediante el análisis del texto poder realizar búsquedas full-text, donde las búsquedas nos devolverán todos los resultados relevantes y no solo búsquedas exactas. El análisis hace posible búsquedas full-text gracias al uso de tokens (tokenization), lo que supone partir el texto en pequeños trozos (tokens).

Análisis de Métricas

Otro caso de uso interesante es el análisis de métricas en tiempo real. En este caso nos encontramos frente una gran cantidad de datos pequeños, agregados.

Este tipo de información, de gran valor para el negocio, es posible unificarlo y posteriormente visualizarlo o analizarlo con la potencia que nos ofrece Elasticsearch.

Logging – analíticas de log

Al igual que en el caso de búsqueda de texto, en este caso Elasticsearch será un gran aliado. Podremos centralizar la gestión completa de todo nuestro ecosistema (aplicaciones, servidores, etc) en Elasticsearch, ofreciendo un gestor completo de logs en tiempo real sobre un gran volumen de datos.

Elastic, compañía detrás de Elasticsearch, ofrece otros productos como Beats, Logstash o Kibana que, como veremos más adelante, se convierten en el equipo perfecto para nuestra analítica de logs.

Análisis de seguridad

Como hemos indicado anteriormente, si podemos utilizar Elasticsearch como un gestor centralizado de logs, esta misma funcionalidad nos permitirá trabajar sobre datos de seguridad. Así es muy común ver cómo equipos de seguridad disponen de sistemas SIEM junto a un cluster de Elasticsearch, el cual almacena gran volumen de información a poder ser analizada a lo largo del tiempo.

Elastic, conocedor del uso de su aplicación en este ámbito, ofrece adicionalmente un módulo de SIEM integrado en Kibana, mediante el cual es posible disponer de una consola centralizada interactiva donde un equipo de análisis de seguridad puede trabajar inicialmente sobre ciertos patrones e ir relacionando trazas en búsqueda de información relevante.

Interesante comentar que Elastic ofrece un módulo de APM (Application Performance Management), disponible en Kibana, para poder analizar el rendimiento de aplicaciones. Este módulo nos ofrece una visión exacta de dónde se está utilizando el tiempo en la aplicación para poder así resolver rápidamente los problemas identificados.

Como vemos la casuística de uso puede ser muy diversa. En la propia web del fabricante se recogen algunos casos de uso de clientes que os pueden ser de ayuda consultar: https://www.elastic.co/es/customers

Terminología

Para poder entender mínimamente el funcionamiento de Elasticsearch, creemos conveniente en este primer artículo hacer mención de la terminología más común que nos encontraremos al trabajar con él:

Cluster

Agrupación de nodos Elasticsearch que mantienen los datos distribuidos e indexados. Todos los nodos de un cluster conocen la existencia del resto, por lo que pueden así dirigir las peticiones de los clientes al nodo apropiado.

Nodo (node)

Cada instancia que se levanta de Elasticsearch es un nodo. Cada nodo por defecto maneja tráfico http y de transporte, permitiendo gestionar llamadas a la API REST y la comunicación con el resto de nodos respectivamente.

Un nodo puede tener varios roles, siendo importante conocer sus características. Por defecto a un nodo se le aplican todos los roles existentes, pudiendo seleccionarse uno o varios según se convenga.

Master-elegible

Indica que el nodo puede ser elegido como master. En este artículo no entraremos en el detalle del proceso de votación del master ni en su importancia para evitar Split-brain en el cluster. Como concepto general entender que en todo cluster ha de haber siempre un nodo master, el cual es el encargado de gestionar el clúster.

Machine Learning

El nodo realizará las tareas configuradas en el módulo de Machine Learning que dispone la aplicación.

Data Node

Almacena los datos y realiza las operaciones necesarias, búsquedas y agregaciones sobre estos.

Ingest Node

Es capaz de aplicar procesos de transformación y enriquecimiento a los datos (mediante ingest pipeline) previamente a su indexación.

Aclarar que si a un nodo se le desactivan todos los roles, este actuará como nodo de coordinación (Coordinating node), ya que este rol es implícito y sirve para poder coordinar peticiones de clientes.

En este artículo no vamos a abordar detalles de arquitectura, pero ya podemos ver la importancia de poder dedicar ciertos nodos a ciertos roles. Por ejemplo es fácil llegar a la conclusión que una serie de procesos complejos de ML necesitarán de un uso importante de recursos de computación, lo cual podremos abordar con nodos dedicados a este propósito sin afectar al rendimiento del resto de nodos y pudiendo crecer horizontalmente según vayamos requiriendo más recursos.

Índice (index)

Es la agrupación de documentos que comparten características similares, siendo referenciado por un nombre el cual podremos utilizar para acceder a los datos.

Índice invertido (inverted index)

No confundir con índice. El índice invertido es la estructura de datos utilizada por Elasticsearch para poder realizar búsquedas full-text de forma muy rápida. Este contiene una referencia única (token) de cada aparición en documentos e identifica cada documento que lo contiene.

Documento (document)

Conjunto de campos, en formato JSON, que se almacenan en un índice de Elasticsearch.

Campo (field)

Asignaciones clave:valor con el contenido de la información.

Shard

La técnica de dividir el dato indexado en varias partes se llama sharding, lo cual permite un escalado horizontal de este. Un shard es una parte de un índice, el cual contiene una parte de los datos de este. En Elasticsearch un shard es una instancia de Lucene, por lo que en sí mismo podemos ver que será funcional e independiente en ciertos aspectos.

Elasticsearch maneja dos tipos de shards. Los shards primarios son los shards propios que contienen la información del índice. Adicionalmente podemos realizar copias de estos shards para ofrecer tolerancia a fallo en el cluster, a estos shards se les llama shards de réplica.

Sin entrar en detalle en el funcionamiento de cómo Elasticsearch gestiona los shards, sí es importante mencionar que el uso de shards primarios y réplicas no sólo permite una tolerancia al fallo de los datos, sino que también proporciona la posibilidad de paralelizar tareas de ingesta y consulta de datos.

Elasticsearch mantiene siempre en instancias separadas shards primarios y sus réplicas, así si en algún momento se identifica la caída de algún nodo, Elasticsearch reorganizará los shards necesarios para disponer en todo momento de alta disponibilidad. Esa misma operativa se realizará cuando se detecte que los problemas del nodo han quedado solventados.

Mapeo de campos (mapping)

Es el proceso de definir como un documento, y los campos que lo contienen, ha a ser almacenado e indexado. Como se indicó anteriormente, Elasticsearch no requiere la declaración del esquema de datos a utilizar, pero es recomendable definir antes de la ingesta el tipo de datos a esperar. Esto permitirá optimizar el tamaño de almacenamiento o realizar posteriormente operaciones sobre ciertos tipos de datos entre otros aspectos.

El uso de mappings normalmente vendrá asociado a la creación de templates, en los cuales se definirán para un patrón de índices (index pattern) tanto losmappings a aplicar en los campos como la configuración (settings) a tener en cuenta, como el número de shards a aplicar, etc.

Instalación

Una vez que ya conocemos más la tecnología y estamos preparados para probarla, la siguiente pregunta que seguramente nos haremos es ¿cómo y dónde instalamos Elasticsearch?

La respuesta en este caso dependerá mucho de la casuística concreta en que nos encontremos…¿disponemos de infraestructura propia? ¿nuestro proyecto recomienda el uso de contenedores? ¿trabajamos en infraestructura cloud? etc.

Elastic ofrece multitud de opciones a la hora de instalar Elasticsearch, ofreciendo un servicio de hospedaje propio (Elastic Cloud) así como la posibilidad de realizar la instalación en nuestra propia infraestructura. Si este último fuera nuestro caso, dispondremos de versiones para Linux, Windows y MacOS, en una variedad de formatos (ficheros comprimidos, paquetes de repositorios, instalables, etc) así como imágenes disponibles para levantar Elasticsearch en contenedores Docker.

La descarga del producto podremos encontrarla here.

Dado que el propio fabricante dispone de información detallada para completar los pasos necesarios en cualquiera de sus posibilidades de instalación, es recomendable visitar su web.

Comentar que si estamos pensando en desplegar Elasticsearch en Kubernetes, Elastic nos ofrece ECK (Elastic Cloud on Kubernetes). ECK es un operador desarrollado por Elastic para automatizar el despliegue, el aprovisionamiento, la gestión y la orquestación de Elasticsearch y otros productos de Elastic como Kibana y APM Server en K8s de forma optimizada.

Bien, ya lo tengo instalado. Y ahora ¿cómo puedo empezar a trabajar en mi clúster?

Una vez arrancado el cluster, ya podremos utilizar su REST API para interactuar. Para verificar que el clúster está correctamente levantado podemos lanzar un GET enviando una consulta HTTP por el puerto 9200 (o el que hayamos configurado en su lugar) sobre cualquier instancia del cluster. Esto nos devolverá el documento JSON con la información correspondiente.

Stack Elastic

Bajo este nombre se agrupan varios productos de Elastic (Beats, Logstash, Kibana) que junto a Elasticsearch, el core del Stack, nos simplifican la transformación e ingesta de datos, su visualización y reporte.

Beats

Son agentes ligeros para recopilar ciertos tipos de información, que tras su transformación y enriquecimiento se ingesta en Elasticsearch. Existen multitud de beats, por ejemplo Filebeat permite analizar datos desde repositorios de logs, Winlogbeat analiza eventos de logs de Windows, Auditbeat permite recoger datos de auditoría, Metricbeat analiza métricas, Packetbeat permite analizar paquetes de red, etc.

Logstash

Junto a la potencia de Beats, si adicionalmente necesitamos de ingesta de ciertos orígenes de datos o de ciertas tareas de transformación no cubiertas, Elastic dispone de su ETL (Extract, Transform and Load), Logstash.

Con Logstash podremos por ejemplo consultar a BBDD para extraer información, a otros clusters de Elasticsearch, etc, así como posteriormente transformar y enriquecer el dato para ingestarlo en Elasticsearch.

Kibana

Es la herramienta de visualización y reporte, mediante la cual podremos tener dashboards con visualizaciones interactivas sobre nuestros datos.

Pero Kibana no sólo tiene esta funcionalidad. También posibilita una administración del cluster de Elasticsearch más intuitiva mediante una interfaz gráfica y es la herramienta donde Elastic integra funcionalidades como APM, SIEM, ML, etc mediante módulos propios.

 

Conclusión

Generalmente el tipo de datos que necesitamos tratar se incluye dentro de estas dos tipologías:

Estáticos

Dataset que crece o cambia generalmente de forma lenta o puntual (inventarios, catálogos, etc).

Series temporales

Datos de eventos asociados con un momento temporal, que generalmente crece de forma rápida (logs, métricas, etc).

Como hemos podido ver a lo largo del artículo, Elasticsearch aplicará perfectamente a ambos tipos de datos, por lo que os animamos a seguir conociendo el producto y ver cómo puede ayudaros en vuestra organización.

Elastic Technology Consultant & Elastic Certified Engineer & Analyst

Share this post: