Elasticsearch es un motor de búsqueda y análisis de datos open source basado en Apache Lucene y desarrollado en Java, que utiliza una arquitectura REST distribuida. Elasticsearch permite realizar y combinar diferentes tipos de búsqueda, desde una consulta simple hasta un mayor nivel de profundidad. Al mismo tiempo que permite explorar tendencias y patrones en grandes conjuntos de datos a través de agregaciones.

Este artículo explica cómo instalar y configurar Elasticsearch en un sistema basado en Debian desde el paquete .deb.

Primer artículo sobre bigdata en este blog. ¿Qué es bigdata? Vaya uno a saber: bigdata - Google Search.

Elasticsearch es el motor de búsqueda más utilizado a nivel empresarial seguido por Apache Solr. En conjunto con el motor de recolección de datos y análisis de archivos de log Logtash, y la plataforma de análisis y visualización de datos Kibana, conforman la pila "Elastic Stack".

Desde el punto de vista técnico, Elasticsearch provee un motor de búsqueda full-text de casi tiempo real accesible a través de una interfaz Web HTTP, y utiliza documentos JSON. Este motor es escalable debido a que se puede implementar de manera distribuida, dividiendo los índices en particiones horizontales (shards) conteniendo una o más réplicas cada una. En este esquema distribuido cada nodo puede hospedar una o más particiones y actuar como coordinador para delegar búsquedas. Todas sus características están disponibles a través una API Java que utiliza el formato JSON.

Ahora bien, ¿por qué querría utilizar Elasticsearch en mi organización? ¿Para qué puede ser útil? A diferencia de las bases de datos relacionales estructuradas (RDBMS), Elasticsearch es una base de datos NoSQL distribuida. Esto significa que en lugar de tablas y esquemas está basada en documentos. Elasticsearch almacena, obtiene y gestiona documentos, cientos y miles de ellos. El objetivo de Elasticsearch entonces, es buscar y analizar la información contenida en millones de documentos, los cuales no poseen un formato o estructura. Por esta razón se utiliza el formato JSON para manejar los datos.

Elasticsearch puede ser utilizado en aplicaciones de data warehouse. Esto es aplicaciones donde se cuenta con cientos, miles o millones de documentos almacenados con diferentes atributos y esquemas no predecibles, y se desea poder buscar información y analizar los datos de forma rápida y sencilla. Este es el caso de por ejemplo CKAN, una herramienta de data warehouse que hace uso de Apache Solr en lugar de Elasticseach (por cierto, el artículo Instalación de CKAN desde los fuentes en Debian 7 cubre la instalación y configuración de Apache Solr).

En una base de datos relacional, los datos suelen estar estructurados. Por ejemplo tenemos una tabla de usuarios que posee la columna "nombre" donde podemos buscar (a través de una consulta SQL) todos los usuarios cuyo nombre comienza con "Juan". En cambio en las bases de datos orientadas a documentos (NoSQL) no hay tablas sino que, por ejemplo, tenemos un repositorio de archivos en formatos varios (texto plano, PDF, etc.) y deseamos buscar todos los documentos cuyo autor es "Juan Topo" o incluso buscar información específica dentro de los mismos.

Veamos entonces cómo es el proceso de instalación de un servidor Elasticsearch en un sistema basado en Debian, en este caso se trata de Devuan 2.0 ASCII pero es exactamente igual en Debian 9. Para el caso de sistemas basados en CentOS, pueden encontrar un buen tutorial en el blog de davidochobits.

Manos a la obra

Descargar y verificar el paquete .deb:

# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.deb
# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.0.deb.sha512
# shasum -a 512 -c elasticsearch-6.4.0.deb.sha512 

La verificación del checksum garantiza que el paquete haya sido descargado correctamente y debe retornar "OK":

root@devuan:/home/emi# shasum -a 512 -c elasticsearch-6.4.0.deb.sha512
elasticsearch-6.4.0.deb: OK

Instalar el paquete con el gestor dpkg:

# dpkg -i elasticsearch-6.4.0.deb

Habilitar e iniciar el servicio:

# update-rc.d elasticsearch defaults
# service elasticsearch start

Si se trata de un sistema Debian con systemd, ejecutar en cambio:

# systemctl daemon-reload
# systemctl enable elasticsearch.service
# systemctl start elasticsearch.service

Una vez el servicio inicia correctamernte:

root@devuan:/home/emi# service elasticsearch start
[ ok ] Starting Elasticsearch Server:.

Es posible verificar que el proceso Java está corriendo:

root@devuan:/home/emi# ps aux | grep "[e]lastic"
elastic+  3280 63.4 62.4 3138324 1281548 pts/0 Sl   09:58   1:03 /usr/bin/java -Xms1g -Xmx1g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+AlwaysPreTouch -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -XX:-OmitStackTraceInFastThrow -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Djava.io.tmpdir=/tmp/elasticsearch.3H46aZr5 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/lib/elasticsearch -XX:ErrorFile=/var/log/elasticsearch/hs_err_pid%p.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCApplicationStoppedTime -Xloggc:/var/log/elasticsearch/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=32 -XX:GCLogFileSize=64m -Des.path.home=/usr/share/elasticsearch -Des.path.conf=/etc/elasticsearch -Des.distribution.flavor=default -Des.distribution.type=deb -cp /usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -d -p /var/run/elasticsearch/elasticsearch.pid
elastic+  3314  0.0  0.3 135464  7332 pts/0    Sl   09:58   0:00 /usr/share/elasticsearch/modules/x-pack-ml/platform/linux-x86_64/bin/controller

Y se encuentran abiertos los puertos TCP/IP 9200 y 9300:

root@devuan:/home/emi# netstat -plant | grep java
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      3280/java
tcp6       0      0 ::1:9200                :::*                    LISTEN      3280/java
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      3280/java
tcp6       0      0 ::1:9300                :::*                    LISTEN      3280/java

El puerto 9200 es utilizado para el protocolo REST, a través del cual se comunican los clientes con el cluster Elasticsearch vía HTTP. El puerto 9300 es utilizado para la intercomunicación entre los nodos del cluster.

La configuración de Elasticseach se encuentra en el directorio /etc/elasticsearch/:

root@devuan:/home/emi# ll /etc/elasticsearch/
total 40
drwxr-s---   2 root elasticsearch 4096 sep 28 09:27 .
drwxr-xr-x 111 root root          4096 sep 28 09:26 ..
-rw-rw----   1 root elasticsearch  207 sep 28 09:27 elasticsearch.keystore
-rw-r--r--   1 root elasticsearch   76 sep 28 09:27 .elasticsearch.keystore.initial_md5sum
-rw-rw----   1 root elasticsearch 2869 ago 17 20:23 elasticsearch.yml
-rw-rw----   1 root elasticsearch 3009 ago 17 20:23 jvm.options
-rw-rw----   1 root elasticsearch 6380 ago 17 20:23 log4j2.properties
-rw-rw----   1 root elasticsearch  473 ago 17 20:23 role_mapping.yml
-rw-rw----   1 root elasticsearch  197 ago 17 20:23 roles.yml
-rw-rw----   1 root elasticsearch    0 ago 17 20:23 users
-rw-rw----   1 root elasticsearch    0 ago 17 20:23 users_roles

El archivo elasticsearch.yml almacena la configuración de las rutas a directorios de datos y archivos de log. Por defecto en Debian y derivados, los datos se almacenan en el directorio /var/lib/elasticsearch. El archivo jvm.options define las opciones para la máquina virtual JAva, tales como tamaño del heap y logging.

Verificar el funcionamiento

Es posible verificar el funcionamiento de forma simple haciendo una solicitud HTTP a través de netcat o telnet al puerto 9200:

root@devuan:/home/emi# nc -vv localhost 9200
localhost [127.0.0.1] 9200 (?) open
GET / HTTP/1.1

HTTP/1.1 200 OK
content-type: application/json; charset=UTF-8
content-length: 493

{
  "name" : "5rwHruB",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "_iZe2UIsRwCMhnVRGLrLdw",
  "version" : {
    "number" : "6.4.0",
    "build_flavor" : "default",
    "build_type" : "deb",
    "build_hash" : "595516e",
    "build_date" : "2018-08-17T23:18:47.308994Z",
    "build_snapshot" : false,
    "lucene_version" : "7.4.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}
^C sent 16, rcvd 580

Próximamente veremos cómo indexar en un cluster Elasticsearch y cómo ejecutar consultas sobre los datos indexados.

Referencias


Tal vez pueda interesarte


Compartí este artículo