Gerenciamento de Logs · 19 min read · Feb 02, 2026

Instalar ELK como Servidor de Gerenciamento de Log Centralizado no CentOS 7

Este tutorial explica como configurar um servidor de gerenciamento de log centralizado usando a pilha ELK no CentOS 7. Como qualquer um que já não saiba, ELK é a combinação de 3 serviços: ElasticSearch, Logstash e Kibana. Para construir um servidor completo de gerenciamento de log centralizado usando este conceito, seria necessário ter cada um desses pacotes, pois cada um serve a um propósito diferente e está relacionado entre si. Basicamente, funciona assim:

  1. Para cada cliente que você deseja gerenciar, ele produzirá seu próprio log de serviços relacionados.
  2. Para o servidor que será usado para gerenciar todas as informações de log de cada cliente, ele usará o pacote LogStash para coletar e transformar os dados em um valor relativo. Por definição, é um pipeline de processamento de dados do lado do servidor de código aberto que ingere dados de uma infinidade de fontes simultaneamente, transforma-os.
  3. Uma vez que os dados são coletados e transformados, o servidor de gerenciamento usará o ElasticSearch para ajudar a analisar os dados em um valor relevante. Você pode usar a linguagem de consulta geral se quiser produzir um relatório relacionado conforme necessário.
  4. À medida que os dados relacionados são verificados e analisados, é aqui que o pacote Kibana entra em cena, pois pode ajudar a visualizar e gerenciar os dados relevantes em uma visualização adequada ou combiná-los em um painel brilhante desejável para fácil compreensão.

A imagem abaixo resume o processo de fluxo de trabalho:

1. Nota Preliminar

Para este tutorial, estou usando o CentOS Linux 7.4 na versão de 64 bits. Neste tutorial, usaremos 3 servidores: o primeiro será usado como o servidor de gerenciamento e os outros 2 serão usados como clientes. Para este exercício, usaremos o servidor de gerenciamento para monitorar um serviço MySQL existente que já foi configurado e está em execução em cada cliente. Como o MySQL é um serviço de banco de dados que é usado principalmente para fins OLTP, faremos com que nosso servidor de gerenciamento registre 2 processos de log, que são a verificação de saúde do próprio serviço MySQL e a transação de consulta lenta. Ao final deste tutorial, veremos que qualquer informação registrada de qualquer serviço MySQL dentro do cliente dedicado pode ser vista, visualizada e analisada simultaneamente a partir do servidor de gerenciamento em tempo real.

2. Fase de Instalação

Para a fase de instalação, começaremos com a instalação do FileBeat em ambos os servidores de banco de dados MySQL que atuam como clientes. Vamos iniciar o processo, abaixo estão os passos:

 [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   
Resolvendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.253.15, 184.73.245.233, ...   
Conectando-se a artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... conectado.   
Requisição HTTP enviada, aguardando resposta... 200 OK   
Comprimento: 12697093 (12M) [binary/octet-stream]   
Salvando em: ‘filebeat-6.2.1-x86_64.rpm’   
  
100%[==============================================================================>] 12,697,093 2.20MB/s em 6.9s   
  
2018-06-09 10:51:00 (1.75 MB/s) - ‘filebeat-6.2.1-x86_64.rpm’ salvo [12697093/12697093]   
  
[root@mysql_db1 opt]# yum localinstall -y filebeat-6.2.1-x86_64.rpm   
Loaded 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   
Resolvendo Dependências   
--> Executando verificação de transação   
---> Pacote filebeat.x86_64 0:6.2.1-1 será instalado   
--> Resolução de Dependências Finalizada   
  
Dependências Resolvidas   
  
========================================================================================================================   
Pacote Arquitetura Versão Repositório Tamanho   
========================================================================================================================   
Instalando:   
filebeat x86_64 6.2.1-1 /filebeat-6.2.1-x86_64 49 M   
  
Resumo da Transação   
========================================================================================================================   
Instalar 1 Pacote   
  
Tamanho total: 49 M   
Tamanho instalado: 49 M   
Baixando pacotes:   
Executando verificação de transação   
Executando teste de transação   
Teste de transação bem-sucedido   
Executando transação   
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!   

Uma vez feito, listaremos o módulo padrão que é habilitado pelo pacote FileBeat e habilitaremos o módulo mysql que é necessário para nossos casos aqui. Abaixo estão os passos:

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

Feito, agora vamos editar a configuração necessária para o módulo mysql que habilitamos agora. Por padrão, uma vez que habilitamos o módulo mysql do pacote filebeat, ele automaticamente cria um arquivo yaml dentro do diretório modules.d. No entanto, se o arquivo não foi criado, sinta-se à vontade para criar um novo arquivo yaml no mesmo local. Abaixo estão os passos:

 [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 mostrado acima, decidimos registrar 2 processos de log do serviço MySQL, que são a verificação de saúde do banco de dados em si e o log de consulta lenta.

Agora, uma vez que tudo esteja feito, vamos fazer algumas configurações dentro do arquivo de configuração principal do filebeat sob o arquivo filebeat.yml. Abaixo estão as configurações definidas:

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

Observe que acima definimos um endereço IP para o host logstash que é 172.17.0.6. Este IP é o endereço do nosso servidor de gerenciamento centralizado que irá coletar diretamente os dados de log. Eu defini o IP codificado, pois não fiz nenhuma alteração alternativa no arquivo /etc/hosts e não usei nenhum servidor DNS para este tutorial. No entanto, sinta-se à vontade para usar o nome do host do servidor de gerenciamento se você fez as alterações alternativas.

Como tudo foi configurado conforme o planejado, vamos iniciar os serviços do filebeat. Abaixo estão os passos:

 [root@mysql_db1 opt]# filebeat setup -e   
2018-06-09T11:04:37.277Z INFO instance/beat.go:468 Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]   
2018-06-09T11:04:37.277Z INFO instance/beat.go:475 Beat UUID: 98503460-035e-4476-8e4d-10470433dba5   
2018-06-09T11:04:37.277Z INFO instance/beat.go:213 Setup Beat: filebeat; Version: 6.2.1   
2018-06-09T11:04:37.277Z INFO pipeline/module.go:76 Beat name: lara   
2018-06-09T11:04:37.278Z ERROR instance/beat.go:667 Exiting: Template loading requested but the Elasticsearch output is not configured/enabled   
Exiting: Template loading requested but the Elasticsearch output is not configured/enabled   
  
[root@mysql_db1 opt]# filebeat -e &   
[1] 22010   
[root@mysql_db1 opt]# 2018-06-09T12:45:18.812Z INFO instance/beat.go:468 Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]   
2018-06-09T12:45:18.813Z INFO instance/beat.go:475 Beat UUID: 98503460-035e-4476-8e4d-10470433dba5   
2018-06-09T12:45:18.813Z INFO instance/beat.go:213 Setup Beat: filebeat; Version: 6.2.1   
2018-06-09T12:45:18.813Z INFO pipeline/module.go:76 Beat name: lara   
2018-06-09T12:45:18.813Z INFO [monitoring] log/log.go:97 Starting metrics logging every 30s   
2018-06-09T12:45:18.813Z INFO instance/beat.go:301 filebeat start running.   
2018-06-09T12:45:18.814Z INFO registrar/registrar.go:71 No registry file found under: /var/lib/filebeat/registry. Creating a new registry file.   
2018-06-09T12:45:18.819Z INFO registrar/registrar.go:108 Loading registrar data from /var/lib/filebeat/registry   
2018-06-09T12:45:18.819Z INFO registrar/registrar.go:119 States Loaded from registrar: 0   
2018-06-09T12:45:18.819Z WARN beater/filebeat.go:261 Filebeat is unable to load the Ingest Node pipelines for the configured modules because the Elasticsearch output is not configured/enabled. If you have already loaded the Ingest Node pipelines or are using Logstash pipelines, you can ignore this warning.   
2018-06-09T12:45:18.820Z INFO crawler/crawler.go:48 Loading Prospectors: 1   
2018-06-09T12:45:18.821Z INFO log/prospector.go:111 Configured paths: [/var/lib/mysql/log-slow-queries.log*]   
2018-06-09T12:45:18.822Z INFO log/prospector.go:111 Configured paths: [/var/lib/mysql/mysql-error.log*]   
2018-06-09T12:45:18.822Z INFO crawler/crawler.go:82 Loading and starting Prospectors completed. Enabled prospectors: 0   
2018-06-09T12:45:18.822Z INFO cfgfile/reload.go:127 Config reloader started   
2018-06-09T12:45:18.840Z INFO log/prospector.go:111 Configured paths: [/var/lib/mysql/log-slow-queries.log*]   
2018-06-09T12:45:18.840Z INFO log/prospector.go:111 Configured paths: [/var/lib/mysql/mysql-error.log*]   
2018-06-09T12:45:18.840Z INFO cfgfile/reload.go:258 Starting 1 runners ...   
2018-06-09T12:45:18.840Z INFO cfgfile/reload.go:219 Loading of config files completed.   
2018-06-09T12:45:18.841Z INFO log/harvester.go:216 Harvester started for file: /var/lib/mysql/mysql-error.log   
2018-06-09T12:45:18.841Z INFO log/harvester.go:216 Harvester started for file: /var/lib/mysql/log-slow-queries.log   
2018-06-09T12:45:20.841Z ERROR pipeline/output.go:74 Failed to connect: dial tcp 172.17.0.6:5044: getsockopt: connection refused   
2018-06-09T12:45:22.842Z ERROR pipeline/output.go:74 Failed to connect: dial tcp 172.17.0.6:5044: getsockopt: connection refused   
2018-06-09T12:45:26.842Z ERROR pipeline/output.go:74 Failed to connect: dial tcp 172.17.0.6:5044: getsockopt: connection refused   
  
[root@mysql_db1 ~]# tail -f /var/log/filebeat/filebeat   
2018-06-09T10:53:28.853Z INFO instance/beat.go:468 Home path: [/usr/share/filebeat] Config path: [/etc/filebeat] Data path: [/var/lib/filebeat] Logs path: [/var/log/filebeat]   
2018-06-09T10:53:28.853Z INFO instance/beat.go:475 Beat UUID: 98503460-035e-4476-8e4d-10470433dba5   

Observe que, uma vez que você inicie o serviço filebeat, há um erro mostrado no log. Isso ocorreu devido ao servidor de gerenciamento que foi atribuído não estar configurado ainda. Para a fase inicial, você pode ignorar o log de erro, pois ele será recuperado automaticamente assim que nosso servidor de gerenciamento for configurado e começar a coletar.

Como a configuração para a base do cliente está feita, você pode continuar a replicar os passos no outro servidor MySQL que também atua como cliente.

Avançando, continuaremos com a configuração do próprio servidor de gerenciamento.

3. Fase de Instalação (Lado do Servidor de Gerenciamento Centralizado)

Agora que terminamos a configuração para a prontidão do lado do cliente, vamos iniciar a configuração necessária para o próprio servidor de gerenciamento. Como mencionado brevemente, há 3 pacotes principais que precisam ser instalados e configurados para o servidor de gerenciamento, que são ElasticSearch, LogStash e Kibana.

Para esta fase, começaremos a instalação e configuração necessária para o ElasticSearch primeiro, abaixo estão os passos:

 [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   
Resolvendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 54.235.82.130, 107.21.253.15, ...   
Conectando-se a artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... conectado.   
Requisição HTTP enviada, aguardando resposta... 200 OK   
Comprimento: 29049089 (28M) [binary/octet-stream]   
Salvando em: ‘elasticsearch-6.2.1.tar.gz’   
  
100%[==============================================================================>] 29,049,089 2.47MB/s em 16s   
  
2018-06-09 12:48:21 (1.76 MB/s) - ‘elasticsearch-6.2.1.tar.gz’ salvo [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 a instalação do elasticsearch está concluída, vamos continuar com a parte de configuração. Para o lado da configuração, atribuiremos o diretório /data/data para armazenar os dados de log coletados que foram analisados. O diretório também será usado para armazenar o índice que será usado pelo elasticSearch para consultas mais rápidas. O diretório /data/logs será usado pelo elasticSearch para seus próprios propósitos de log. Abaixo estão os passos:

 [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   

Feito, para que o ElasticSearch funcione, é necessário que o Java seja configurado. Abaixo estão os passos para instalar e configurar o Java no 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   
Resolvendo download.oracle.com (download.oracle.com)... 23.49.16.62   
Conectando-se a download.oracle.com (download.oracle.com)|23.49.16.62|:80... conectado.   
Requisição HTTP enviada, aguardando resposta... 302 Moved Temporarily   
Localização: https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm [seguindo]   
--2018-06-09 12:57:10-- https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm   
Resolvendo edelivery.oracle.com (edelivery.oracle.com)... 104.103.48.174, 2600:1417:58:181::2d3e, 2600:1417:58:188::2d3e   
Conectando-se a edelivery.oracle.com (edelivery.oracle.com)|104.103.48.174|:443... conectado.   
Requisição HTTP enviada, aguardando resposta... 302 Moved Temporarily   
Localização: http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm?AuthParam=1528549151_b1fd01d854bc0423600a83c36240028e [seguindo]   
--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-se a download.oracle.com (download.oracle.com)|23.49.16.62|:80... conectado.   
Requisição HTTP enviada, aguardando resposta... 200 OK   
Comprimento: 169983496 (162M) [application/x-redhat-package-manager]   
Salvando em: ‘jdk-8u131-linux-x64.rpm’   
  
100%[==============================================================================>] 169,983,496 2.56MB/s em 64s   
  
2018-06-09 12:58:15 (2.54 MB/s) - ‘jdk-8u131-linux-x64.rpm’ salvo [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)   

Feito, agora o elasticSearch está instalado e configurado no servidor. No entanto, devido a algumas políticas de segurança, o elasticSearch não pode ser executado pelo usuário root, portanto, criaremos um usuário adicional para ser o proprietário do serviço elasticSearch e executá-lo. Abaixo estão os passos para criar o usuário dedicado para isso:

 [root@elk_master config]# useradd -s /bin/bash shahril   
[root@elk_master config]# passwd shahril   
Mudando a senha para o usuário shahril.   
Nova senha:   
SENHA FRACA: A senha falha na verificação do dicionário - é muito simplista/sistemática   
Digite novamente a nova senha:   
passwd: todos os tokens de autenticação atualizados com sucesso.   
  
[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   

Uma vez feito, faça login como o usuário e você pode iniciar os serviços do elasticSearch.

 [root@elk_master config]# su - shahril   
Último login: Sáb Jun 9 13:03:07 UTC 2018 em 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] initializing ...   
[2018-06-09T13:06:26,721][INFO ][o.e.e.NodeEnvironment ] [elk_master] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [394.3gb], net total_space [468.2gb], types [rootfs]   
[2018-06-09T13:06:26,722][INFO ][o.e.e.NodeEnvironment ] [elk_master] heap size [990.7mb], compressed ordinary object pointers [true]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] node name [elk_master], node ID [xjNoA9mMSGiXYmFPRNlXBg]   
[2018-06-09T13:06:26,723][INFO ][o.e.n.Node ] [elk_master] version[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] JVM arguments [-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] loaded module [aggs-matrix-stats]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [analysis-common]   
[2018-06-09T13:06:27,529][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [ingest-common]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [lang-expression]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [lang-mustache]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [lang-painless]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [mapper-extras]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [parent-join]   
[2018-06-09T13:06:27,530][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [percolator]   
[2018-06-09T13:06:27,531][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [rank-eval]   
[2018-06-09T13:06:27,532][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [reindex]   
[2018-06-09T13:06:27,532][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [repository-url]   
[2018-06-09T13:06:27,533][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [transport-netty4]   
[2018-06-09T13:06:27,533][INFO ][o.e.p.PluginsService ] [elk_master] no plugins loaded   

Excelente, agora o elasticSearch está em funcionamento sem nenhum problema, você notará que portas adicionais estão estabelecidas dentro do servidor relacionadas ao serviço elasticSearch. Você pode verificar as portas listadas conforme abaixo:

 [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   

Agora vamos passar para a configuração e instalação dos serviços do logstash. Abaixo estão os passos necessários para o processo de instalação:

 [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   
Resolvendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.253.15, 23.21.67.46, 107.21.237.188, ...   
Conectando-se a artifacts.elastic.co (artifacts.elastic.co)|107.21.253.15|:443... conectado.   
Requisição HTTP enviada, aguardando resposta... 200 OK   
Comprimento: 140430729 (134M) [binary/octet-stream]   
Salvando em: ‘logstash-6.2.1.rpm’   
  
100%[==============================================================================>] 140,430,729 2.19MB/s em 60s   
  
2018-06-09 13:08:57 (2.24 MB/s) - ‘logstash-6.2.1.rpm’ salvo [140430729/140430729]   
  
[root@elk_master opt]# yum localinstall -y logstash-6.2.1.rpm   
Loaded 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   
Resolvendo Dependências   
--> Executando verificação de transação   
---> Pacote logstash.noarch 1:6.2.1-1 será instalado   
--> Resolução de Dependências Finalizada   
  
Dependências Resolvidas   
  
========================================================================================================================   
Pacote Arquitetura Versão Repositório Tamanho   
========================================================================================================================   
Instalando:   
logstash noarch 1:6.2.1-1 /logstash-6.2.1 224 M   
  
Resumo da Transação   
========================================================================================================================   
Instalar 1 Pacote   
  
Tamanho total: 224 M   
Tamanho instalado: 224 M   
Baixando pacotes:   
Executando verificação de transação   
Executando teste de transação   
Teste de transação bem-sucedido   
Executando transação   
Instalando : 1:logstash-6.2.1-1.noarch 1/1   
Usando arquivo startup.options fornecido: /etc/logstash/startup.options   
Script de inicialização do sistema criado com sucesso para o Logstash   
Verificando : 1:logstash-6.2.1-1.noarch 1/1   
  
Instalado:   
logstash.noarch 1:6.2.1-1   
  
Completo!   

Uma vez que a instalação esteja concluída, aplique a configuração necessária conforme abaixo:

 [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}"   
}   
}   

Observe que na configuração feita acima, definimos a entrada para ser retirada do serviço filebeat no lado do cliente, que usa a porta 5044. Também definimos uma anotação adequada para o logstash alinhar os dados brutos retirados de cada lado do cliente. Isso é necessário para que seja mais fácil visualizar e analisar do lado do elasticSearch.

Em seguida, precisamos instalar o módulo filebeats para o logstash, para que o logstash possa capturar e coletar os dados brutos do lado do cliente.

 [root@elk_master opt]# /usr/share/logstash/bin/logstash-plugin install logstash-input-beats   
Validando logstash-input-beats   
Instalando logstash-input-beats   
Instalação bem-sucedida   

Como a instalação e configuração necessárias para o logstash estão concluídas, podemos iniciar os serviços diretamente. Abaixo estão os passos:

 [root@elk_master opt]# service logstash restart   
Redirecionando para /bin/systemctl restart logstash.service   
  
[root@elk_master opt]# service logstash status   
Redirecionando para /bin/systemctl status logstash.service   
? logstash.service - logstash   
Loaded: loaded (/etc/systemd/system/logstash.service; disabled; vendor preset: disabled)   
Active: active (running) since Sat 2018-06-09 13:17:40 UTC; 5s ago   
Main PID: 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]: Started logstash.   
Jun 09 13:17:40 elk_master systemd[1]: Starting 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] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://172.17.0.6:9200/]}}   
[2018-06-09T13:17:59,498][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://172.17.0.6:9200/, :path=>"/"}   
[2018-06-09T13:17:59,976][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://172.17.0.6:9200/"}   
[2018-06-09T13:18:00,083][INFO ][logstash.outputs.elasticsearch] ES Output version determined {:es_version=>nil}   
[2018-06-09T13:18:00,083][WARN ][logstash.outputs.elasticsearch] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>6}   
[2018-06-09T13:18:00,095][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//172.17.0.6"]}   
[2018-06-09T13:18:00,599][INFO ][logstash.inputs.beats ] Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}   
[2018-06-09T13:18:00,652][INFO ][logstash.pipeline ] Pipeline started successfully {:pipeline_id=>"main", :thread=>"#"}   
[2018-06-09T13:18:00,663][INFO ][org.logstash.beats.Server] Starting server on port: 5044   
[2018-06-09T13:18:00,660][INFO ][logstash.agent ] Pipelines running {: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] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []   
[2018-06-09T13:18:24,189][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.09] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []   
[2018-06-09T13:18:24,288][INFO ][o.e.c.m.MetaDataCreateIndexService] [elk_master] [filebeat-6.2.1-2018.06.08] creating index, cause [auto(bulk api)], templates [], shards [5]/[1], mappings []   
[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 você pode ver, agora o serviço logstash foi iniciado com sucesso e começou a coletar dados de cada lado do cliente. Como alternativas, você pode usar o comando curl para ver o status e as atualizações do lado do logstash. Abaixo estão os exemplos:

 [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, mas não menos importante, precisaremos configurar e instalar os serviços do kibana para completar o servidor de gerenciamento centralizado. Apenas uma observação, como o kibana é usado para facilitar o processo de coleta e análise de dados por meio da visualização, não é um pacote tão importante quanto o elasticSearch ou logstash se você estiver configurando o servidor em uma máquina menor. No entanto, para prosseguir, abaixo estão os passos para instalação e configuração:

 [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   
Resolvendo artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.237.95, 107.21.253.15, ...   
Conectando-se a artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... conectado.   
Requisição HTTP enviada, aguardando resposta... 200 OK   
Comprimento: 83465500 (80M) [binary/octet-stream]   
Salvando em: ‘kibana-6.2.1-linux-x86_64.tar.gz’   
  
100%[==============================================================================>] 83,465,500 2.76MB/s em 41s   
  
2018-06-09 13:22:28 (1.94 MB/s) - ‘kibana-6.2.1-linux-x86_64.tar.gz’ salvo [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"   

Observe que acima eu vinculei o kibana ao nosso serviço ElasticSearch dentro da configuração e atribuí uma porta que será usada pelo serviço Kibana uma vez iniciado. Agora que tudo está configurado, podemos iniciar os serviços finais. Abaixo estão os passos:

 [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]] Status changed from uninitialized to green - Ready   
log [13:26:20.073] [info][status][plugin:[email protected]] Status changed from uninitialized to yellow - Waiting for Elasticsearch   
log [13:26:20.193] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready   
log [13:26:20.200] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready   
log [13:26:20.212] [info][status][plugin:[email protected]] Status changed from uninitialized to green - Ready   
log [13:26:20.233] [info][listening] Server running at http://172.17.0.6:5601   
log [13:26:20.276] [info][status][plugin:[email protected]] Status changed from yellow to green - Ready   
  
[root@elk_master opt]# netstat -apn|grep -i :5601   
tcp 0 0 172.17.0.6:5601 0.0.0.0:* LISTEN 8640/node   

Ótimo, agora tudo está funcionando conforme mostrado acima usando o comando netstat. Agora vamos visualizar o Painel do Kibana e fazer a configuração. Acesse a URL http://172.17.0.6:5601/app, você verá que o painel será exibido como abaixo.

Kibana Dashboard

Em seguida, no painel, clique na guia de Gerenciamento e defina o padrão do índice, para nossos casos o padrão do índice é definido como o nome do arquivo de log gerado. Digite as informações e clique em próximo.

Add Index Pattern

Depois disso, digite as variáveis que serão usadas como série temporal. Uma vez feito, clique em Criar Padrão de Índice. Abaixo está o exemplo:

Create Index Pattern

Excelente, agora o servidor de gerenciamento está pronto para ser usado. Vamos prosseguir testando a usabilidade.

4. Fase de Teste

Antes de começarmos o teste, vamos fazer a suposição para as expectativas do resultado final. Para este teste, tentaremos executar uma consulta de banco de dados que ultrapassará o tempo de consulta longa atribuído do cliente, que é o servidor MySQL. Uma vez que executamos, nosso servidor de gerenciamento centralizado deve mostrar automaticamente o resultado das informações de consulta lenta como um gráfico através do painel do Kibana. Agora que tudo está claro, vamos iniciar o teste, abaixo estão os passos:

Faça login em qualquer um dos servidores clientes e execute a consulta SQL lenta como abaixo:

 [root@mysql_db1 ~]# mysql --login-path=root -P 3306 --prompt='TEST>'   
Bem-vindo ao monitor MySQL. Os comandos terminam com ; ou \g.   
Seu ID de conexão MySQL é 193   
Versão do servidor: 5.7.21-log MySQL Community Server (GPL)   
  
Copyright (c) 2000, 2018, Oracle e/ou suas afiliadas. Todos os direitos reservados.   
  
Oracle é uma marca registrada da Oracle Corporation e/ou suas   
afiliadas. Outros nomes podem ser marcas registradas de seus respectivos   
proprietários.   
  
Digite 'help;' ou '\h' para ajuda. Digite '\c' para limpar a declaração de entrada atual.   
  
TEST>select sleep(5);   
+----------+   
| sleep(5) |   
+----------+   
| 0 |   
+----------+   
1 linha no conjunto (5.01 sec)   
  
TEST>select sleep(6);   
+----------+   
| sleep(6) |   
+----------+   
| 0 |   
+----------+   
1 linha no conjunto (6.00 sec)   
  
TEST>select sleep(10) 'executar por 10 segundos';   
+--------------------+   
| executar por 10 segundos |   
+--------------------+   
| 0 |   
+--------------------+   
1 linha no conjunto (10.00 sec)   
  
TEST>select sleep(3) 'testar novamente';   
+------------+   
| testar novamente |   
+------------+   
| 0 |   
+------------+   
1 linha no conjunto (3.00 sec)   
  
TEST>exit   
Tchau   

Como mostrado acima, conseguimos produzir algumas consultas lentas que foram automaticamente registradas no log de consulta lenta de cada cliente. Agora, vamos ao painel e ver se as informações de dados foram coletadas com sucesso pelo servidor centralizado e convertidas em um gráfico de visualização.

Log Data has been indexed

Ótimo, conforme mostrado acima, há uma lista de informações de log que foram coletadas com sucesso e visualizadas através do painel do kibana. Você pode usar a guia à esquerda para filtrar que tipo de coluna deseja mostrar ou ocultar, abaixo estão os exemplos :-

Kibana Dashboard navigation

Usando o campo de texto na parte superior do painel, você pode digitar uma consulta SQL relacionada para visualizar certas informações ou partes dos dados necessários.

Search for log data with SQL

Excelente, como mostrado acima, a consulta SQL lenta que produzimos inicialmente de um de nossos servidores clientes foi automaticamente exibida em nosso Painel do Kibana conforme esperado.

Share: X/Twitter LinkedIn

Receba novas postagens na sua caixa de entrada

Sem spam. Cancele a assinatura a qualquer momento.