Управление журналами · 17 min read · Feb 02, 2026

Установка ELK в качестве централизованного сервера управления журналами на CentOS 7

Этот учебник объясняет, как настроить централизованный сервер управления журналами с использованием стека ELK на CentOS 7. Как любой, кто не знает, ELK — это комбинация из 3 служб: ElasticSearch, Logstash и Kibana. Чтобы построить полный централизованный сервер управления журналами с использованием этой концепции, потребуется иметь каждый из этих пакетов, так как каждый из них выполняет свою уникальную задачу и связан друг с другом. В основном это работает вместе следующим образом:

  1. Для каждого клиента, который вы хотите управлять, он будет производить свой собственный журнал связанных служб.
  2. Для сервера, который будет использоваться для управления всей информацией о журналах от каждого клиента, будет использоваться пакет LogStash для сбора и преобразования данных в относительное значение. По определению, это открытый серверный конвейер обработки данных, который одновременно принимает данные из множества источников и преобразует их.
  3. После сбора и преобразования данных сервер управления будет использовать ElasticSearch для помощи в анализе данных до соответствующего значения. Вы можете использовать общий язык запросов, если хотите создать соответствующий отчет по мере необходимости.
  4. Когда связанные данные будут проверены и проанализированы, здесь появляется пакет Kibana, так как он может помочь визуализировать и управлять соответствующими данными для правильного представления или объединить их в желаемую глянцевую панель для легкого понимания.

Ниже изображение обобщает процесс рабочего процесса:

1. Предварительная заметка

Для этого учебника я использую CentOS Linux 7.4 в 64-битной версии. В этом учебнике мы будем использовать 3 сервера: первый будет использоваться в качестве сервера управления, а другие 2 будут использоваться в качестве клиентов. Для этого упражнения мы будем использовать сервер управления для мониторинга существующей службы MySQL, которая уже была настроена, сконфигурирована и работает на каждом клиенте. Поскольку MySQL является службой базы данных, которая используется в основном для OLTP, мы заставим наш сервер управления записывать 2 процесса ведения журнала, а именно проверку состояния самой службы MySQL и медленные транзакции запросов. К концу этого учебника мы увидим, что любая информация, записанная из любой службы MySQL внутри выделенного клиента, может быть одновременно просмотрена, визуализирована и проанализирована с сервера управления в реальном времени.

2. Этап установки

На этапе установки мы начнем с установки FileBeat на обоих серверах базы данных MySQL, которые действуют как клиенты. Давайте начнем процесс, ниже приведены шаги:

 [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   
Resolving artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.253.15, 184.73.245.233, ...   
Connecting to artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... connected.   
HTTP request sent, awaiting response... 200 OK   
Length: 12697093 (12M) [binary/octet-stream]   
Saving to: ‘filebeat-6.2.1-x86_64.rpm’   
  
100%[==============================================================================>] 12,697,093 2.20MB/s in 6.9s   
  
2018-06-09 10:51:00 (1.75 MB/s) - ‘filebeat-6.2.1-x86_64.rpm’ saved [12697093/12697093]   
  
[root@mysql_db1 opt]# yum localinstall -y filebeat-6.2.1-x86_64.rpm   
Loaded plugins: fastestmirror, ovl   
Examining filebeat-6.2.1-x86_64.rpm: filebeat-6.2.1-1.x86_64   
Marking filebeat-6.2.1-x86_64.rpm to be installed   
Resolving Dependencies   
--> Running transaction check   
---> Package filebeat.x86_64 0:6.2.1-1 will be installed   
--> Finished Dependency Resolution   
  
Dependencies Resolved   
  
========================================================================================================================   
Package Arch Version Repository Size   
========================================================================================================================   
Installing:   
filebeat x86_64 6.2.1-1 /filebeat-6.2.1 49 M   
  
Transaction Summary   
========================================================================================================================   
Install 1 Package   
  
Total size: 49 M   
Installed size: 49 M   
Downloading packages:   
Running transaction check   
Running transaction test   
Transaction test succeeded   
Running transaction   
Installing : filebeat-6.2.1-1.x86_64 1/1   
Verifying : filebeat-6.2.1-1.x86_64 1/1   
  
Installed:   
filebeat.x86_64 0:6.2.1-1   
  
Complete!   

После завершения мы перечислим модуль по умолчанию, который включен в пакет FileBeat, и включим модуль mysql, который необходим для наших случаев. Ниже приведены шаги:

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

Готово, теперь давайте отредактируем конфигурацию, необходимую для модуля mysql, который мы только что включили. По умолчанию, как только мы включим модуль mysql из пакета filebeat, он автоматически создаст файл yaml внутри директории modules.d. Однако, если файл не был создан, не стесняйтесь создать новый файл yaml в том же месте. Ниже приведены шаги:

 [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*"]   

Как показано выше, мы решили записывать 2 процесса ведения журнала из службы MySQL, а именно проверку состояния базы данных и журнал медленных запросов.

Теперь, когда все готово, давайте внесем некоторые настройки в основной конфигурационный файл для filebeat в файле filebeat.yml. Ниже приведены установленные конфигурации:

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

Обратите внимание, что мы установили IP-адрес для хоста logstash, который равен 172.17.0.6. Этот IP-адрес — адрес нашего централизованного сервера управления, который будет напрямую собирать данные журнала. Я установил жестко закодированный IP, так как не вносил никаких альтернативных изменений в файл /etc/hosts и не использовал DNS-сервер для этого учебника. Тем не менее, не стесняйтесь использовать имя хоста сервера управления, если вы внесли альтернативные изменения.

Поскольку все было настроено согласно плану, давайте запустим службы filebeat. Ниже приведены шаги:

 [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   

Обратите внимание, что после запуска службы filebeat в журнале отображается ошибка. Это связано с тем, что сервер управления, который был назначен, еще не настроен. На начальном этапе вы можете игнорировать журнал ошибок, так как он автоматически восстановится, как только наш сервер управления будет настроен и начнет собирать данные.

Поскольку конфигурация для клиентской базы завершена, вы можете продолжить воспроизводить шаги на другом сервере MySQL, который также действует как клиент.

Далее мы продолжим с настройкой самого сервера управления.

3. Этап установки (Сторона централизованного сервера управления)

Теперь, когда мы завершили настройку клиентской стороны, давайте начнем настройку, необходимую для самого сервера управления. В кратком изложении, есть 3 основных пакета, которые необходимо установить и настроить для сервера управления, а именно ElasticSearch, LogStash и Kibana.

На этом этапе мы начнем установку и настройку, необходимую для ElasticSearch, ниже приведены шаги:

 [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   
Resolving artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 54.235.82.130, 107.21.253.15, ...   
Connecting to artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... connected.   
HTTP request sent, awaiting response... 200 OK   
Length: 29049089 (28M) [binary/octet-stream]   
Saving to: ‘elasticsearch-6.2.1.tar.gz’   
  
100%[==============================================================================>] 29,049,089 2.47MB/s in 16s   
  
2018-06-09 12:48:21 (1.76 MB/s) - ‘elasticsearch-6.2.1.tar.gz’ saved [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   

После завершения установки elasticsearch давайте продолжим с частью конфигурации. Для конфигурации мы назначим директорию /data/data для хранения собранных данных журнала, которые будут проанализированы. Эта директория также будет использоваться для хранения индекса, который будет использоваться самим elasticSearch для более быстрого запроса. Директория /data/logs будет использоваться самим elasticSearch для его собственных целей ведения журнала. Ниже приведены шаги:

 [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   

Готово, для работы ElasticSearch требуется, чтобы Java была настроена. Ниже приведены шаги по установке и настройке Java на сервере.

 [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   
Resolving download.oracle.com (download.oracle.com)... 23.49.16.62   
Connecting to download.oracle.com (download.oracle.com)|23.49.16.62|:80... connected.   
HTTP request sent, awaiting response... 302 Moved Temporarily   
Location: https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm [following]   
--2018-06-09 12:57:10-- https://edelivery.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm   
Resolving edelivery.oracle.com (edelivery.oracle.com)... 104.103.48.174, 2600:1417:58:181::2d3e, 2600:1417:58:188::2d3e   
Connecting to edelivery.oracle.com (edelivery.oracle.com)|104.103.48.174|:443... connected.   
HTTP request sent, awaiting response... 302 Moved Temporarily   
Location: http://download.oracle.com/otn-pub/java/jdk/8u131-b11/d54c1d3a095b4ff2b6607d096fa80163/jdk-8u131-linux-x64.rpm?AuthParam=1528549151_b1fd01d854bc0423600a83c36240028e [following]   
--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   
Connecting to download.oracle.com (download.oracle.com)|23.49.16.62|:80... connected.   
HTTP request sent, awaiting response... 200 OK   
Length: 169983496 (162M) [application/x-redhat-package-manager]   
Saving to: ‘jdk-8u131-linux-x64.rpm’   
  
100%[==============================================================================>] 169,983,496 2.56MB/s in 64s   
  
2018-06-09 12:58:15 (2.54 MB/s) - ‘jdk-8u131-linux-x64.rpm’ saved [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)   

Готово, теперь elasticSearch установлен и настроен на сервере. Однако, из-за некоторых политик безопасности, elasticSearch запрещен для запуска пользователем root, поэтому мы создадим дополнительного пользователя, который будет владельцем службы elasticSearch и запустит ее. Ниже приведены шаги по созданию выделенного пользователя для этого:

 [root@elk_master config]# useradd -s /bin/bash shahril   
[root@elk_master config]# passwd shahril   
Changing password for user shahril.   
New password:   
BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic   
Retype new password:   
passwd: all authentication tokens updated successfully.   
  
[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   

После завершения, войдите как пользователь и вы можете запустить службы elasticSearch.

 [root@elk_master config]# su - shahril   
Last login: Sat Jun 9 13:03:07 UTC 2018 on 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, -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,531][INFO ][o.e.p.PluginsService ] [elk_master] loaded module [percolator]   
[2018-06-09T13:06:27,532][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] loaded module [tribe]   
[2018-06-09T13:06:27,534][INFO ][o.e.p.PluginsService ] [elk_master] no plugins loaded   

Отлично, теперь elasticSearch работает без каких-либо проблем, вы заметите, что дополнительные порты установлены на сервере, которые относятся к службе elasticSearch. Вы можете проверить список портов, как показано ниже:

 [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   

Теперь давайте перейдем к настройке и конфигурации служб logstash. Ниже приведены шаги, необходимые для процесса установки:

 [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   
Resolving artifacts.elastic.co (artifacts.elastic.co)... 107.21.253.15, 23.21.67.46, 107.21.237.188, ...   
Connecting to artifacts.elastic.co (artifacts.elastic.co)|107.21.253.15|:443... connected.   
HTTP request sent, awaiting response... 200 OK   
Length: 140430729 (134M) [binary/octet-stream]   
Saving to: ‘logstash-6.2.1.rpm’   
  
100%[==============================================================================>] 140,430,729 2.19MB/s in 60s   
  
2018-06-09 13:08:57 (2.24 MB/s) - ‘logstash-6.2.1.rpm’ saved [140430729/140430729]   
  
[root@elk_master opt]# yum localinstall -y logstash-6.2.1.rpm   
Loaded plugins: fastestmirror, ovl   
Examining logstash-6.2.1.rpm: 1:logstash-6.2.1-1.noarch   
Marking logstash-6.2.1.rpm to be installed   
Resolving Dependencies   
--> Running transaction check   
---> Package logstash.noarch 1:6.2.1-1 will be installed   
--> Finished Dependency Resolution   
  
Dependencies Resolved   
  
========================================================================================================================   
Package Arch Version Repository Size   
========================================================================================================================   
Installing:   
logstash noarch 1:6.2.1-1 /logstash-6.2.1 224 M   
  
Transaction Summary   
========================================================================================================================   
Install 1 Package   
  
Total size: 224 M   
Installed size: 224 M   
Downloading packages:   
Running transaction check   
Running transaction test   
Transaction test succeeded   
Running transaction   
Installing : 1:logstash-6.2.1-1.noarch 1/1   
Using provided startup.options file: /etc/logstash/startup.options   
Successfully created system startup script for Logstash   
Verifying : 1:logstash-6.2.1-1.noarch 1/1   
  
Installed:   
logstash.noarch 1:6.2.1-1   
  
Complete!   

После завершения установки примените необходимые настройки, как указано ниже:

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

Обратите внимание, что в конфигурации выше мы установили входные данные, которые будут приниматься от службы filebeat на стороне клиента, использующей порт 5044. Мы также установили правильную аннотацию для logstash, чтобы согласовать необработанные данные, полученные от каждого клиента. Это необходимо, чтобы их было легче просматривать и анализировать со стороны elasticSearch.

Далее нам нужно установить модуль filebeats для logstash, чтобы logstash мог захватывать и собирать необработанные данные со стороны клиента.

 [root@elk_master opt]# /usr/share/logstash/bin/logstash-plugin install logstash-input-beats   
Validating logstash-input-beats   
Installing logstash-input-beats   
Installation successful   

После завершения установки и настройки, необходимых для logstash, мы можем запустить службы напрямую. Ниже приведены шаги:

 [root@elk_master opt]# service logstash restart   
Redirecting to /bin/systemctl restart logstash.service   
  
[root@elk_master opt]# service logstash status   
Redirecting to /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 succesfully {: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]   

Как вы можете видеть, теперь служба logstash успешно запущена и начинает собирать данные с каждой клиентской стороны. В качестве альтернативы вы можете использовать команду curl, чтобы увидеть статус и обновления со стороны logstash. Ниже приведены примеры:

 [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   

Последнее, но не менее важное, нам нужно настроить и сконфигурировать службы kibana, чтобы создать полный централизованный сервер управления. Просто примечание, так как kibana используется для упрощения процесса сбора и анализа данных через визуализацию, это не важный пакет, как elasticSearch или logstash, если вы настраиваете сервер на меньшем устройстве. Тем не менее, чтобы продолжить, ниже приведены шаги по установке и настройке:

 [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   
Resolving artifacts.elastic.co (artifacts.elastic.co)... 107.21.237.188, 107.21.237.95, 107.21.253.15, ...   
Connecting to artifacts.elastic.co (artifacts.elastic.co)|107.21.237.188|:443... connected.   
HTTP request sent, awaiting response... 200 OK   
Length: 83465500 (80M) [binary/octet-stream]   
Saving to: ‘kibana-6.2.1-linux-x86_64.tar.gz’   
  
100%[==============================================================================>] 83,465,500 2.76MB/s in 41s   
  
2018-06-09 13:22:28 (1.94 MB/s) - ‘kibana-6.2.1-linux-x86_64.tar.gz’ saved [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"   

Обратите внимание, что я связал kibana с нашей службой ElasticSearch внутри конфигурации и назначил порт, который будет использоваться службой Kibana после запуска. Теперь, когда все уже на месте, мы можем запустить последние службы. Ниже приведены шаги:

 [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   

Отлично, теперь все работает, как показано выше с помощью команды netstat. Теперь давайте посмотрим на панель управления Kibana и сделаем настройки. Перейдите по адресу http://172.17.0.6:5601/app, вы увидите панель управления, которая будет показана ниже.

Kibana Dashboard

Далее на панели управления нажмите на вкладку Управление, затем определите шаблон индекса, в нашем случае шаблон индекса определяется как имя файла журнала, сгенерированное. Введите информацию, затем нажмите далее.

Add Index Pattern

После этого введите переменные, которые будут использоваться в качестве временных рядов. После завершения нажмите Создать шаблон индекса. Ниже приведен пример:

Create Index Pattern

Отлично, теперь сервер управления готов к использованию. Давайте продолжим, протестировав его работоспособность.

4. Этап тестирования

Перед тем как начать тест, давайте сделаем предположение о конечных результатах. Для этого теста мы попробуем выполнить запрос к базе данных, который превысит время долгого запроса, назначенное клиентом, который является сервером MySQL. Как только мы выполним, наш централизованный сервер управления должен автоматически показать результат информации о медленном запросе в виде графика через панель управления Kibana. Теперь, когда все ясно, давайте начнем тест, ниже приведены шаги:

Войдите на любой из клиентских серверов и выполните медленный SQL-запрос, как показано ниже:

 [root@mysql_db1 ~]# mysql --login-path=root -P 3306 --prompt='TEST>'   
Welcome to the MySQL monitor. Commands end with ; or \g.   
Your MySQL connection id is 193   
Server version: 5.7.21-log MySQL Community Server (GPL)   
  
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.   
  
Oracle is a registered trademark of Oracle Corporation and/or its   
affiliates. Other names may be trademarks of their respective   
owners.   
  
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.   
  
TEST>select sleep(5);   
+----------+   
| sleep(5) |   
+----------+   
| 0 |   
+----------+   
1 row in set (5.01 sec)   
  
TEST>select sleep(6);   
+----------+   
| sleep(6) |   
+----------+   
| 0 |   
+----------+   
1 row in set (6.00 sec)   
  
TEST>select sleep(10) 'run for 10 seconds';   
+--------------------+   
| run for 10 seconds |   
+--------------------+   
| 0 |   
+--------------------+   
1 row in set (10.00 sec)   
  
TEST>select sleep(3) 'test again';   
+------------+   
| test again |   
+------------+   
| 0 |   
+------------+   
1 row in set (3.00 sec)   
  
TEST>exit   
Bye   

Как показано выше, мы смогли произвести некоторые медленные запросы, которые автоматически записались в журнал медленных запросов каждого клиента. Теперь давайте перейдем к панели управления и посмотрим, успешно ли данные были собраны централизованным сервером и преобразованы в графическую визуализацию.

Log Data has been indexed

Отлично, как показано выше, есть список информации о ведении журнала, успешно собранной и просмотренной через панель управления kibana. Вы можете использовать левую вкладку, чтобы отфильтровать, какой тип столбца вы хотите показать или скрыть, ниже приведен пример :-

Kibana Dashboard navigation

Используя текстовое поле в верхней части панели управления, вы можете ввести SQL-запрос, связанный с просмотром определенной информации или части необходимых данных.

Search for log data with SQL

Отлично, как показано выше, медленный SQL-запрос, который мы первоначально произвели с одного из наших клиентских серверов, автоматически отображается на нашей панели управления Kibana, как и ожидалось.

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.