ラック
Home > ブログ > 記事 > 2016年12月 > ELKスタックインストールのテスト(未完)

ELKスタックインストールのテスト(未完)

カテゴリ: Linux, サーバ

ログ解析&可視化をしてみたくなり、ELKスタック(Elasticsearch, Logstash, Kibana)に手を付けてみることにしました。結果的には沼に何度も嵌って現段階では未完です…。

全体

作業をする前に、ざっと全体を眺めます。

今回はテキストファイルにダンプされたログを集積したかったので、FileBeatsを使う方向で考え、そのマニュアルの通りにやってみよう、という方針を立てました。

  1. Beats:エージェントとしてログサーバにログを投げる
  2. Logstash:Beatsが投げてきたログをキャッチして、Elasticsearchに蓄積しやすい形にデータを整形・加工してElasticsearchに渡す
  3. Elasticsearch:ログ蓄積サーバ&全文検索エンジン
  4. Kibana:Elasticsearchに蓄積されたログデータを条件によって抽出・結果を可視化する

ざっくり、こんな感じの理解で良いのでしょうか?こんなイメージを持って作業をしてみます。

各ソフトの最新版のバージョンは5.0.2のようです(216/12/9現在)。各インストール手順のコマンドは6.0.0-alpha1になっていてずれているのですが…alphaとか怖いので、コマンド内のバージョンを5.0.2に合わせてやってみることにしましょう。

ちなみにサーバはテスト用のCentOS6.7のサーバで、Javaは既に1.8 JDKが入っているものを使用しました。

Elasticsearchインストール


#curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.0.2.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 31.3M  100 31.3M    0     0  3813k      0  0:00:08  0:00:08 --:--:-- 5824k

#sudo rpm -i elasticsearch-5.0.2.rpm
警告: elasticsearch-5.0.2.rpm: ヘッダ V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Creating elasticsearch group... OK
Creating elasticsearch user... OK
### NOT starting on installation, please execute the following statements to configure elasticsearch service to start automatically using chkconfig
 sudo chkconfig --add elasticsearch
### You can start elasticsearch service by executing
 sudo service elasticsearch start

#sudo service elasticsearch start
elasticsearch を起動中:                                    [  OK  ]

ダウンロード時に暗号化キーの設定しなかったのですがとりあえずいけました。起動までOK。


# curl http://127.0.0.1:9200
curl: (7) couldn't connect to host

さっそくテストしてみましたが、怒られました。


# sudo service elasticsearch stop
elasticsearch を停止中:                                    [  OK  ]

ローカルホストしか接続を認めないような設定になっている、と書いてある記事があったのでネットワークを疑いましたが、そもそも先のcurlはローカルホスト宛なので関係ないですね(後で気付いた)。


# less /etc/elasticsearch/elasticsearch.yml

Elasticsearchを止めてネットワーク設定を見てみましたが、有効なnetwork.hostの設定はありませんでした。


# sudo service elasticsearch start
elasticsearch を起動中:                                    [  OK  ]

ポートを使用しているのか調べてみます。


# lsof -i:9200
COMMAND   PID          USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    32732 elasticsearch  130u  IPv6 11789550      0t0  TCP localhost:wap-wsp (LISTEN)
java    32732 elasticsearch  131u  IPv6 11789551      0t0  TCP localhost:wap-wsp (LISTEN)

# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 ::ffff:127.0.0.1:9200       :::*                        LISTEN
tcp        0      0 ::1:9200                    :::*                        LISTEN

ちゃんと開いていますね…。ということで、もう一度試してみることに。


# curl http://127.0.0.1:9200
{
  "name" : "541jXlG",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "yIYeR4yRQxGAtDPMZh4osA",
  "version" : {
    "number" : "5.0.2",
    "build_hash" : "f6b4951",
    "build_date" : "2016-11-24T10:07:18.101Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.1"
  },
  "tagline" : "You Know, for Search"
}

行けました。謎。

※後で、サーバスペックの関係でどうも起動に時間がかかっているっぽいので3分くらい置いてからcurlした方が良さそう、ということが分かりました。このときはまだ気付かないで謎現象だと思っていました。

Logstash


#curl -L -O https://artifacts.elastic.co/downloads/logstash/logstash-5.0.2.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  100M  100  100M    0     0  1563k      0  0:01:06  0:01:06 --:--:--  921k

#sudo rpm -i logstash-5.0.2.rpm
警告: logstash-5.0.2.rpm: ヘッダ V4 RSA/SHA512 Signature, key ID d88e42b4: NOKEY
Using provided startup.options file: /etc/logstash/startup.options
Successfully created system startup script for Logstash

入りました。


# whereis logstash
logstash: /etc/logstash /usr/share/logstash

しかし、どこに入ったのか探すのに手間取りました。/usr/share の下に入ったようです。

※検索すると /opt/ 下という人が多かったので迷子になりました…。

公式ドキュメントでは「ver1.5.4ちょうどの場合はBeats用プラグインを入れて」と書いてありましたが、余裕でそれよりも上なのでそこはスルー。設定を行います。


# cd /etc/logstash/conf.d/
# vi logstash.conf
input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => "localhost:9200"
    manage_template => false
    index => "%{[@metadata][beat]}-%{+YYYY.MM.dd}"
    document_type => "%{[@metadata][type]}"
  }
}

とりあえずサンプルをそのまま貼り付けて名前もそのままでテストしてみます。

続いて、Beats用プラグインのアップデート


# cd /usr/share/logstash/
# ./bin/logstash-plugin update logstash-input-beats
Updating logstash-input-beats
Updated logstash-input-beats 3.1.8 to 3.1.12

上がりました。


# sudo service logstash start
logstash: 認識されていないサービスです。

サービス化しておらず、起動できなかったのでコマンドでの起動を試みます。


# pwd
/usr/share/logstash
# ./bin/logstash -f logstash.conf
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs to console
16:39:31.355 [LogStash::Runner] INFO  logstash.agent - No config files found in path {:path=>"/usr/share/logstash/logstash.conf"}
16:39:31.374 [LogStash::Runner] ERROR logstash.agent - failed to fetch pipeline configuration {:message=>"No config files found: logstash.conf. Can you make sure this path is a logstash config file?"}

設定ファイルのパスで怒られました。


# ./bin/logstash -f /etc/logstash/conf.d/logstash.conf
WARNING: Could not find logstash.yml which is typically located in $LS_HOME/config or /etc/logstash. You can specify the path using --path.settings. Continuing using the defaults
Could not find log4j2 configuration at path /usr/share/logstash/config/log4j2.properties. Using default config which logs to console
16:41:48.310 [[main]-pipeline-manager] INFO  logstash.inputs.beats - Beats inputs: Starting input listener {:address=>"0.0.0.0:5044"}
16:41:50.142 [[main]{:removed=>[], :added=>["http://localhost:9200"]}}
16:41:53.374 [[main]-pipeline-manager] INFO  logstash.outputs.elasticsearch - New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["localhost:9200"]}
16:41:53.382 [[main]-pipeline-manager] INFO  logstash.pipeline - Starting pipeline {"id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
16:41:53.389 [[main]-pipeline-manager] INFO  logstash.pipeline - Pipeline main started
16:41:53.545 [Api Webserver] INFO  logstash.agent - Successfully started Logstash API endpoint {:port=>9600}

^C16:42:55.364 [SIGINT handler] WARN  logstash.runner - SIGINT received. Shutting down the agent.
16:42:55.405 [LogStash::Runner] WARN  logstash.agent - stopping pipeline {:id=>"main"}
16:43:00.374 [Ruby-0-Thread-15: /usr/share/logstash/logstash-core/lib/logstash/runner.rb:385] WARN  logstash.runner - Received shutdown signal, but pipeline is still waiting for in-flight events
to be processed. Sending another ^C will force quit Logstash, but this may cause data loss.

起動しましたが、標準出力に乗っかってきてしまったのでctrl+Cで抜けて、&を付けてやり直し。


# ./bin/logstash -f /etc/logstash/conf.d/logstash.conf &
[1] 1734

起きたので確認。


# lsof -i:9600
COMMAND  PID USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
java    1734 root   75u  IPv6 11862577      0t0  TCP localhost:micromuse-ncpw (LISTEN)
# netstat -ant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State
tcp        0      0 ::ffff:127.0.0.1:9600       :::*                        LISTEN

9600がいるのでOK。

Kibana

Kibana4では内部でHTTPサーバを起動することでスタンドアローンに動かせるようになってるらしい。(ネット上にはKibana3の記事多くて最初混乱した。。)

ElasticsearchとKibanaを使ってTwitterのトレンドワードを可視化してみた – Qiita

※予めKibana用に仮想サイト建てたのですが、4以降は独自サーバ建てるので不要だったというオチ…。

ということで、こちらも公式ドキュメント通りに。


#curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-5.0.2-linux-x86_64.tar.gz
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 38.3M  100 38.3M    0     0  1273k      0  0:00:30  0:00:30 --:--:--  520k

# tar xzvf kibana-5.0.2-linux-x86_64.tar.gz

##大量に展開

こちらは今までと違って解凍する必要があります。


# cd kibana-5.0.2-linux-x86_64/
#./bin/kibana
  log   [07:59:14.188] [info][status][plugin:kibana@5.0.2] Status changed from uninitialized to green - Ready
  log   [07:59:14.381] [info][status][plugin:elasticsearch@5.0.2] Status changed from uninitialized to yellow - Waiting for Elasticsearch
  log   [07:59:14.566] [info][status][plugin:console@5.0.2] Status changed from uninitialized to green - Ready
  log   [07:59:15.482] [info][status][plugin:timelion@5.0.2] Status changed from uninitialized to green - Ready
  log   [07:59:15.517] [info][listening] Server running at http://localhost:5601
  log   [07:59:15.519] [info][status][ui settings] Status changed from uninitialized to yellow - Elasticsearch plugin is yellow
  log   [07:59:24.095] [info][status][plugin:elasticsearch@5.0.2] Status changed from yellow to yellow - No existing Kibana index found
  log   [07:59:33.448] [info][status][plugin:elasticsearch@5.0.2] Status changed from yellow to green - Kibana index ready
  log   [07:59:33.449] [info][status][ui settings] Status changed from yellow to green - Ready

^C

また標準出力に乗ってしまったのでctrl+Cからの&付けてやり直し。


# ./bin/kibana &
[2] 2067

これで起動したはずですが、アクセスできません。

こちらもローカルホストしかアクセスできないっぽいので、どうにかしませんと。…とはいえ、サービス化していないのでどうやって止めたら良いのか…ということで、一度サーバごと再起動(後でプロセスをkillすれば良いことに気付く)。

ここから先、沼に嵌まることに…

サーバ再起動後、まずKibanaが起きていないことを確認。続いて、設定を確認。Kibanaの設定にnetwork.hostを限定する設定がないので、試しにもう一度Kibanaを起動しようとしましたが「Elasticsearchが動いていないからダメ」というログを標準出力に延々吐き続けたのでもう一度サーバごと再起動…。


# sudo service elasticsearch start
elasticsearch を起動中:                                    [  OK  ]
# sudo service elasticsearch status
elasticsearch が停止していますが PID ファイルが残っています
# rm /var/run/elasticsearch/elasticsearch.pid
rm: remove 通常の空ファイル `/var/run/elasticsearch/elasticsearch.pid'? y
# rm /var/lock/subsys/elasticsearch
rm: remove 通常の空ファイル `/var/lock/subsys/elasticsearch'? y
# sudo service elasticsearch status
elasticsearch は停止しています
# sudo service elasticsearch start
elasticsearch を起動中:                                    [  OK  ]
# sudo service elasticsearch status
elasticsearch が停止していますが PID ファイルが残っています

上記記事を見て起動を何度も試しましたが、Elasticsearchが起動した後にすぐ落ちているっぽいメッセージが…。Logstashが自動起動しているので、起動順番でコケているのかと思い、Logstashを一度killしてみましたが、すぐに起動してくるのでこの手はダメっぽい。

先の通りkibanaにはElasticsearchが必要なので、仮に起動順番だと仮定すると困ったことに…と途方に暮れること数十分。


# pwd
/var/log/elasticsearch
# less elasticsearch.log
[WARN ][o.e.b.JNANatives         ] unable to install syscall filter:
java.lang.UnsupportedOperationException: seccomp unavailable: CONFIG_SECCOMP not compiled into kernel, CONFIG_SECCOMP and CONFIG_SECCOMP_FILTER are n
eeded
        at org.elasticsearch.bootstrap.Seccomp.linuxImpl(Seccomp.java:361) ~[elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Seccomp.init(Seccomp.java:630) ~[elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.JNANatives.trySeccomp(JNANatives.java:215) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Natives.trySeccomp(Natives.java:99) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Bootstrap.initializeNatives(Bootstrap.java:104) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:158) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:291) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:121) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:112) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.cli.SettingCommand.execute(SettingCommand.java:54) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:96) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.cli.Command.main(Command.java:62) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:89) [elasticsearch-5.0.2.jar:5.0.2]
        at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:82) [elasticsearch-5.0.2.jar:5.0.2]

Elasticsearchのログから検索すると上記のスレッドが。

「古いLinuxだから動かないよー」と言っているっぽいのでここに来てほぼ諦め。あとはLogstashを停止して何もなかったようにしておきたいなー、とか考え始めました…。

ということで、改めて各ソフトが動いているかチェックしたところ


# sudo service elasticsearch status
elasticsearch (pid  3591) を実行中...

# curl http://127.0.0.1:9200/
{
  "name" : "541jXlG",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "yIYeR4yRQxGAtDPMZh4osA",
  "version" : {
    "number" : "5.0.2",
    "build_hash" : "f6b4951",
    "build_date" : "2016-11-24T10:07:18.101Z",
    "build_snapshot" : false,
    "lucene_version" : "6.2.1"
  },
  "tagline" : "You Know, for Search"
}

あれ…動いてる……?

ここにきて、どうやらElasticsearchは起動までに時間がかかるのでは?という推測に至りました。topとかで確認すると、確かにメモリがカツカツ…。

ということで、「時間がかかるので5分くらい待つ」という前提を持つことにしました。

沼を抜けた、と仮定して元の作業に戻る

起動したならば、ということでKibanaを起動しなおしてみます。


# cd /HOGEHOGE/kibana-5.0.2-linux-x86_64
# ./bin/kibana &

起動。


#   log   [02:19:15.790] [info][status][plugin:kibana@5.0.2] Status changed from uninitialized to green - Ready
  log   [02:19:16.059] [info][status][plugin:elasticsearch@5.0.2] Status changed from uninitialized to yellow - Waiting for Elasticsearch
  log   [02:19:16.398] [info][status][plugin:console@5.0.2] Status changed from uninitialized to green - Ready
  log   [02:19:20.648] [error][status][plugin:elasticsearch@5.0.2] Status changed from yellow to red - Request Timeout after 3000ms
  log   [02:19:20.660] [info][status][plugin:timelion@5.0.2] Status changed from uninitialized to green - Ready
  log   [02:19:20.953] [info][listening] Server running at http://localhost:5601
  log   [02:19:20.961] [error][status][ui settings] Status changed from uninitialized to red - Elasticsearch plugin is red
  log   [02:19:23.365] [info][status][plugin:elasticsearch@5.0.2] Status changed from red to green - Kibana index ready
  log   [02:19:23.368] [info][status][ui settings] Status changed from red to green - Ready

#

標準出力に出ますが、動いていますね…。しかし、ブラウザではやっぱりアクセス不可なので設定が必要なのかなぁ、と。ホワイトリスト形式なのですかね、Kibanaは…。


# curl http://127.0.0.1:5601/
<script>var hashRoute = '/app/kibana';
var defaultRoute = '/app/kibana';

var hash = window.location.hash;
if (hash.length) {
  window.location = hashRoute + hash;
} else {
  window.location = defaultRoute;
}</script> #

ローカルからのcurlならば応答があるのでどうもそんな感じ。では、もう一度再起動して、Elasticsearchを起動(時間がかかる)し、設定を見直しましょうか。Elasticsearchは…Logstashからデータが来るはずなので、同じサーバ内に同居しているならばローカルホストしか受け付けていなくても問題ないはず。


	network.host: _local_, _site_

ローカルホスト(_local_)と、同一ネットワーク帯(_site_)からのアクセスを許可する設定です。

Elastic Stack 5.0.0 GAリリース! 早速インストール!! #elasticsearch – Taste of Tech Topics

ん、「server.host」ではなくて「network.host」…?これで試してみ…ましたが、ダメでした。

この後もapache配下のディレクトリに配置して起動したりしてみましたがどうにもダメ。curlで127.0.0.1やlocalhostではscriptタグが吐き出されるものの、自分のIPを指定するとアクセスできなくなっているのでやはりKibanaのアクセスが制限されているのが原因っぽい…?ここでどっぷり嵌まって先に進めず。

「公式ドキュメントにオプションでnetworkってあるのになんでwarning吐かれるんだー?」と試すことさらに数時間。いつの間にか参照していたドキュメントがKibanaではなく、Elasticsearchのドキュメントになっていることにも気付かずに…(リンクを辿って行ったら垣根を越えてしまった模様)。

Elasticsearchではnetwork.hostでアクセス制御する模様ですが、Kibanaはそういったものはなし。ただ、受け付けるサーバを指定するserver.hostがある(作業の最初の方に確かに見かけたのですが、変なIPを指定したらしくエラーになったので、ここではないと完全に無視していました)ので、これを指定するところに行き着きました。


# vi config/kibana.yml

### ここから下編集
# Specifies the address to which the Kibana server will bind. IP addresses and host names are both valid values.
# The default is 'localhost', which usually means remote machines will not be able to connect.
# To allow connections from remote users, set this parameter to a non-loopback address.
#server.host: "localhost"
server.host: 0.0.0.0 ##←これを追記
### ここまで

# ./bin/kibana &
[1] 8170
#   log   [08:40:00.403] [info][status][plugin:kibana@5.0.2] Status changed from uninitialized to green - Ready
  log   [08:40:00.505] [info][status][plugin:elasticsearch@5.0.2] Status changed from uninitialized to yellow - Waiting for Elasticsearch
  log   [08:40:00.563] [info][status][plugin:console@5.0.2] Status changed from uninitialized to green - Ready
  log   [08:40:00.590] [info][status][plugin:elasticsearch@5.0.2] Status changed from yellow to green - Kibana index ready
  log   [08:40:00.877] [info][status][plugin:timelion@5.0.2] Status changed from uninitialized to green - Ready
  log   [08:40:00.884] [info][listening] Server running at http://0.0.0.0:5601
  log   [08:40:00.886] [info][status][ui settings] Status changed from uninitialized to green - Ready

これでブラウザでアクセス。…今度こそ行ってくれ…!

本当に廻り道だった。本当に、本当に、なんて遠い廻り道………。

以下、手付かず

Beats

俺達の戦いは、これからだ!(しろめ

タグ: [[tvLinkAdd?&tvKey=`tag`]]

 



関連する記事一覧

    [[Ditto? &phx=`0` //phxは使わない &parents=`43` &hideFolders=`1` //コンテナは隠す &depth=`2` //全ての階層を表示 &display=`all` //全件表示 &orderBy=`pub_date DESC` &filter=`id,626,2` //filterは条件に一致するドキュメントを表示しないようにする。field(適用する変数名)、criterion(適用する対象)、mode(2は「等しい」) &extenders=`tagging` &tagData=`blog_tag` //タグを使う &tags=` データベース, サーバ環境・構築` //タグを使う &tagMode=`onlyTags` &tagDelimiter=`,` &tpl='@CODE:
  • ' //表示パターン ]]