Paso a paso

ElasticSearch 5

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

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 elasticsearchpara 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 búsquedas 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 búsquedas muy rápida 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 fácil y rápida.

Visualización de datos: Elasticsearch también cuenta con kibana, una herramienta para explorar y visualizar todos tus datos, así como también podrás hacer análisis y gráficas circulares, lineales o histogramas, todo en un mismo lugar.

¿Que es ElasticSearch?

Diagrama Indice Invertido

Definición: Es un motor de búsqueda 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 tecnología 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 así 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 básicos: Para poder entender un poco mas como funciona elasticsearch, necesitamos primero entender los conceptos básicos 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, pueden 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 características 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 minúsculas. Imagina al indice o index como un archivero o cajón 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, según 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 LINKEjemplo: 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 tuviéramos que comparar nuestra estructura de elasticsearch con la de una base de datos relacional tendríamos 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 información que tal vez no necesitamos.

Shard: Los shards son piezas en las que puedes partir un indice, como lo habíamos 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 búsquedas sobre ese indice super enorme. Para evitar que esto suceda elasticsearch subdivide un indice en múltiples piezas a las que se les llama shards, las cuales pueden ser distribuidas a través 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 algún otro, pero sin perder la organización de los datos.

Al momento de la creación del indice es importante mencionar cuantos números 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 también son importantes ya que te permiten escalar horizontalmente y liberar espacio entre servidores, también ayudan a el performance en cuanto a búsquedas y consultas, mientras mas shards tengas distribuidos, elasticsearch paraleliza las tareas y se ejecutan mas rápido.

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 día.

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, tendrías 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 también ayudan al momento de búsqueda 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 todavía 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 necesitamos analizar cuantos documentos vas a guardar en elasticsearch, que tan grande es cada documento y que tan periódico 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 según 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, según sea tu caso. En caso que requieras escalar, podrás crear los indices que continúen 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 rápida que en lo personal recomiendo para producción. Simplemente configuras el tamaño deseado de tu cluster y automáticamente te genera tus urls de tus servicios.

https://cloud.elastic.co

Instalación Manual desde algun sistema operativo:

En Windows (mas detalle)

  1. Descarga el archivo MSI o ejecutable desde este link.
https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.2.msi

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

start /wait msiexec.exe /i elasticsearch-5.6.2.msi /qn /l install.log

3. Corremos la instancia de elasticsearch.

.\bin\elasticsearch.exe -E cluster.name=my_cluster -E node.name=node_1

Instalando ElasticSearch en LINUX 16.04:

  1. Instalación de JAVA: Instalamos python-software-propertys para poder agregar repositorios fácilmente, de ahí agregamos e instalamos el repositorio de java 8 y procedemos a instalar.
sudo apt-get update
sudo apt-get install -y python-software-properties software-properties-common apt-transport-https
sudo add-apt-repository ppa:webupd8team/java -y
sudo apt-get update
sudo apt-get install -y oracle-java8-installer
java -version

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

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list
sudo apt-get update
sudo apt-get install -y elasticsearch

3. Elasticsearch.yml tiene las configuraciones de tu cluster, de las cuales modifica el nombre del nodo y cluster, así como la dirección IP del mismo.

sudo nano /etc/elasticsearch/elasticsearch.yml
cluster.name: "cluster_name"
node.name: "node_name"
network.host: localhost

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

sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch
  1. Instalar KIBANA: Kibana es una gran herramienta que siempre va de la mano de elasticsearch, nos permitirá correr querys de forma muy rápida, así como visualizar toda nuestra información y la salud de nuestro cluster.
sudo apt-get install -y kibana

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

sudo nano /etc/kibana/kibana.yml
server.port: 5601
server.host: "localhost"
elasticsearch.url: "http://localhost:9200"

3. Daemonizamos nuestro servicio de Kibana.

sudo systemctl enable kibana
sudo systemctl start kibana

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

sudo apt-get install -y nginx apache2-utils

5. Configuramos nuestro servidor de Nginx.

cd /etc/nginx/
sudo nano sites-available/kibana
server {
    listen 80;
 
    server_name kibana;
 
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.kibana-user;
 
    location / {
        proxy_pass http://localhost:5601;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

sudo htpasswd -c /etc/nginx/.kibana-user admin
AQUI INSERTAS TU CONTRASEÑA

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

ln -s /etc/nginx/sites-available/kibana /etc/nginx/sites-enabled/
nginx -t
systemctl enable nginx
systemctl restart nginx

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.