Clúster Elasticsearch. Logstash y Grafana. Análisis de logs. 1ra Parte.

En una serie de artículos expondremos como almacenar nuestros logs de los principales sistemas que tenemos en nuestras redes para su posterior análisis y para ello una de las mejores cosas que he visto es Elasticsearch como almacenamiento de los mismos, Logstash para filtrarlos y Grafana para construir dashboards espectaculares para dicho análisis. En esta primera parte solo veremos la instalación y configuración de un clúster Elasticsearch. Entremos entonces en materia.

¿Que es Elasticsearch?

Elasticsearch es un popular servidor de búsqueda de código abierto que se utiliza para la búsqueda distribuida en tiempo real y el análisis de datos. Cuando se usa para cualquier otra cosa que no sea desarrollo, Elasticsearch se debe implementar en varios servidores como un clúster, para obtener el mejor rendimiento, estabilidad y escalabilidad. Este tutorial le mostrará cómo instalar y configurar un clúster Elasticsearch de producción en Debian Stretch.

Nuestra configuración: configuración total de 6 servidores (Debian Streth) con direcciones IP estáticas.

  1. (nombre del servidor: es-master-01, es-master-02, es-master-03) Los servidores que servirán como maestros elegibles del clúster elasticsearch (estos nodos no recibirán registros)
  2. (nombre del servidor: es-data-01, es-data-02, es-data-03) Los servidores servirán como nodos de datos elásticaSearch

Estos son los requisitos previos para este tutorial:

  • Debian 9: la versión más reciente
  • Java 1.8.x
  • Elasticsearch 5.4.0
  • curl
  • A los nodos es-master-0x le asignaremos 2GB de RAM y a los es-data-0x 4GB de RAM.

Ejecute una actualización del sistema operativo para asegurarse de estar obteniendo las aplicaciones más recientes. (realice estos pasos para todos los servidores)

Nota: En nuestro caso usamos servidores virtuales LXC (linux containers) en Proxmox 5.1.

Escenario:

es-master-01.dominio.com ip: 192.168.1.160
es-master-02.dominio.com ip: 192.168.1.161
es-master-02.dominio.com ip: 192.168.1.162
es-data-01.dominio.com ip: 192.168.1.163
es-data-02.dominio.com ip: 192.168.1.164
es-data-03.dominio.com ip: 192.168.1.165

En caso que no tengamos server DNS que nos resuelva estos equipos o que falle nuestro servidor DNS siempre es mejor declarar estos equipos en /etc/hosts para que nuestro clúster no tenga fallas o simplemente usar números ips en nuestras configuraciones.

#nano /etc/hosts

Dentro agregamos además del nodo en cuestión los restantes en cada server.

192.168.1.160 es-master-01.dominio.com es-master-01
192.168.1.161 es-master-02.dominio.com es-master-02
192.168.1.162 es-master-03.dominio.com es-master-03
192.168.1.163 es-data-01.dominio.com es-data-01
192.168.1.164 es-data-02.dominio.com es-data-02
192.168.1.165 es-data-03.dominio.com es-data-03

Paso 1: instala Java 1.8.

En todos los nodos

Haremos la instalación de Java de forma manual. Nos descargamos del sitio de oracle el JDK o el JRE actual y procedemos de la siguente manera.
El directorio /opt está reservado para todos los paquetes de software y complementos que no forman parte de la instalación predeterminada. Crea un directorio para tu instalación JDK(JRE):

JRE:

#mkdir /opt/jre

y extrae java en el directorio:

#tar -zxf jre-8u131-linux-x64.tar.gz -C /opt/jre

Verifique que el archivo se haya extraído en el directorio /opt/jdk o /opt/jre.

#ls /opt/jre

Configuración de la JVM predeterminada. En nuestro caso, el ejecutable de Java se encuentra en /opt/jdk/jdk1.8.0_131/bin/java o en /opt/jre/jre1.8.0_131/bin/java dependiendo de lo que instalamos inicialmente. Para configurarlo como la JVM predeterminada en su máquina, ejecute:

#update-alternatives --install /usr/bin/java java /opt/jre/jre1.8.0_131/bin/java 100

JDK:

#mkdir /opt/jdk

#tar -zxf jdk-8u131-linux-x64.tar.gz -C /opt/jdk

#ls /opt/jdk

#update-alternatives --install /usr/bin/javac javac /opt/jdk/jdk1.8.0_131/bin/javac 100

Verificando tu instalación de java.

#java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)

Nota: Sugerimos JRE en virtud de ahorrar recursos ya que JDK esta orientada para desarrollo.

Paso 2: Instalar Elasticsearch:

En todos los nodos.

Instalamos el paquete curl para consultar luego nuestro elasticsearch

apt-get install curl

Descargamos elasticsearch

#wget -t0 -c https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.4.0.deb

Y lo instalamos:

#dpkg -i elasticsearch-5.4.0.deb

Lo siguiente solo lo haremos en los nodos master:

Lo recomendado es darle la mitad a ES_HEAP_SIZE y la otra mitad para el sistema operativo y como estos 3 nodos master van a tener 2GB de RAM editamos jvm.options para que arranque el elasticsearch con 1 GB de ES_HEAP_SIZE ya que por defecto viene seteado a 2GB.

#nano /etc/elasticsearch/jvm.options

y editamos lo siguiente de:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms2g
-Xmx2g

a:

# Xms represents the initial size of total heap space
# Xmx represents the maximum size of total heap space

-Xms1g
-Xmx1g

Paso 3: configurar el servicio de elasticsearch para que se inicie automáticamente.

En todos los nodos.

#systemctl daemon-reload
#systemctl enable elasticsearch.service

Arrancamos el servicio

#service elasticsearch start

Step 4: Probando Elasticsearch

En todos los nodos

Ejecutamos desde la terminal lo siguente:

#curl http://localhost:9200

Y obtenemos lo siguiente

{
"version" : {
"number" : "5.4.0",
"build_hash" : "780f8c4",
"build_date" : "2017-04-28T17:43:27.229Z",
"build_snapshot" : false,
"lucene_version" : "6.5.0"
},
"tagline" : "You Know, for Search"
}

Y veremos que nuestro elasticsearch de este nodo esta corriendo

Paso5: Configurando Elasticsearch

En todos los nodos.

Editamos el fichero elasticsearch.yml y modificamos los aspectos siguientes

#nano /etc/elasticsearch/elasticsearch.yml

En todos los nodos el nombre del clúster que debe ser el mismo.

cluster.name: Mi-cluster

El nombre del nodo (es-master-01, es-master-02, es-master-03, es-data-01, es-data-02, es-data-03). Por ejemplo nodo es-master-01:

node.name: es-master-01

Activar mlockall

bootstrap.memory_lock: true

La ip del nodo en cuestión

network.host: 192.x.x.x

Descubrimiento unicast de los nodos del clúster ya sean master o de datos

discovery.zen.ping.unicast.hosts: ["es-master-01", "es-master-02","es-master-03", "es-data-01", "es-data-02", "es-data-03"]

Número mínimo de nodos maestros elegibles que un nodo debe «ver» para operar dentro del clúster. Existe un fórmula general para determinar el mínimo de maestros elegibles (Número de nodos maestros elegibles/2) + 1. Si tiene 2 nodos master, se encuentra en un enigma, según la fórmula el quorum sería 2, pero esto significa que la pérdida de un nodo hará que su clúster no funcione correctamente y no se protege contra del split brain causando pérdida de datos y conflictos entre los nodos maestros. Lo mejor es tener un mínimo de 3 nodos master elegibles en situaciones como esta. Con 3 nodos elegibles para el maestro, los nodos maestros mínimos deben establecerse en (3/2) + 1 y se toma la parte entera en este caso 2 siendo el quorum de maestros mínimos elegibles y así protegeriamos nuestro clúster contra perdida de datos y conflictos entre los nodos maestros ante un corte de red y otras causas.

discovery.zen.minimum_master_nodes: 2

Guardamos los cambios hechos en el fichero elasticsearch.yml

Ahora vamos a modificar el servicio de elasticsearch

#nano /usr/lib/systemd/system/elasticsearch.service

y descomentamos o adicionamos la linea

LimitMEMLOCK=infinity

Editamos los valores default de elastisearch

#nano /etc/default/elasticsearch

y descomentamos la linea siguente:

MAX_LOCKED_MEMORY=unlimited

y seguidamente para que se establezcan estos cambios al inicio

#systemctl daemon-reload

Elasticsearch utiliza un directorio mmapfs de forma predeterminada para almacenar sus índices. Es probable que los límites predeterminados del sistema operativo en los recuentos de mmap sean demasiado bajos, lo que puede provocar excepciones por falta de memoria por lo que tenemos que aunmentar la memoria virtual a este valor recomendado.
Editamos el fichero sysctl.conf

#nano /etc/sysctl.conf

y añadir lo siguiente

vm.max_map_count=262144

y para hacer efectivo el valor que agregamos ejecutamos lo siguente:

#sysctl -p

Nota: En nuestro caso que virtualizamos en proxmox este valor debe ser modificado en el propio equipo para que los contenedores LXC asuman este valor.

Paso 6: Definiendo roles en nuestro clúster

Nodos maestro dedicados: Estos tipos de nodos tienen muy bajo consumo de recursos ya que solo se dedican a la administración del clúster y no reciben tareas de indexación o búsqueda.
En los nodos es-master-01, es-master-02 y es-master-03 editamos elasticsearch.yml.

#nano /etc/elasticsearch/elasticsearch.yml

y agregamos

node.master: true
node.data: false

Nodos de datos dedicados: Estos nodos solamente como su nombre lo indica almacenarán datos. Nuestros nodos de datos son es-data-01, es-data-02 y es-data-03, en estos editamos elasticsearch.yml

#nano /etc/elasticsearch/elasticsearch.yml

y agregamos

node.master: false
node.data: true

Ya tenemos todos los nodos configurados para arrancar por primera vez nuestro clúster entonces en cada uno de ellos reiniciamos el servicio de elasticsearch

#service elasticsearch restart

Consultemos ahora la salud de nuestro clúster.

#curl -XGET http://localhost:9200/_cluster/health?pretty

Obtenemos lo siguiente

{
"cluster_name" : "Mi-cluster",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 6,
"number_of_data_nodes" : 3,
"active_primary_shards" :0,
"active_shards" : 0,
"relocating_shards" : 0,
"initializing_shards" : 0,
"unassigned_shards" : 0,
"delayed_unassigned_shards" : 0,
"number_of_pending_tasks" : 0,
"number_of_in_flight_fetch" : 0,
"task_max_waiting_in_queue_millis" : 0,
"active_shards_percent_as_number" : 0
}

El estado green significa que todo esta en orden con nuestro clúster.

Ahora vamos a hacer amigable nuestra interacción con el clúster a través de cerebro para el cual podemos dedicar una máquina aparte para ello o simplemente instalarlo en nuestra propia estación de trabajo.

wget -t0 -c https://github.com/lmenezes/cerebro/releases/download/v0.6.5/cerebro-0.6.5.tgz

Creamos una carpeta al efecto en opt

#mkdir /opt/cerebro

y extraemos el archivo descargado en la misma

#tar -zxf cerebro-0.6.5.tgz -C /opt/cerebro

Si queremos ejecutarlo vamos directamente a la carpeta bin

#cd /opt/cerebro-0.6.5/bin
#./cerebro

Abrimos en nuestro navegador http://ipserver:9000

Elegimos el nodo master del clúster al cual nos vamos a conectar. Ej:http://192.168.1.160:9200

Si seleccionamos nodes veremos los 6 nodos del clúster:

En otro artículo veremos como poner cerebro en arranque al inicio del sistema.

¿De cuánta utilidad te ha parecido este contenido?

¡Haz clic en una estrella para puntuar!

Promedio de puntuación 5 / 5. Recuento de votos: 1

Hasta ahora, ¡no hay votos!. Sé el primero en puntuar este contenido.

2 comentarios

  1. Google Chrome 71.0.3578.98 Google Chrome 71.0.3578.98 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36

    Why would you just copy paste like a total newbie? Being sys admins you show know, the indentation is so important. You literally made a good job, a totally pathetic hack presentation.

  2. Google Chrome 67.0.3396.62 Google Chrome 67.0.3396.62 Windows 10 x64 Edition Windows 10 x64 Edition
    Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36

    Hola amigo, no pueden crear este tutorial otra vez por que los codigo de los cuatro tutoriales esta regado y cuando se copian para los config dan error o pongan donde se pueden descargar esto config.
    Saludo desde la Isla

Responder a John Thambi Cancelar la respuesta

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


*