Un tutorial de Elasticsearch: Getting Started

#Nota: Elastic anunció recientemente que implementaría licencias de código cerrado para las nuevas versiones de Elasticsearch y Kibana más allá de la versión 7.9. Para más detalles, lea los comentarios de nuestro CEO Tomer Levy en Truly Doubling Down on Open Source.

Elasticsearch es el corazón viviente de lo que es hoy la plataforma de análisis de registros más popular – la pila ELK (Elasticsearch, Logstash y Kibana). El papel de Elasticsearch es tan central que se ha convertido en sinónimo del nombre de la propia pila. Principalmente para la búsqueda y el análisis de registros, Elasticsearch es hoy en día uno de los sistemas de bases de datos más populares disponibles en la actualidad. Este tutorial de Elasticsearch proporciona a los nuevos usuarios los conocimientos y las herramientas necesarias para empezar a utilizar Elasticsearch. Incluye instrucciones de instalación y de indexación inicial y manejo de datos.

¿Qué es Elasticsearch?

Lanzado inicialmente en 2010, Elasticsearch (a veces apodado ES) es un moderno motor de búsqueda y análisis que se basa en Apache Lucene. Completamente de código abierto y construido con Java, Elasticsearch es una base de datos NoSQL. Esto significa que almacena los datos de forma no estructurada y que no se puede utilizar SQL para consultarla.

Este tutorial de Elasticsearch también podría considerarse un tutorial NoSQL. Sin embargo, a diferencia de la mayoría de las bases de datos NoSQL, Elasticsearch tiene un fuerte enfoque en las capacidades y características de búsqueda – tanto, de hecho, que la forma más fácil de obtener datos de ES es buscarlos usando la extensa API de Elasticsearch.

En el contexto del análisis de datos, Elasticsearch se utiliza junto con los otros componentes de la pila ELK, Logstash y Kibana, y desempeña el papel de indexación y almacenamiento de datos.

Instalación de Elasticsearch

Los requisitos para Elasticsearch son sencillos: Java 8 (versión específica recomendada: Oracle JDK versión 1.8.0_131). Echa un vistazo a este tutorial de Logstash para asegurarte de que estás preparado. Además, querrás asegurarte de que tu sistema operativo está en la matriz de soporte de Elastic, de lo contrario podrías encontrarte con problemas extraños e impredecibles. Una vez hecho esto, puedes empezar por instalar Elasticsearch.

Puedes descargar Elasticsearch como una distribución independiente o instalarlo usando los repositorios apt y yum. Instalaremos Elasticsearch en una máquina Ubuntu 16.04 que se ejecuta en AWS EC2 utilizando apt.

Primero, necesitas añadir la clave de firma de Elastic para poder verificar el paquete descargado (omite este paso si ya has instalado paquetes desde Elastic):

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

Para Debian, necesitamos entonces instalar el paquete apt-transport-https:

sudo apt-get install apt-transport-https

El siguiente paso es añadir la definición del repositorio a tu sistema:

echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list

Lo único que queda por hacer es actualizar tus repositorios e instalar Elasticsearch:

sudo apt-get updatesudo apt-get install elasticsearch

Configuración de Elasticsearch

Las configuraciones de Elasticsearch se realizan mediante un archivo de configuración cuya ubicación depende de tu sistema operativo. En este archivo, puede configurar los ajustes generales (por ejemplo, el nombre del nodo), así como los ajustes de red (por ejemplo, el host y el puerto), donde se almacenan los datos, la memoria, los archivos de registro, y más.

Para el desarrollo y las pruebas, la configuración predeterminada será suficiente, sin embargo, se recomienda hacer una investigación sobre qué ajustes debe definir manualmente antes de pasar a la producción.

Por ejemplo, y especialmente si se instala Elasticsearch en la nube, es una buena práctica vincular Elasticsearch a una IP privada o a un host local:

sudo vim /etc/elasticsearch/elasticsearch.ymlnetwork.host: "localhost"http.port:9200

Ejecución de Elasticsearch

Elasticsearch no se ejecutará automáticamente después de la instalación y tendrá que iniciarlo manualmente. La forma de ejecutar Elasticsearch dependerá de su sistema específico. En la mayoría de los sistemas basados en Linux y Unix puedes utilizar este comando:

sudo service elasticsearch start

¡Y ya está! Para confirmar que todo está funcionando bien, simplemente dirija curl o su navegador a http://localhost:9200, y debería ver algo como la siguiente salida:

{ "name" : "33QdmXw", "cluster_name" : "elasticsearch", "cluster_uuid" : "mTkBe_AlSZGbX-vDIe_vZQ", "version" : { "number" : "6.1.2", "build_hash" : "5b1fea5", "build_date" : "2018-01-10T02:35:59.208Z", "build_snapshot" : false, "lucene_version" : "7.1.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search"}

Para depurar el proceso de ejecución de Elasticsearch, utilice los archivos de registro de Elasticsearch ubicados (en Deb) en /var/log/elasticsearch/.

Creación de un índice de Elasticsearch

La indexación es el proceso de añadir datos a Elasticsearch. Esto se debe a que cuando se introducen datos en Elasticsearch, los datos se colocan en índices Apache Lucene. Esto tiene sentido porque Elasticsearch utiliza los índices Lucene para almacenar y recuperar sus datos. Aunque no es necesario saber mucho sobre Lucene, sí ayuda saber cómo funciona cuando se empieza a tomar en serio Elasticsearch.
Elasticsearch se comporta como una API REST, por lo que se puede utilizar el método POST o el método PUT para añadir datos a él. Se utiliza PUT cuando se conoce el o se quiere especificar el id del elemento de datos, o POST si se quiere que Elasticsearch genere un id para el elemento de datos:

curl -XPOST 'localhost:9200/logs/my_app' -H 'Content-Type: application/json' -d'{ "timestamp": "2018-01-24 12:34:56", "message": "User logged in", "user_id": 4, "admin": false}'curl -X PUT 'localhost:9200/app/users/4' -H 'Content-Type: application/json' -d '{ "id": 4, "username": "john", "last_login": "2018-01-25 12:34:56"}'

Y la respuesta:

{"_index":"logs","_type":"my_app","_id":"ZsWdJ2EBir6MIbMWSMyF","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}{"_index":"app","_type":"users","_id":"4","_version":1,"result":"created","_shards":{"total":2,"successful":1,"failed":0},"_seq_no":0,"_primary_term":1}

Los datos del documento se envían como un objeto JSON. Te estarás preguntando cómo podemos indexar datos sin definir la estructura de los mismos. Bueno, con Elasticsearch, como con cualquier otra base de datos NoSQL, no hay necesidad de definir la estructura de los datos de antemano. Sin embargo, para garantizar un rendimiento óptimo, puedes definir los mapeos de Elasticsearch según los tipos de datos. Más sobre esto más adelante.

Si está utilizando cualquiera de los cargadores Beats (por ejemplo, Filebeat o Metricbeat), o Logstash, esas partes de la pila ELK crearán automáticamente los índices.

Para ver una lista de tus índices de Elasticsearch, utiliza:

curl -XGET 'localhost:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open logstash-2018.01.23 y_-PguqyQ02qOqKiO6mkfA 5 1 17279 0 9.9mb 9.9mbyellow open app GhzBirb-TKSUFLCZTCy-xg 5 1 1 0 5.2kb 5.2kbyellow open .kibana Vne6TTWgTVeAHCSgSboa7Q 1 1 2 0 8.8kb 8.8kbyellow open logs T9E6EdbMSxa8S_B7SDabTA 5 1 1 0 5.7kb 5.7kb

La lista en este caso incluye los índices que creamos anteriormente, un índice de Kibana y un índice creado por un pipeline de Logstash.

Consultas en Elasticsearch

Una vez que indexes tus datos en Elasticsearch, puedes empezar a buscarlos y analizarlos. La consulta más sencilla que puedes hacer es recuperar un solo elemento. Lee nuestro artículo centrado exclusivamente en las consultas de Elasticsearch.

Una vez más, a través de la API REST de Elasticsearch, utilizamos GET:

curl -XGET 'localhost:9200/app/users/4?pretty'

Y la respuesta:

{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 1, "found" : true, "_source" : { "id" : 4, "username" : "john", "last_login" : "2018-01-25 12:34:56" }}

Los campos que comienzan con un guión bajo son todos los meta campos del resultado. El objeto _source es el documento original que fue indexado.
También usamos GET para hacer búsquedas llamando al endpoint _search:

curl -XGET 'localhost:9200/_search?q=logged'{"took":173,"timed_out":false,"_shards":{"total":16,"successful":16,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":}}

El resultado contiene una serie de campos extra que describen tanto la búsqueda como el resultado. He aquí un breve resumen:

  • took: El tiempo en milisegundos que ha tardado la búsqueda
  • timed_out: If the search timed out
  • _shards: El número de fragmentos de Lucene en los que se ha buscado, y sus porcentajes de éxito y fracaso
  • hits: Los resultados reales, junto con la metainformación de los resultados

La búsqueda que hicimos arriba se conoce como búsqueda URI, y es la forma más sencilla de consultar a Elasticsearch. Proporcionando sólo una palabra, ES buscará en todos los campos de todos los documentos esa palabra. Puede realizar búsquedas más específicas utilizando consultas Lucene:

  • username:johnb – Busca documentos en los que el campo username sea igual a «johnb»
  • john* – Busca documentos que contengan términos que empiecen por john y vayan seguidos de cero o más caracteres como «john», «johnb» y «johnson»
  • john? – Busca documentos que contengan términos que empiecen por john seguidos de un solo carácter. Coincide con «johnb» y «johns» pero no con «john».

Hay muchas otras formas de buscar, incluyendo el uso de la lógica booleana, la potenciación de los términos, el uso de búsquedas difusas y de proximidad, y el uso de expresiones regulares.

El DSL de consulta de Elasticsearch

Las búsquedas de URL son sólo el principio. Elasticsearch también proporciona una búsqueda en el cuerpo de la solicitud con un DSL de consulta para búsquedas más avanzadas. Hay una amplia gama de opciones disponibles en este tipo de búsquedas, y puedes mezclar y combinar diferentes opciones para obtener los resultados que necesitas.

Contiene dos tipos de cláusulas: 1) cláusulas de consulta de hoja que buscan un valor en un campo específico, y 2) cláusulas de consulta compuesta (que pueden contener una o varias cláusulas de consulta de hoja).

Tipos de consulta de Elasticsearch

Hay una amplia gama de opciones disponibles en este tipo de búsquedas, y puede mezclar y combinar diferentes opciones para obtener los resultados que requiere. Los tipos de consulta incluyen:

  1. Consultas geográficas,
  2. Consultas de «Más como esto»
  3. Consultas con script
  4. Consultas de texto completo
  5. Consultas de forma
  6. Consultas de ámbito
  7. Consultas a nivel de término
  8. Consultas especializadas

A partir de Elasticsearch 6.8, ELK Stack ha fusionado las consultas de Elasticsearch y los filtros de Elasticsearch, pero ES sigue diferenciándolos por contexto. El DSL distingue entre un contexto de filtro y un contexto de consulta para las cláusulas de consulta. Las cláusulas en un contexto de filtro comprueban los documentos de forma booleana: ¿El documento coincide con el filtro, «sí» o «no»? Los filtros también suelen ser más rápidos que las consultas, pero las consultas también pueden calcular una puntuación de relevancia según el grado de coincidencia de un documento con la consulta. Los filtros no utilizan una puntuación de relevancia. Esto determina el orden y la inclusión de los documentos:

curl -XGET 'localhost:9200/logs/_search?pretty' -H 'Content-Type: application/json' -d'{ "query": { "match_phrase": { "message": "User logged in" } }}'

Y el resultado:

{ "took" : 28, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "skipped" : 0, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.8630463, "hits" : }}'

Creación de un clúster de Elasticsearch

Mantener un clúster de Elasticsearch puede llevar mucho tiempo, especialmente si se hace un ELK DIY. Pero, dadas las potentes capacidades de búsqueda y análisis de Elasticsearch, estos clústeres son indispensables. Tenemos una inmersión más profunda en el tema con nuestro tutorial de clústeres de Elasticsearch, así que vamos a utilizar esto como un trampolín para ese paseo más profundo.

¿Qué es un clúster de Elasticsearch, precisamente? Los clusters de Elasticsearch agrupan múltiples nodos y/o instancias de Elasticsearch. Por supuesto, siempre se puede optar por mantener una sola instancia o nodo de Elasticsearch dentro de un clúster determinado. El punto principal de tal agrupación radica en la distribución de tareas, búsqueda e indexación del clúster entre sus nodos. Las opciones de los nodos incluyen los nodos de datos, los nodos maestros, los nodos clientes y los nodos de ingesta.

La instalación de los nodos puede implicar una gran cantidad de configuraciones, que nuestro tutorial antes mencionado cubre. Pero aquí está la instalación básica de los nodos del clúster de Elasticsearch:

En primer lugar, instale Java:

sudo apt-get install default-jre

A continuación, añada la clave de inicio de sesión de Elasticsearch:

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -

A continuación, instala la nueva iteración de Elasticsearch:

sudo apt-get update && apt-get install elasticsearch

Tendrás que crear y/o configurar el archivo de configuración propio de cada nodo de Elasticsearch (sudo vim /etc/elasticsearch/elasticsearch.yml). A partir de ahí, inicie Elasticsearch y luego compruebe el estado de su clúster de Elasticsearch. Las respuestas serán algo así:

{ "cluster_name" : "elasticsearch-cluster-demo", "compressed_size_in_bytes" : 255, "version" : 7, "state_uuid" : "50m3ranD0m54a531D", "master_node" : "IwEK2o1-Ss6mtx50MripkA", "blocks" : { }, "nodes" : { "m4-aw350m3-n0D3" : { "name" : "es-node-1", "ephemeral_id" : "x50m33F3mr--A11DnuM83r", "transport_address" : "172.31.50.123:9200", "attributes" : { } }, },}

La salud del clúster de Elasticsearch será la siguiente en su lista. Compruebe periódicamente la salud de su clúster con la siguiente llamada a la API:

curl -X GET "localhost:9200/_cluster/health?wait_for_status=yellow&local=false&level=shards&pretty"

Este ejemplo muestra el parámetro local como false, (que es en realidad por defecto). Esto le mostrará el estado del nodo maestro. Para comprobar el nodo local, cambie a true.

El parámetro de nivel, por defecto, le mostrará la salud del cluster, pero los rangos más allá incluyen indices y shards (como en el ejemplo anterior).

Hay parámetros opcionales adicionales para los tiempos de espera…

timeout
master_timeout

…o, para esperar a que se produzcan ciertos eventos:

wait_for_active_shards
wait_for_events
wait_for_no_initializing_shards
wait_for_no_relocating_shards
wait_for_nodes
wait_for_status

Eliminar datos de Elasticsearch

Eliminar elementos de Elasticsearch es tan fácil como introducir datos en Elasticsearch. El método HTTP a utilizar esta vez es -sorpresa, sorpresa-DELETE:

$ curl -XDELETE 'localhost:9200/app/users/4?pretty'{ "_index" : "app", "_type" : "users", "_id" : "4", "_version" : 2, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "_seq_no" : 1, "_primary_term" : 1}

Para eliminar un índice, utilice:

$ curl -XDELETE 'localhost:9200/logs?pretty'

Para eliminar todos los índices (utilice con extrema precaución) utilice:

$ curl -XDELETE 'localhost:9200/_all?pretty'$

La respuesta en ambos casos debe ser:

{ "acknowledged" : true}

Para eliminar un solo documento:

$ curl -XDELETE 'localhost:9200/index/type/document'

¿Qué sigue?

Este tutorial ayuda a los principiantes con Elasticsearch y como tal proporciona sólo los pasos básicos de las operaciones CRUD en Elasticsearch. Elasticsearch es un motor de búsqueda, y como tal cuenta con una inmensa profundidad en sus características de búsqueda.
Las versiones recientes han introducido algunas increíbles nuevas características de Elasticsearch y también algunos cambios significativos en la estructura de datos subyacente.

Siempre es una buena idea explorar la documentación oficial de Elasticsearch, así como nuestro tutorial de Logstash y el tutorial de Kibana.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.