ElasticSearch 5

Conceptos y setup para dar de alta un cluster y no morir en el intento.

Jose Garfias Lopez
ComeOnCommunity
10 min readNov 3, 2017

--

Introducción

Hola, a continuación te voy a explicar como puedes configurar correctamente un cluster de elasticsearch en producción y no morir en el intento, analizaremos un caso real donde podrás despejar todas las dudas que tengas. Al principio elasticsearch puede sentirse que es la cosa mas complicada del mundo, pero entendiendo bien los conceptos básicos tendremos éxito en nuestra misión.

¿Porque ElasticSearch?

A continuación te voy a explicar las ventajas que tiene usar elasticsearch para que así tu puedas tomar la decisión correcta para tu caso de uso. En general elasticsearch es usado para grandes cantidades de documentos no relacionanes, estilo MongoDB pero con esteroides, te permite hacer busquedas o aggregates sobre millones de documentos en milisegundos.

Buscador de texto completo / Auto Acompletado: una de las aplicaciones mas comunes para elasticsearch es la implementación de un buscador para nuestra aplicación o pagina web, ya que como te lo comentaba, elasticsearch puede almacenar millones de documentos y hacer busquedas muy rapida sobre ellos. El buscador de Google tiene como base el mismo motor (Apache Leucene) que ElasticSearch.

Logs / monitoring : Puedes conectar los logs de todas tus aplicaciones a elasticsearch mediante sus herramientas (beats, logstash) de manera muy rapida y efectiva, esto con el objetivo de centralizarlos en un solo lugar y poder hacer analisis sobre ellos. No importa cuantos o que tan recurrente sean tus logs, gracias a la naturaleza robusta de elasticsearch puedes guardarlos sin preocuparte por el espacio.

Analisis: Si tu necesidad es hacer tops, aggregates, búsquedas, filtros o histogramas, elasticsearch es la mejor opción para analizar toda la información que guardas en el, dependiendo la forma en la que guardes (indexes) tus documentos podrás aprovechar todo el potencial que la API de elasticsearch te provee. Podrás hacer analisis complejos de forma muy facil y rapida.

Visualización de datos: Elasticsearch tambien cuenta con kibana, una herramienta para explorar y visualizar todos tus datos, asi como tambien podras hacer analisis y graficas circulares, lineales o histogramas, todo en un mismo lugar.

¿Que es ElasticSearch?

Diagrama Indice Invertido

Definición: Es un motor de busqueda distribuido que nos permite guardar (indexar) y buscar documentos casi en tiempo real, esta optimizado para trabajar con grandes cantidades de información. Esta basado en Apache Leucene que a su vez esta desarrollado en JAVA, por lo que podemos tener la confianza que es muy robusto en cuanto a performance y escalabilidad. El protocolo que se usa para poder interactuar con elasticsearch es mediante REST, por lo que podemos decir que es compatible con cualquier teconologia que utilicemos actualmente, podemos utilizarlo en cualquier punto de nuestro stack y desde cualquier lenguaje. Su principio de funcionamiento esta basado en una estructura de datos llamada “indice invertido” (inverted index) el cual por cada documento que nosotros indexamos, separa todas las palabras y guarda la palabra junto con el ID del documento, teniendo asi una tabla de palabras con ID’s de documentos asociados, esto le permite a elasticsearch mayor velocidad al momento de realizar las consultas o búsquedas.

Conceptos basicos: Para poder entender un poco mas como funciona elasticsearch, necesitamos primero entender los conceptos basicos que son muy comunes al desarrollar.

Cluster: Es nuestra unidad mas grande de nuestro ecosistema de elastic search, representa a un conjunto de NODOS que mantienen toda la información distribuida a través de diferentes servidores. Ejemplo: KarmapulseCluster.

Node: Es un servidor o instancia de elasticsearch corriendo y forma parte de algún cluster, por defecto al crear un cluster elasticsearch crea un nodo y lo atacha a ese cluster, puden existir tantos nodos quieras en un cluster, esto dependerá de la capacidad que configures en tu cluster en cuanto a requerimientos de RAM y Disco Duro. Ejemplo: SFO_NODE.

Index: Es una colección donde se categorizan nuestros documentos que tienen caracteristias o campos similares entre si, un indice te sirve para que puedas organizar tu información de la forma que a ti mas te funcione. Siempre se debe nombrar en minusculas. Imagina al indice o index como un archivero o cajon donde vas a tener todos tus archivos u objetos. Hay empresas que crean indices para separar su información por día, por mes o por año, segun sea el caso y el tamaño de la información que se guarda. Ejemplo: tweets_2017–05.

Document: Es nuestra unidad de información, es un solo archivo, objeto o registro que guardamos en nuestro indice de elastic search, un document contiene todos los campos que necesitamos y siempre va expresado en formato JSON. Ejemplo: { person: {name: ‘Jose’, lastname: ‘Garfias’, age: 22}}

Type: En un indice podemos tener diferentes documentos y estos documentos a su vez pueden ser de diferente tipo o type. Imagina a type como un folder adentro de tu archivero (index), es otra capa mas de organización para tu información. La diferencia es que al usar Type todos los documentos en tu indice deben de ser consistentes en sus campos o fields, tienen que ser del mismo tipo de campo (String, Number, Geo). No puedes tener diferentes Types con el mismo, entre otras caracteristicas que puedes leer mas detalladamente en este LINK. Ejemplo: para un blog, puedes guardar toda tu información en un solo index y tener types para cada tipo de document como lo sería Post, Usuario y Comentarios.

Visualizando un ejemplo un poco mas practico, si tuvieramos que comparar nuestra estructura de elasticsearch con la de una base de datos relacional tendriamos una tabla de este tipo:

Mapping: Es la descripción de los campos de nuestro documento, el que tipo de valor es (String, Number, Geo) y como elasticsearch lo va a interpretar, si lo tiene que indexar o no, si vas a usar ese campo para buscar o no, etc. Elasticsearch por defecto detecta el tipo de dato al guardar cualquier documento y automaticamente crea el mapping para el documento, pero tener un mapping ya prestablecido y evaluado por nosotros nos ayuda mucho en cuanto a performance y organización, ya que ayuda a elasticsearch a comprender como debe tratar nuestra información de la manera correcta y no desperdiciar recursos indexando informacion que tal vez no necesitamos.

Shard: Los shards son piezas en las que puedes partir un indice, como lo habiamos mencionado un indice es el archivero donde guardas todos tus documentos, pero eventualmente este archivero se puede llenar a tal grado que puedas saturar la memoria de tu servidor o incluso los recursos ya no te sean suficientes para poder hacer busquedas sobre ese indice super enorme. Para evitar que esto suceda elasticsearch subdivide un indice en multiples piezas a las que se les llama shards, las cuales pueden ser distribuidas a traves de diferentes nodos del mismo servidor u otro en algun otro data center, lo que nos permite liberar espacio y recursos en nuestro servidor y compartirlo con algun otro, pero sin perder la organizacion de los datos.

Al momento de la creación del indice es importante mencionar cuantos numeros de shards va a tener dicho indice, ya que ese es el numero en el que se va a partir desde un inicio y va a empezar a indexar tu información, es importante escoger bien este numero ya que posteriormente no se puede editar. Debes de tomar en cuenta que tanto podrías llegar a llenar tu shard, para que te des una idea un shard lo maximo que puede almacenar son 2,147,483,519 de documentos.

Los shards tambien son importantes ya que te permiten escalar horizontalmente y liberar espacio entre servidores, tambien ayudan a el performance en cuanto a busquedas y consultas, mientras mas shards tengas distribuidos, elasticsearch paraleliza las tareas y se ejecutan mas rapido.

Replica Shard: Como su nombre lo dice, es una copia exacta de tu shard primario, funcionan en caso de que algún shard fallé por alguna razón, se caiga o se corrompa. Una replica puede tomar el lugar de un shard y entrar a salvar el dia.

Los replica shards igual se configuran al momento de crear tu indice, le indicas cuantas replicas quieres crear por shard de tu indice. Suponiendo que creas un indice con dos shards y dos replicas, tendrias un total de 6 shards (2 Originales, 2 replicas del primero, 2 replicas del segundo).

La replicación es importante para estar preparados ante cualquier contra tiempo que pueda ocurrir con los shards, y ademas tambien ayudan al momento de busqueda y querys.

¿Cómo Configurarlo?

Antes de empezar se necesita evaluar cual es la necesidad que tienes y cual es la mejor solución que se le puede dar usando elasticsearch. Si has llegado hasta este punto es por que piensas que es una buena opción para tu necesidad, es un buen comienzo pero todavia se necesitan evaluar unas cositas más para poder tener una estructura y configuración que pueda salir a producción.

Como primer punto necesitamos crear un mapping para nuestro documento, tienes que tener un modelo de tu documento base, verificar que ese modelo sea el mas pequeño en campos posible, y saber que tipo de dato es cada campo (String, Number, Array). Teniendo nuestro modelo base, hay que crear el mapping convirtiendo nuestro tipo de dato con el de elasticsearch (text, keyword, nested). Esto con la finalidad que elasticsearch tenga un mejor entendimiento de como procesar los documentos que vas a guardar. Como Tip, es mejor no indexar los campos que no vas a utilizar para búsquedas y que solo son de información.

Después necesimatos analizar cuantos documentos vas a guardar en elasticsearch, que tan grande es cada documento y que tan periodico se guardan estos documentos. Esto con el objetivo de configurar correctamente los Indices, Shards y las Replicas. Como advertencia, si estas tres características no se configuran de la manera correcta, elasticsearch te puede resultar un infierno que va a ser muy dificil de mantener y configurar.

Esta configuración depende mucho de tu necesidad, lo que los expertos recomiendan en un cluster saludable es, tener indices con un peso aproximado de 30–50 GB, no manejar mas de 600–750 shards por nodo y tener alrededor de 1 o 2 Replicas segun sea tu caso.

Para iniciar te recomiendo que configures a 1 shard y 1 replica cada nuevo indice que vas a crear y a partir de ahí con el tiempo vallas midiendo que tanto se llena tu indice y crees nuevos indices por tiempo, ya sea para organizarlos por mes o por trimestre, segun sea tu caso. En caso que requieras escalar, podrás crear los indices que continuen con un mayor numero de shards y replicas, pero para iniciar una buena configuración es dejarlo en 1 y 1.

¡Manos A la Obra! Instalando ElasticSearch

Instalación desde ElasticCloud : Es una opción muy rapida que en lo personal recomiendo para producción. Simplemente configuras el tamaño deseado de tu cluster y automaticamente te genera tus urls de tus servicios.

Instalación Manual desde algun sistema operativo:

En Windows (mas detalle)

  1. Descarga el archivo MSI o ejecutable desde este link.

2. Desde el terminal como administrador nos vamos a la ruta de la descarga y corremos el comando para instalar nuestro ejectuble.

3. Corremos la instancia de elasticsearch.

Instalando ElasticSearch en LINUX 16.04:

  1. Instalación de JAVA: Instalamos python-software-propertys para poder agregar repositorios facilmente, de ahí agregamos e instalamos el repositorio de java 8 y procedemos a instalar.

2. Instalación de ElasticSearch: Descargamos del repo oficial la ultima version y procedemos a instalar con la ayuda de apt-get.

3. Elasticsearch.yml tiene las configuraciones de tu cluster, de las cuales modifica el nombre del nodo y cluster, asi como la direccion IP del mismo.

4. Daemonizamos nuestro servicio de elasticsearch para que se encuentre siempre activo.

  1. Instalar KIBANA: Kibana es una gran herramienta que siempre va de la mano de elasticsearch, nos permitira correr querys de forma muy rápida, asi como vizualizar toda nuestra informacion y la salud de nuestro cluster.

2. En Kibana.yml encontraras las configuraciones del kibana, como anteriormente lo hicimos, tienes que cambiar estos valores.

3. Daemonizamos nuestro servicio de Kibana.

4. Instalamos y configuramos Ngnix. Esto con la finalidad de tener un mejor control sobre nuestro puerto donde expondremos nuestro kibana.

5. Configuramos nuestro servidor de Nginx.

6. Daemonizamos nuestro ngninx que tiene las configuraciones de nuestro servidor de kibana.

Conclusiones

Hasta este punto tendrás un cluster listo para empezar a jugar y tienes los conceptos básicos de elasticsearch para poder entender mejor su ecosistema y como funciona.

--

--