Gestión de Registros · 20 min read · Feb 02, 2026

Instalar ELK como Servidor de Gestión de Archivos de Registro Centralizado en CentOS 7

Este tutorial explica cómo configurar un servidor de gestión de archivos de registro centralizado utilizando la pila ELK en CentOS 7. Como cualquiera que no lo sepa, ELK es la combinación de 3 servicios: ElasticSearch, Logstash y Kibana. Para construir un servidor completo de gestión de registros centralizado utilizando este concepto, se requeriría tener cada uno de estos paquetes ya que cada uno cumple un propósito diferente y está relacionado entre sí. Básicamente, funciona de la siguiente manera:

  1. Para cada cliente que desee gestionar, producirá su propio registro de servicios relacionados.
  2. Para el servidor que se utilizará para gestionar toda la información de registro de cada cliente, utilizará el paquete LogStash para recopilar y transformar los datos a un valor relativo. Por definición, es un pipeline de procesamiento de datos del lado del servidor de código abierto que ingiere datos de una multitud de fuentes simultáneamente, los transforma.
  3. Una vez que los datos son recopilados y transformados, el servidor de gestión utilizará ElasticSearch para ayudar a analizar los datos a un valor relevante. Puede utilizar un lenguaje de consulta general si desea producir un informe relacionado según sea necesario.
  4. A medida que los datos relacionados son verificados y analizados, aquí es donde entra en juego el paquete Kibana, ya que puede ayudar a visualizar y gestionar los datos relevantes en una vista adecuada o combinarlos en un panel atractivo deseable para una fácil comprensión.

La imagen a continuación resume el proceso de flujo de trabajo:

1. Nota Preliminar

Para este tutorial, estoy utilizando CentOS Linux 7.4 en la versión de 64 bits. En este tutorial utilizaremos 3 servidores: el primero se utilizará como servidor de gestión y los otros 2 se utilizarán como clientes. Para este ejercicio, utilizaremos el servidor de gestión para monitorear un servicio MySQL existente que ya ha sido configurado y está funcionando en cada cliente. Como MySQL es un servicio de base de datos que se utiliza principalmente para propósitos OLTP, haremos que nuestro servidor de gestión registre 2 procesos de registro que son la verificación de salud del propio servicio MySQL y la transacción de consulta lenta. Al final de este tutorial, veremos que cualquier información registrada de cualquier servicio MySQL dentro del cliente dedicado puede ser vista, visualizada y analizada simultáneamente desde el servidor de gestión en tiempo real.

2. Fase de Instalación

Para la fase de instalación, comenzaremos con la instalación de FileBeat en ambos servidores de base de datos MySQL que actúan como clientes. Comencemos el proceso, a continuación se presentan los pasos:

 [root@mysql_db1 opt]# cd   
[root@mysql_db1 ~]# cd /opt/   
[root@mysql_db1 opt]# wget https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.1-x86_64.rpm   
--2018-06-09 10:50:46-- https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.2.1-x86_64.rpm   
Resolviendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.253.15, 184.73.245.233, ...   
Conectando a artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... conectado.   
Solicitud HTTP enviada, esperando respuesta... 200 OK   
Longitud: 12697093 (12M) [binary/octet-stream]   
Guardando en: ‘filebeat-6.2.1-x86_64.rpm’   
  
100%[==============================================================================>] 12,697,093 2.20MB/s en 6.9s   
  
2018-06-09 10:51:00 (1.75 MB/s) - ‘filebeat-6.2.1-x86_64.rpm’ guardado [12697093/12697093]   
  
[root@mysql_db1 opt]# yum localinstall -y filebeat-6.2.1-x86_64.rpm   
Cargando plugins: fastestmirror, ovl   
Examinando filebeat-6.2.1-x86_64.rpm: filebeat-6.2.1-1.x86_64   
Marcando filebeat-6.2.1-x86_64.rpm para ser instalado   
Resolviendo Dependencias   
--> Ejecutando verificación de transacción   
---> Paquete filebeat.x86_64 0:6.2.1-1 será instalado   
--> Finalizada la Resolución de Dependencias   
  
Dependencias Resueltas   
  
========================================================================================================================   
Paquete Arquitectura Versión Repositorio Tamaño   
========================================================================================================================   
Instalando:   
filebeat x86_64 6.2.1-1 /filebeat-6.2.1-x86_64 49 M   
  
Resumen de Transacción   
========================================================================================================================   
Instalar 1 Paquete   
  
Tamaño total: 49 M   
Tamaño instalado: 49 M   
Descargando paquetes:   
Ejecutando verificación de transacción   
Ejecutando prueba de transacción   
La prueba de transacción tuvo éxito   
Ejecutando transacción   
Instalando : filebeat-6.2.1-1.x86_64 1/1   
Verificando : filebeat-6.2.1-1.x86_64 1/1   
  
Instalado:   
filebeat.x86_64 0:6.2.1-1   
  
¡Completo!   

Una vez hecho esto, enumeraremos el módulo predeterminado que se habilita por el paquete FileBeat y habilitaremos el módulo mysql que es necesario para nuestros casos aquí. A continuación se presentan los pasos:

 [root@mysql_db1 opt]# filebeat modules list   
Habilitado:   
  
Deshabilitado:   
apache2   
auditd   
icinga   
kafka   
logstash   
mysql   
nginx   
osquery   
postgresql   
redis   
system   
traefik   
[root@mysql_db1 opt]# filebeat modules enable mysql   
Habilitado mysql   

Hecho, ahora editemos la configuración necesaria para el módulo mysql que acabamos de habilitar. Por defecto, una vez que hemos habilitado el módulo mysql del paquete filebeat, se creará automáticamente un archivo yaml dentro del directorio modules.d. Sin embargo, si el archivo no fue creado, siéntase libre de crear un nuevo archivo yaml en la misma ubicación. A continuación se presentan los pasos:

 [root@mysql_db1 opt]# vi /etc/filebeat/modules.d/mysql.yml   
- module: mysql   
error:   
enabled: true   
var.paths: ["/var/lib/mysql/mysql-error.log*"]   
  
slowlog:   
enabled: true   
var.paths: ["/var/lib/mysql/log-slow-queries.log*"]   

Como se muestra arriba, hemos decidido registrar 2 procesos de registro del servicio MySQL que son la verificación de salud de la base de datos y el registro de consultas lentas.

Ahora, una vez que todo esté listo, hagamos algunas configuraciones dentro del archivo de configuración principal para filebeat bajo el archivo filebeat.yml. A continuación se establece la configuración:

 [root@mysql_db1 opt]# vi /etc/filebeat/filebeat.yml   
#=========================== Prospectores de Filebeat =============================   
  
filebeat.prospectors:   
  
- type: log   
  
enabled: false   
paths:   
- /var/lib/mysql/mysql-error.log   
- /var/lib/mysql/log-slow-queries.log   
  
#============================= Módulos de Filebeat ===============================   
  
filebeat.config.modules:   
path: ${path.config}/modules.d/*.yml   
reload.enabled: false   
  
#==================== Configuración de plantilla de Elasticsearch ==========================   
  
setup.template.settings:   
index.number_of_shards: 3   
  
#================================ General =====================================   
  
setup.kibana:   
  
#----------------------------- Salida de Logstash --------------------------------   
output.logstash:   
hosts: ["172.17.0.6:5044"]   

Observe que en lo anterior hemos establecido una dirección IP para el host de logstash que es 172.17.0.6. Esta IP es la dirección de nuestro servidor de gestión centralizado que se conectará directamente para recopilar los datos de registro. He establecido la IP codificada ya que no hice ningún cambio alternativo en el archivo /etc/hosts y no utilicé ningún servidor DNS para este tutorial. Sin embargo, siéntase libre de usar el nombre de host del servidor de gestión si ha realizado los cambios alternativos.

Como todo ha sido configurado según lo planeado, comencemos los servicios de filebeat. A continuación se presentan los pasos:

 [root@mysql_db1 opt]# filebeat setup -e   
2018-06-09T11:04:37.277Z INFO instance/beat.go:468 Ruta de inicio: [/usr/share/filebeat] Ruta de configuración: [/etc/filebeat] Ruta de datos: [/var/lib/filebeat] Ruta de registros: [/var/log/filebeat]   
2018-06-09T11:04:37.277Z INFO instance/beat.go:475 UUID de Beat: 98503460-035e-4476-8e4d-10470433dba5   
2018-06-09T11:04:37.277Z INFO instance/beat.go:213 Configuración de Beat: filebeat; Versión: 6.2.1   
2018-06-09T11:04:37.277Z INFO pipeline/module.go:76 Nombre de Beat: lara   
2018-06-09T11:04:37.278Z ERROR instance/beat.go:667 Saliendo: Se solicitó la carga de plantilla, pero la salida de Elasticsearch no está configurada/habilitada   
Saliendo: Se solicitó la carga de plantilla, pero la salida de Elasticsearch no está configurada/habilitada   
  
[root@mysql_db1 opt]# filebeat -e &   
[1] 22010   
[root@mysql_db1 opt]# 2018-06-09T12:45:18.812Z INFO instance/beat.go:468 Ruta de inicio: [/usr/share/filebeat] Ruta de configuración: [/etc/filebeat] Ruta de datos: [/var/lib/filebeat] Ruta de registros: [/var/log/filebeat]   
2018-06-09T12:45:18.813Z INFO instance/beat.go:475 UUID de Beat: 98503460-035e-4476-8e4d-10470433dba5   
2018-06-09T12:45:18.813Z INFO instance/beat.go:213 Configuración de Beat: filebeat; Versión: 6.2.1   
2018-06-09T12:45:18.813Z INFO pipeline/module.go:76 Nombre de Beat: lara   
2018-06-09T12:45:18.813Z INFO [monitoring] log/log.go:97 Iniciando registro de métricas cada 30s   
2018-06-09T12:45:18.813Z INFO instance/beat.go:301 filebeat comenzando a ejecutarse.   
2018-06-09T12:45:18.814Z INFO registrar/registrar.go:71 No se encontró archivo de registro bajo: /var/lib/filebeat/registry. Creando un nuevo archivo de registro.   
2018-06-09T12:45:18.819Z INFO registrar/registrar.go:108 Cargando datos del registrador desde /var/lib/filebeat/registry   
2018-06-09T12:45:18.819Z INFO registrar/registrar.go:119 Estados cargados desde el registrador: 0   
2018-06-09T12:45:18.819Z WARN beater/filebeat.go:261 Filebeat no puede cargar los pipelines de Ingest Node para los módulos configurados porque la salida de Elasticsearch no está configurada/habilitada. Si ya ha cargado los pipelines de Ingest Node o está utilizando pipelines de Logstash, puede ignorar esta advertencia.   
2018-06-09T12:45:18.820Z INFO crawler/crawler.go:48 Cargando Prospectores: 1   
2018-06-09T12:45:18.821Z INFO log/prospector.go:111 Rutas configuradas: [/var/lib/mysql/log-slow-queries.log*]   
2018-06-09T12:45:18.822Z INFO log/prospector.go:111 Rutas configuradas: [/var/lib/mysql/mysql-error.log*]   
2018-06-09T12:45:18.822Z INFO crawler/crawler.go:82 Carga y inicio de Prospectores completados. Prospectores habilitados: 0   
2018-06-09T12:45:18.822Z INFO cfgfile/reload.go:127 Recargador de configuración iniciado   
2018-06-09T12:45:18.840Z INFO log/prospector.go:111 Rutas configuradas: [/var/lib/mysql/log-slow-queries.log*]   
2018-06-09T12:45:18.840Z INFO log/prospector.go:111 Rutas configuradas: [/var/lib/mysql/mysql-error.log*]   
2018-06-09T12:45:18.840Z INFO cfgfile/reload.go:258 Iniciando 1 corredores ...   
2018-06-09T12:45:18.840Z INFO cfgfile/reload.go:219 Carga de archivos de configuración completada.   
2018-06-09T12:45:18.841Z INFO log/harvester.go:216 Cosechador iniciado para el archivo: /var/lib/mysql/mysql-error.log   
2018-06-09T12:45:18.841Z INFO log/harvester.go:216 Cosechador iniciado para el archivo: /var/lib/mysql/log-slow-queries.log   
2018-06-09T12:45:20.841Z ERROR pipeline/output.go:74 Falló la conexión: dial tcp 172.17.0.6:5044: getsockopt: conexión rechazada   
2018-06-09T12:45:22.842Z ERROR pipeline/output.go:74 Falló la conexión: dial tcp 172.17.0.6:5044: getsockopt: conexión rechazada   
2018-06-09T12:45:26.842Z ERROR pipeline/output.go:74 Falló la conexión: dial tcp 172.17.0.6:5044: getsockopt: conexión rechazada   
  
[root@mysql_db1 ~]# tail -f /var/log/filebeat/filebeat   
2018-06-09T10:53:28.853Z INFO instance/beat.go:468 Ruta de inicio: [/usr/share/filebeat] Ruta de configuración: [/etc/filebeat] Ruta de datos: [/var/lib/filebeat] Ruta de registros: [/var/log/filebeat]   
2018-06-09T10:53:28.853Z INFO instance/beat.go:475 UUID de Beat: 98503460-035e-4476-8e4d-10470433dba5   

Observe que una vez que inicie el servicio filebeat, hay un error mostrado en el registro. Esto se debió a que el servidor de gestión asignado no estaba configurado aún. Para la fase inicial, puede ignorar el registro de errores ya que se recuperará automáticamente una vez que nuestro servidor de gestión haya sido configurado y comenzado a rastrear.

Como la configuración para la base del cliente está hecha, puede continuar replicando los pasos en el otro servidor MySQL que también actúa como cliente.

Avanzando, continuaremos con la configuración del servidor de gestión en sí.

3. Fase de Instalación (Lado del Servidor de Gestión Centralizado)

Ahora que hemos terminado de configurar la preparación del lado del cliente, iniciemos la configuración necesaria para el servidor de gestión en sí. Como se mencionó brevemente, hay 3 paquetes principales que necesitan ser instalados y configurados para el servidor de gestión, que son ElasticSearch, LogStash y Kibana.

Para esta fase, comenzaremos la instalación y configuración necesarias para ElasticSearch primero, a continuación se presentan los pasos:

 [root@elk_master ~]# cd /opt/   
[root@elk_master opt]# ls   
[root@elk_master opt]# wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.1.tar.gz   
--2018-06-09 12:47:59-- https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.2.1.tar.gz   
Resolviendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 54.235.82.130, 107.21.253.15, ...   
Conectando a artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... conectado.   
Solicitud HTTP enviada, esperando respuesta... 200 OK   
Longitud: 29049089 (28M) [binary/octet-stream]   
Guardando en: ‘elasticsearch-6.2.1.tar.gz’   
  
100%[==============================================================================>] 29,049,089 2.47MB/s en 16s   
  
2018-06-09 12:48:21 (1.76 MB/s) - ‘elasticsearch-6.2.1.tar.gz’ guardado [29049089/29049089]   
  
[root@elk_master opt]#   
[root@elk_master opt]#   
[root@elk_master opt]# tar -zxvf elasticsearch-6.2.1.tar.gz   
  
[root@elk_master opt]# ln -s /opt/elasticsearch-6.2.1 /opt/elasticsearch   
[root@elk_master opt]# ll   
total 28372   
lrwxrwxrwx 1 root root 24 Jun 9 12:49 elasticsearch -> /opt/elasticsearch-6.2.1   
drwxr-xr-x 8 root root 143 Feb 7 19:36 elasticsearch-6.2.1   
-rw-r--r-- 1 root root 29049089 May 15 04:56 elasticsearch-6.2.1.tar.gz   

Como la instalación de elasticsearch está hecha, continuemos con la parte de configuración. Para la parte de configuración, asignaremos el directorio /data/data para almacenar los datos de registro recopilados que han sido analizados. El directorio también se utilizará para almacenar índices que serán utilizados por elasticSearch para consultas más rápidas. El directorio /data/logs se utilizará por elasticSearch para sus propios propósitos de registro. A continuación se presentan los pasos:

 [root@elk_master opt]# mkdir -p /data/data   
[root@elk_master opt]# mkdir -p /data/logs   
[root@elk_master opt]#   
[root@elk_master opt]# cd elasticsearch   
[root@elk_master elasticsearch]# ls   
bin config lib LICENSE.txt logs modules NOTICE.txt plugins README.textile   
[root@elk_master elasticsearch]# cd config/   
[root@elk_master config]# vi elasticsearch.yml   
# ---------------------------------- Cluster -----------------------------------   
cluster.name: log_cluster   
#   
# ------------------------------------ Node ------------------------------------   
#   
node.name: elk_master   
#   
# ----------------------------------- Paths ------------------------------------   
#   
path.data: /data/data   
path.logs: /data/logs   
#   
network.host: 172.17.0.6   

Hecho, para que ElasticSearch funcione, requiere que Java esté configurado. A continuación se presentan los pasos para instalar y configurar Java en el servidor.

 [root@elk_master config]# wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm"   
--2018-06-09 12:57:05-- http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm   
Resolviendo download.oracle.com (download.oracle.com)... 23.49.16.62   
Conectando a download.oracle.com (download.oracle.com)|23.49.16.62|:80... conectado.   
Solicitud HTTP enviada, esperando respuesta... 302 Moved Temporarily   
Ubicación: https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm [siguiendo]   
--2018-06-09 12:57:10-- https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm   
Resolviendo edelivery.oracle.com (edelivery.oracle.com)... 104.103.48.174, 2600:1417:58:181::2d3e, 2600:1417:58:188::2d3e   
Conectando a edelivery.oracle.com (edelivery.oracle.com)|104.103.48.174|:443... conectado.   
Solicitud HTTP enviada, esperando respuesta... 302 Moved Temporarily   
Ubicación: http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm?AuthParam=1528549151_b1fd01d854bc0423600a83c36240028e [siguiendo]   
--2018-06-09 12:57:11-- http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm?AuthParam=1528549151_b1fd01d854bc0423600a83c36240028e   
Conectando a download.oracle.com (download.oracle.com)|23.49.16.62|:80... conectado.   
Solicitud HTTP enviada, esperando respuesta... 200 OK   
Longitud: 169983496 (162M) [application/x-redhat-package-manager]   
Guardando en: ‘jdk-8u131-linux-x64.rpm’   
  
100%[==============================================================================>] 169,983,496 2.56MB/s en 64s   
  
2018-06-09 12:58:15 (2.54 MB/s) - ‘jdk-8u131-linux-x64.rpm’ guardado [169983496/169983496]   
  
[root@elk_master config]# yum localinstall -y jdk-8u131-linux-x64.rpm   
  
[root@elk_master config]# vi /root/.bash_profile   
export JAVA_HOME=/usr/java/jdk1.8.0_131   
PATH=$JAVA_HOME/bin:$PATH:$HOME/bin   
export PATH   
  
[root@elk_master config]# . /root/.bash_profile   
[root@elk_master config]# 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)   

Hecho, ahora elasticSearch ha sido instalado y configurado en el servidor. Sin embargo, debido a algunas políticas de seguridad, elasticSearch no puede ser ejecutado por el usuario root, por lo tanto, crearemos un usuario adicional para ser el propietario del servicio elasticSearch y ejecutarlo. A continuación se presentan los pasos para crear el usuario dedicado para ello:

 [root@elk_master config]# useradd -s /bin/bash shahril   
[root@elk_master config]# passwd shahril   
Cambiando la contraseña para el usuario shahril.   
Nueva contraseña:   
MALA CONTRASEÑA: La contraseña no pasa la verificación del diccionario - es demasiado simplista/sistemática   
Vuelva a escribir la nueva contraseña:   
passwd: todos los tokens de autenticación se actualizaron correctamente.   
  
[root@elk_master config]# chown -R shahril:shahril /data/   
[root@elk_master config]# sysctl -w vm.max_map_count=262144   
vm.max_map_count = 262144   

Una vez hecho esto, inicie sesión como el usuario y podrá iniciar los servicios de elasticSearch.

 [root@elk_master config]# su - shahril   
Último inicio de sesión: Sáb Jun 9 13:03:07 UTC 2018 en pts/1   
[shahril@elk_master ~]$   
[shahril@elk_master ~]$   
[shahril@elk_master ~]$   
[shahril@elk_master ~]$ /opt/elasticsearch/bin/elasticsearch &   
[1] 7295   
[shahril@elk_master ~]$ [2018-06-09T13:06:26,667][INFO ][o.e.n.Node ] [elk_master] inicializando ...   
[2018-06-09T13:06:26,721][INFO ][o.e.e.NodeEnvironment ] [elk_master] utilizando [1] rutas de datos, montajes [[/ (rootfs)]], espacio utilizable en red [394.3gb], espacio total en red [468.2gb], tipos [rootfs]   
[2018-06-09T13:06:26,722][INFO ][o.e.e.NodeEnvironment ] [elk_master] tamaño de heap [990.7mb], punteros de objeto ordinarios comprimidos [true]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] nombre de nodo [elk_master], ID de nodo [xjNoA9mMSGiXYmFPRNlXBg]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] versión[6.2.1], pid[7295], build[7299dc3/2018-02-07T19:34:26.990113Z], OS[Linux/3.10.0-693.17.1.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_131/25.131-b11]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] argumentos de JVM [-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.U6ilAwt9, -XX:+HeapDumpOnOutOfMemoryError, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -Xloggc:logs/gc.log, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=32, -XX:GCLogFileSize=64m, -Des.path.home=/opt/elasticsearch, -Des.path.conf=/opt/elasticsearch/config]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [aggs-matrix-stats]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [analysis-common]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [ingest-common]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [lang-expression]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [lang-mustache]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [lang-painless]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [mapper-extras]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [parent-join]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [percolator]   
[2018-06-09T13:06:27,531][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [rank-eval]   
[2018-06-09T13:06:27,532][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [reindex]   
[2018-06-09T13:06:27,532][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [repository-url]   
[2018-06-09T13:06:27,533][INFO ][o.e.p.PluginsService ] [elk_master] módulo cargado [transport-netty4]   
[2018-06-09T13:06:27,533][INFO ][o.e.p.PluginsService ] [elk_master] no se cargaron plugins   

Excelente, ahora elasticSearch está en funcionamiento sin ningún problema, notará que se han establecido puertos adicionales en el servidor relacionados con el servicio elasticSearch. Puede verificar los puertos listados como se muestra a continuación:

 [root@elk_master config]# netstat -apn|grep -i :9   
tcp 0 0 172.17.0.6:9200 0.0.0.0:* LISTEN 7295/java   
tcp 0 0 172.17.0.6:9300 0.0.0.0:* LISTEN 7295/java   

Ahora pasemos a configurar y establecer los servicios de logstash. A continuación se presentan los pasos necesarios para el proceso de instalación:

 [root@elk_master opt]# wget https://artifacts.elastic.co/downloads/logstash/logstash-6.2.1.rpm   
--2018-06-09 13:07:51-- https://artifacts.elastic.co/downloads/logstash/logstash-6.2.1.rpm   
Resolviendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.253.15, 23.21.67.46, 107.21.237.188, ...   
Conectando a artifacts.elastic.co (artifacts.elastic.co)|107.21.253.15|:443... conectado.   
Solicitud HTTP enviada, esperando respuesta... 200 OK   
Longitud: 140430729 (134M) [binary/octet-stream]   
Guardando en: ‘logstash-6.2.1.rpm’   
  
100%[==============================================================================>] 140,430,729 2.19MB/s en 60s   
  
2018-06-09 13:08:57 (2.24 MB/s) - ‘logstash-6.2.1.rpm’ guardado [140430729/140430729]   
  
[root@elk_master opt]# yum localinstall -y logstash-6.2.1.rpm   
Cargando plugins: fastestmirror, ovl   
Examinando logstash-6.2.1.rpm: 1:logstash-6.2.1-1.noarch   
Marcando logstash-6.2.1.rpm para ser instalado   
Resolviendo Dependencias   
--> Ejecutando verificación de transacción   
---> Paquete logstash.noarch 1:6.2.1-1 será instalado   
--> Finalizada la Resolución de Dependencias   
  
Dependencias Resueltas   
  
========================================================================================================================   
Paquete Arquitectura Versión Repositorio Tamaño   
========================================================================================================================   
Instalando:   
logstash noarch 1:6.2.1-1 /logstash-6.2.1 224 M   
  
Resumen de Transacción   
========================================================================================================================   
Instalar 1 Paquete   
  
Tamaño total: 224 M   
Tamaño instalado: 224 M   
Descargando paquetes:   
Ejecutando verificación de transacción   
Ejecutando prueba de transacción   
La prueba de transacción tuvo éxito   
Ejecutando transacción   
Instalando : 1:logstash-6.2.1-1.noarch 1/1   
Utilizando el archivo startup.options proporcionado: /etc/logstash/startup.options   
Se creó correctamente el script de inicio del sistema para Logstash   
Verificando : 1:logstash-6.2.1-1.noarch 1/1   
  
Instalado:   
logstash.noarch 1:6.2.1-1   
  
¡Completo!   

Una vez que la instalación esté completa, aplique la configuración necesaria como se indica a continuación:

 [root@elk_master opt]# vi /etc/logstash/conf.d/02-mysql-log.conf   
  
input {   
beats {   
port => 5044   
host => "0.0.0.0"   
}   
}   
  
filter {   
if [fileset][module] == "mysql" {   
if [fileset][name] == "error" {   
grok {   
match => { "message" => ["%{LOCALDATETIME:[mysql][error][timestamp]} (\[%{DATA:[mysql][error][level]}\] )?%{GREEDYDATA:[mysql][error][message]}",   
"%{TIMESTAMP_ISO8601:[mysql][error][timestamp]} %{NUMBER:[mysql][error][thread_id]} \[%{DATA:[mysql][error][level]}\] %{GREEDYDATA:[mysql][error][message1]}",   
"%{GREEDYDATA:[mysql][error][message2]}"] }   
pattern_definitions => {   
"LOCALDATETIME" => "[0-9]+ %{TIME}"   
}   
remove_field => "message"   
}   
mutate {   
rename => { "[mysql][error][message1]" => "[mysql][error][message]" }   
}   
mutate {   
rename => { "[mysql][error][message2]" => "[mysql][error][message]" }   
}   
date {   
match => [ "[mysql][error][timestamp]", "ISO8601", "YYMMdd H:m:s" ]   
remove_field => "[mysql][error][time]"   
}   
}   
else if [fileset][name] == "slowlog" {   
grok {   
match => { "message" => ["^# User@Host: %{USER:[mysql][slowlog][user]}(\[[^\]]+\])? @ %{HOSTNAME:[mysql][slowlog][host]} \[(IP:[mysql][slowlog][ip])?\](\s*Id:\s* %{NUMBER:[mysql][slowlog][id]})?\n# Query_time: %{NUMBER:[mysql][slowlog][query_time][sec]}\s* Lock_time: %{NUMBER:[mysql][slowlog][lock_time][sec]}\s* Rows_sent: %{NUMBER:[mysql][slowlog][rows_sent]}\s* Rows_examined: %{NUMBER:[mysql][slowlog][rows_examined]}\n(SET timestamp=%{NUMBER:[mysql][slowlog][timestamp]};\n)?%{GREEDYMULTILINE:[mysql][slowlog][query]}"] }   
pattern_definitions => {   
"GREEDYMULTILINE" => "(.|\n)*"   
}   
remove_field => "message"   
}   
date {   
match => [ "[mysql][slowlog][timestamp]", "UNIX" ]   
}   
mutate {   
gsub => ["[mysql][slowlog][query]", "\n# Time: [0-9]+ [0-9][0-9]:[0-9][0-9]:[0-9][0-9](\\.[0-9]+)?$", ""]   
}   
}   
}   
}   
  
output {   
elasticsearch {   
hosts => "172.17.0.6"   
manage_template => false   
index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"   
}   
}   

Tenga en cuenta que en la configuración realizada anteriormente, hemos establecido la entrada para ser tomada del servicio filebeat en el lado del cliente que utiliza el puerto 5044. También hemos establecido una anotación adecuada para logstash para alinear los datos en bruto que se toman de cada lado del cliente. Esto es necesario para que sea más fácil de ver y analizar desde el lado de elasticSearch.

A continuación, necesitamos instalar el módulo filebeats para logstash para que logstash pueda capturar y rastrear los datos en bruto desde el lado del cliente.

 [root@elk_master opt]# /usr/share/logstash/bin/logstash-plugin install logstash-input-beats   
Validando logstash-input-beats   
Instalando logstash-input-beats   
Instalación exitosa   

Como la instalación y configuración necesarias para logstash están completas, podemos iniciar los servicios directamente. A continuación se presentan los pasos:

 [root@elk_master opt]# service logstash restart   
Redirigiendo a /bin/systemctl restart logstash.service   
  
[root@elk_master opt]# service logstash status   
Redirigiendo a /bin/systemctl status logstash.service   
? logstash.service - logstash   
Cargado: cargado (/etc/systemd/system/logstash.service; deshabilitado; ajuste de proveedor: deshabilitado)   
Activo: activo (ejecutándose) desde Sáb 2018-06-09 13:17:40 UTC; hace 5s   
PID principal: 8106 (java)   
CGroup: /docker/2daaf895e0efa67ef70dbabd87b56d53815e94ff70432f692385f527e2dc488b/system.slice/logstash.service   
??8106 /bin/java -Xms256m -Xmx1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFracti...   
  
Jun 09 13:17:40 elk_master systemd[1]: Iniciado logstash.   
Jun 09 13:17:40 elk_master systemd[1]: Iniciando logstash...   
[root@elk_master opt]#   
  
[root@elk_master opt]# tail -f /var/log/logstash/logstash-plain.log   
[2018-06-09T13:17:59,496][INFO ][logstash.outputs.elasticsearch] URLs de grupo de Elasticsearch actualizadas {:changes=>{:removed=>[], :added=>[http://172.17.0.6:9200/]}}   
[2018-06-09T13:17:59,498][INFO ][logstash.outputs.elasticsearch] Ejecutando verificación de salud para ver si una conexión de Elasticsearch está funcionando {:healthcheck_url=>http://172.17.0.6:9200/, :path=>"/"}   
[2018-06-09T13:17:59,976][WARN ][logstash.outputs.elasticsearch] Conexión restaurada a la instancia de ES {:url=>"http://172.17.0.6:9200/"}   
[2018-06-09T13:18:00,083][INFO ][logstash.outputs.elasticsearch] Versión de salida de ES determinada {:es_version=>nil}   
[2018-06-09T13:18:00,083][WARN ][logstash.outputs.elasticsearch] Se detectó un clúster de 6.x y superior: el campo de evento `type` no se utilizará para determinar el tipo de documento {:es_version=>6}   
[2018-06-09T13:18:00,095][INFO ][logstash.outputs.elasticsearch] Nueva salida de Elasticsearch {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//172.17.0.6"]}   
[2018-06-09T13:18:00,599][INFO ][logstash.inputs.beats ] Entradas de Beats: Iniciando el oyente de entrada {:address=>"0.0.0.0:5044"}   
[2018-06-09T13:18:00,652][INFO ][logstash.pipeline ] Pipeline iniciado con éxito {:pipeline_id=>"main", :thread=>"#"}   
[2018-06-09T13:18:00,663][INFO ][org.logstash.beats.Server] Iniciando servidor en el puerto: 5044   
[2018-06-09T13:18:00,660][INFO ][logstash.agent ] Pipelines en ejecución {:count=>1, :pipelines=>["main"]}   
[2018-06-09T13:18:24,060][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.04] creando índice, causa [auto(bulk api)], plantillas [], fragmentos [5]/[1], mapeos []   
[2018-06-09T13:18:24,189][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.09] creando índice, causa [auto(bulk api)], plantillas [], fragmentos [5]/[1], mapeos []   
[2018-06-09T13:18:24,288][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.08] creando índice, causa [auto(bulk api)], plantillas [], fragmentos [5]/[1], mapeos []   
[2018-06-09T13:18:24,591][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.04/yPD91Ww0SD2ei4YI-FgLgQ] create_mapping [doc]   
[2018-06-09T13:18:24,781][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.08/Qnv0gplFTgW0z1C6haZESg] create_mapping [doc]   
[2018-06-09T13:18:24,882][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.09/dihjTJw3SjGncXYln2MXbA] create_mapping [doc]   
[2018-06-09T13:18:24,996][INFO ][o.e.c.m.MetaDataMappingService] [elk_master] [filebeat-6.2.1-2018.06.09/dihjTJw3SjGncXYln2MXbA] update_mapping [doc]   

Como puede ver, ahora el servicio logstash ha comenzado con éxito y está comenzando a recopilar datos de cada lado del cliente. Como alternativa, puede usar el comando curl para ver el estado y las actualizaciones desde el lado de logstash. A continuación se presentan ejemplos:

 [root@elk_master opt]# curl -kL http://172.17.0.6:9200/_cat/indices?v   
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size   
yellow open filebeat-6.2.1-2018.06.09 dihjTJw3SjGncXYln2MXbA 5 1 6 0 35.2kb 35.2kb   
yellow open filebeat-6.2.1-2018.06.04 yPD91Ww0SD2ei4YI-FgLgQ 5 1 350 0 186.4kb 186.4kb   
yellow open filebeat-6.2.1-2018.06.08 Qnv0gplFTgW0z1C6haZESg 5 1 97 0 89.4kb 89.4kb   

Por último, pero no menos importante, necesitaremos configurar y establecer los servicios de kibana para completar el servidor de gestión centralizado. Solo una nota, ya que kibana se utiliza para facilitar el proceso de recopilación y análisis de datos a través de la visualización, no es un paquete tan importante como elasticSearch o logstash si está configurando el servidor en una máquina más pequeña. Sin embargo, para proceder, a continuación se presentan los pasos de instalación y configuración:

 [root@elk_master opt]# wget https://artifacts.elastic.co/downloads/kibana/kibana-6.2.1-linux-x86_64.tar.gz   
--2018-06-09 13:21:41-- https://artifacts.elastic.co/downloads/kibana/kibana-6.2.1-linux-x86_64.tar.gz   
Resolviendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.237.95, 107.21.253.15, ...   
Conectando a artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... conectado.   
Solicitud HTTP enviada, esperando respuesta... 200 OK   
Longitud: 83465500 (80M) [binary/octet-stream]   
Guardando en: ‘kibana-6.2.1-linux-x86_64.tar.gz’   
  
100%[==============================================================================>] 83,465,500 2.76MB/s en 41s   
  
2018-06-09 13:22:28 (1.94 MB/s) - ‘kibana-6.2.1-linux-x86_64.tar.gz’ guardado [83465500/83465500]   
  
[root@elk_master opt]# tar -zxvf kibana-6.2.1-linux-x86_64.tar.gz   
[root@elk_master opt]# ln -s /opt/kibana-6.2.1-linux-x86_64 /opt/kibana   
  
[root@elk_master opt]# vi kibana/config/kibana.yml   
  
server.host: "172.17.0.6"   
server.port: 5601   
elasticsearch.url: "http://172.17.0.6:9200"   

Tenga en cuenta que he vinculado kibana con nuestro servicio ElasticSearch dentro de la configuración y asigné un puerto que será utilizado por el servicio Kibana una vez iniciado. Ahora que todo está en su lugar, podemos iniciar los servicios finales. A continuación se presentan los pasos:

 [root@elk_master opt]# /opt/kibana/bin/kibana --version   
6.2.1   
  
[root@elk_master opt]# /opt/kibana/bin/kibana &   
[1] 8640   
[root@elk_master opt]# log [13:26:20.034] [info][status][plugin:[email protected]] El estado cambió de no inicializado a verde - Listo   
log [13:26:20.073] [info][status][plugin:[email protected]] El estado cambió de no inicializado a amarillo - Esperando a Elasticsearch   
log [13:26:20.193] [info][status][plugin:[email protected]] El estado cambió de no inicializado a verde - Listo   
log [13:26:20.200] [info][status][plugin:[email protected]] El estado cambió de no inicializado a verde - Listo   
log [13:26:20.212] [info][status][plugin:[email protected]] El estado cambió de no inicializado a verde - Listo   
log [13:26:20.233] [info][listening] Servidor en ejecución en http://172.17.0.6:5601   
log [13:26:20.276] [info][status][plugin:[email protected]] El estado cambió de amarillo a verde - Listo   
  
[root@elk_master opt]# netstat -apn|grep -i :5601   
tcp 0 0 172.17.0.6:5601 0.0.0.0:* LISTEN 8640/node   

Genial, ahora todo está en funcionamiento como se muestra arriba utilizando el comando netstat. Ahora veamos el Panel de Kibana y hagamos la configuración. Vaya a la URL http://172.17.0.6:5601/app, verá que el panel se mostrará como a continuación.

Panel de Kibana

A continuación, en el panel, haga clic en la pestaña de Gestión y luego defina el patrón de índice, para nuestros casos el patrón de índice se define como el nombre de archivo de registro generado. Escriba la información y luego haga clic en siguiente.

Agregar Patrón de Índice

Después de eso, escriba las variables que se utilizarán como serie de tiempo. Una vez hecho esto, haga clic en Crear Patrón de Índice. A continuación se muestra un ejemplo:

Crear Patrón de Índice

Excelente, ahora el servidor de gestión está listo para ser utilizado. Procedamos a probar la usabilidad.

4. Fase de Pruebas

Antes de comenzar la prueba, hagamos la suposición de los resultados finales esperados. Para esta prueba, intentaremos ejecutar una consulta de base de datos que superará el tiempo de consulta largo asignado desde el cliente que es el servidor MySQL. Una vez que ejecutemos, nuestro servidor de gestión centralizado debería mostrar automáticamente el resultado de la información de consulta lenta como un gráfico a través del panel de Kibana. Ahora que todo está claro, comencemos la prueba, a continuación se presentan los pasos:

Inicie sesión en cualquiera de los servidores cliente y ejecute la consulta SQL lenta como a continuación:

 [root@mysql_db1 ~]# mysql --login-path=root -P 3306 --prompt='TEST>'   
Bienvenido al monitor de MySQL. Los comandos terminan con ; o \g.   
Su ID de conexión MySQL es 193   
Versión del servidor: 5.7.21-log Servidor Comunitario MySQL (GPL)   
  
Copyright (c) 2000, 2018, Oracle y/o sus afiliados. Todos los derechos reservados.   
  
Oracle es una marca registrada de Oracle Corporation y/o sus   
afilados. Otros nombres pueden ser marcas comerciales de sus respectivos   
propietarios.   
  
Escriba 'help;' o '\h' para ayuda. Escriba '\c' para borrar la declaración de entrada actual.   
  
TEST>select sleep(5);   
+----------+   
| sleep(5) |   
+----------+   
| 0 |   
+----------+   
1 fila en el conjunto (5.01 sec)   
  
TEST>select sleep(6);   
+----------+   
| sleep(6) |   
+----------+   
| 0 |   
+----------+   
1 fila en el conjunto (6.00 sec)   
  
TEST>select sleep(10) 'run for 10 seconds';   
+--------------------+   
| run for 10 seconds |   
+--------------------+   
| 0 |   
+--------------------+   
1 fila en el conjunto (10.00 sec)   
  
TEST>select sleep(3) 'test again';   
+------------+   
| test again |   
+------------+   
| 0 |   
+------------+   
1 fila en el conjunto (3.00 sec)   
  
TEST>exit   
Adiós   

Como se muestra arriba, hemos logrado producir algunas consultas lentas que se registraron automáticamente en el registro de consultas lentas de cada cliente. Ahora, vayamos al panel y veamos si la información de datos ha sido rastreada con éxito por el servidor centralizado y convertida en un gráfico de visualización.

Los datos de registro han sido indexados

Genial, como se muestra arriba, hay una lista de información de registro que ha sido rastreada y vista a través del panel de kibana. Puede usar la pestaña izquierda para filtrar qué tipo de columna desea mostrar u ocultar, a continuación se muestra un ejemplo :-

Navegación del Panel de Kibana

Usando el campo de texto en la parte superior del panel, puede escribir una consulta SQL relacionada para ver cierta información o parte de los datos necesarios.

Buscar datos de registro con SQL

Excelente, como se muestra arriba, la consulta SQL lenta que hemos producido inicialmente desde 1 de nuestros servidores cliente se muestra automáticamente en nuestro Panel de Kibana como se esperaba.

Share: X/Twitter LinkedIn

Recibe nuevas publicaciones en tu bandeja de entrada.

No spam. Cancela la suscripción en cualquier momento.