ELKインストール · 11 min read · Feb 02, 2026

CentOS 7にELKを集中ログ管理サーバーとしてインストールする

このチュートリアルでは、CentOS 7上でELKスタックを使用して集中ログ管理サーバーを設定する方法を説明します。ELKは、ElasticSearch、Logstash、Kibanaの3つのサービスの組み合わせです。この概念を使用して完全な集中ログ管理サーバーを構築するには、各パッケージが異なる目的を果たし、相互に関連している必要があります。基本的には、次のように連携して動作します。

  1. 管理したい各クライアントは、関連するサービスの独自のログを生成します。
  2. 各クライアントからのすべてのログ情報を管理するために使用されるサーバーは、LogStashパッケージを使用してデータを収集し、関連する値に変換します。定義上、これはオープンソースのサーバーサイドデータ処理パイプラインであり、同時に多数のソースからデータを取り込み、変換します。
  3. データが収集され、変換されると、管理サーバーはElasticSearchを使用してデータを関連する値に分析します。必要に応じて関連するレポートを生成するために一般的なクエリ言語を使用できます。
  4. 関連データが検証され、分析されると、Kibanaパッケージが登場し、関連データを適切なビューに視覚化し、理解しやすい光沢のあるダッシュボードにまとめるのに役立ちます。

以下の画像は、ワークフロープロセスを要約しています:

1. 前提条件

このチュートリアルでは、64ビット版のCentOS Linux 7.4を使用しています。このチュートリアルでは、3つのサーバーを使用します。最初のサーバーは管理サーバーとして使用され、他の2つはクライアントとして使用されます。この演習では、管理サーバーを使用して、すでに設定、構成され、各クライアントで実行されている既存のMySQLサービスを監視します。MySQLは主にOLTP目的で使用されるデータベースサービスであるため、管理サーバーはMySQLサービス自体のヘルスチェックとスロークエリトランザクションの2つのログプロセスを記録します。このチュートリアルの終わりまでに、専用クライアント内の任意のMySQLサービスから記録された情報を、管理サーバーからリアルタイムで直接確認、視覚化、分析できることがわかります。

2. インストールフェーズ

インストールフェーズでは、クライアントとして機能する両方のMySQL DBサーバーでFileBeatのインストールを開始します。プロセスを開始しましょう。以下は手順です:

 [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-x86_64 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   
ginx   
osquery   
postgresql   
redis   
system   
traefik   
[root@mysql_db1 opt]# filebeat modules enable mysql   
Enabled mysql   

完了しました。次に、先ほど有効にしたmysqlモジュールに必要な設定を編集しましょう。デフォルトでは、filebeatパッケージからmysqlモジュールを有効にすると、自動的にmodules.dディレクトリ内にyamlファイルが作成されます。ただし、ファイルが作成されなかった場合は、同じ場所に新しい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*"]   

上記のように、MySQLサービスからの2つのログプロセス、すなわちデータベース自体のヘルスチェックとスロークエリログを記録することに決めました。

すべてが完了したら、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"]   

上記の設定では、logstashホストのIPアドレスを172.17.0.6に設定しました。このIPは、ログデータを直接収集するためにクローリングする集中管理サーバーのアドレスです。/etc/hostsファイルに代替変更を行っておらず、このチュートリアルでDNSサーバーを使用していないため、ハードコーディングされたIPを設定しました。ただし、代替変更を行った場合は、管理サーバーのホスト名を使用してください。

すべてが計画通りに設定されたので、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, -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] 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側での表示と分析が容易になります。

次に、logstashがクライアント側から生データをキャプチャし、クローリングできるようにするために、filebeatsモジュールをインストールする必要があります。

 [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.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のダッシュボードを表示し、設定を行います。URL 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

素晴らしい、最初にクライアントサーバーの1つから生成したスロークエリSQLが、期待通りにKibanaダッシュボードに自動的に表示されました。

Share: X/Twitter LinkedIn

新しい投稿を受信箱で受け取る

スパムはありません。いつでも購読を解除できます。