カタカタブログ

SIerで働くITエンジニアがカタカタした記録を残す技術ブログ。Java, Oracle Database, Linuxが中心です。たまに数学やデータ分析なども。

Fluentd 2.3 + Elasticsearch 5.3 + Kibana 5.3 環境を構築してみた

以前Fluentd (td-agent 2.3.0) + Elasticsearch 2.1 + Kibana 4.3の環境を構築した。
totech.hateblo.jp

2017年4月現在、ElasticsearchとKibanaが5.3となり新しくなっていたので、現在の最新版で環境を再構築してみることにした。
結果、手順に大きな変更はなく簡単に構築できたが、細かな部分で違いもあったので手順をメモする。

環境はMacにインストールしたVirtualBox上にゲストOSとしてCent OS 7.3をたててそこに構築する。
今回利用した各種ソフトウェアのバージョンは以下の通り。

  • VirtualBox 5.1.18
  • Vagrant 1.9.3
  • CentOS Linux release 7.3.1611 (Core)
  • Fluentd (td-agent v2.3.4)
  • Elasticsearch 5.3.0
  • Kibana 5.3.0

Fluentd (td-agent 2.3.0) インストール

Fluentdは公式のドキュメントに従ってインストールする。Redhat系の場合は以下のドキュメントを参照する。
http://docs.fluentd.org/v0.12/articles/install-by-rpm

インストールコマンドを一発打てば、それだけでインストールされてしまう。とても簡単。

$ sudo curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh

tg-agentサービスとして登録されるので、起動・停止はsystemctlコマンドから行える。

$ sudo systemctl start td-agent.service
$ sudo systemctl status td-agent.service
● td-agent.service - LSB: data collector for Treasure Data
   Loaded: loaded (/etc/rc.d/init.d/td-agent; bad; vendor preset: disabled)
   Active: active (running) since Sun 2017-04-02 13:11:18 UTC; 1s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 15299 ExecStop=/etc/rc.d/init.d/td-agent stop (code=exited, status=0/SUCCESS)
  Process: 15381 ExecStart=/etc/rc.d/init.d/td-agent start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/td-agent.service
           ├─15401 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-ag...
           └─15404 /opt/td-agent/embedded/bin/ruby /usr/sbin/td-agent --log /var/log/td-agent/td-ag...

active (running)となっており、問題なく起動した。

fluent-plugin-elasticsearchプラグインをインストール

後でElasticsearchにデータを転送できるようにするため、連携用プラグインを入れておく。これも特に変更はない。

$ sudo /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch
$ sudo /opt/td-agent/embedded/bin/fluent-gem list fluent-plugin-elasticsearch

*** LOCAL GEMS ***

fluent-plugin-elasticsearch (1.9.3)

これでFluentdは正常にインストールできた。

Fluentd動作確認

簡単に動作確認しておく。
/etc/td-agent/td-agent.confに以下の内容を追記。
これは送られたデータを標準出力するための設定である。

$ sudo vi /etc/td-agent/td-agent.conf
<source>
  type forward
  port 24224
</source>

<match *.*>
  type stdout
</match>

fluent-catでFluentdへデータを入力する。

$ echo '{"message":"Hello,World."}' | /opt/td-agent/embedded/bin/fluent-cat debug.test

Fluentdのログを確認し、送られたメッセージが設定した通り出力されていることが確認できる。

$ tail /var/log/td-agent/td-agent.log
  </source>
  <source>
    @type debug_agent
    bind 127.0.0.1
    port 24230
  </source>
</ROOT>
2017-04-09 01:47:35 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2017-04-09 01:47:35 +0000 [info]: listening dRuby uri="druby://127.0.0.1:24230" object="Engine"
2017-04-09 02:09:02 +0000 debug.test: {"message”:"Hello,World.”}

正常に動作しているよう。これでFluentdはOK。

Elasticsearch 5.3.0 インストール

まずJDK 8が必要となるので、インストールされていることを確認しておく。インストールされていない場合は入れておく。

$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

続いてElasticsearchをインストールする。
以下の公式のドキュメントに従って、yumでインストールする。
https://www.elastic.co/guide/en/elasticsearch/reference/current/rpm.html

まずRPMリポジトリを追加する。
/etc/yum.repos.dディレクトリにelasticsearch.repoファイルを以下の内容で作成する。

$ sudo vi /etc/yum.repos.d/elasticsearch.repo
[elasticsearch-5.x]
name=Elasticsearch repository for 5.x packages
baseurl=https://artifacts.elastic.co/packages/5.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md

yumでelasticsearchをインストールする。

$ sudo yum install elasticsearch

これでOK。systemctlコマンドで起動できることを確認する。

$ sudo systemctl start elasticsearch
Unit elasticsaerch.service could not be found.
$ sudo systemctl status elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2017-04-04 12:40:37 UTC; 15s ago
     Docs: http://www.elastic.co
  Process: 11722 ExecStart=/usr/share/elasticsearch/bin/elasticsearch -p ${PID_DIR}/elasticsearch.pid --quiet -Edefault.path.logs=${LOG_DIR} -Edefault.path.data=${DATA_DIR} -Edefault.path.conf=${CONF_DIR} (code=exited, status=1/FAILURE)
  Process: 11721 ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec (code=exited, status=0/SUCCESS)
Main PID: 11722 (code=exited, status=1/FAILURE)

Apr 04 12:40:37 localhost.localdomain systemd[1]: Started Elasticsearch.
Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: Java HotSpot(TM) 64-Bit Server VM warning:...2)
Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: #
Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: # There is insufficient memory for the Jav...e.
Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: # Native memory allocation (mmap) failed t...y.
Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: # An error report file with more informati...s:
Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: # /tmp/hs_err_pid11722.log
Apr 04 12:40:37 localhost.localdomain systemd[1]: elasticsearch.service: main process exited, code=ex...URE
Apr 04 12:40:37 localhost.localdomain systemd[1]: Unit elasticsearch.service entered failed state.
Apr 04 12:40:37 localhost.localdomain systemd[1]: elasticsearch.service failed.
Hint: Some lines were ellipsized, use -l to show in full.

今回、この環境で最初に起動したところこのようなエラーとなり起動できなかった。エラーメッセージをよく見ると、以下のようにJavaヒープサイズが足りていないことが原因だった。

Apr 04 12:40:37 localhost.localdomain elasticsearch[11722]: Java HotSpot(TM) 64-Bit Server VM warning: INFO: os::commit_memory(0x0000000085330000, 2060255232, 0) failed; error='Cannot allocate memory' (errno=12)

そこでVirtualBox側でメモリを2GBメモリ付与するようにして実行したところ、正常に起動した(メモリ1GBだと後続のKibanaと同時実行できなかった)。

$ sudo systemctl start elasticsearch
$ sudo systemctl status -l elasticsearch
● elasticsearch.service - Elasticsearch
   Loaded: loaded (/usr/lib/systemd/system/elasticsearch.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2017-04-04 12:56:57 UTC; 3s ago
     Docs: http://www.elastic.co
  Process: 10991 ExecStartPre=/usr/share/elasticsearch/bin/elasticsearch-systemd-pre-exec (code=exited, status=0/SUCCESS)
Main PID: 10992 (java)
   CGroup: /system.slice/elasticsearch.service
           └─10992 /bin/java -Xms2g -Xmx2g -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseCMSInitiatingOccupancyOnly -XX:+DisableExplicitGC -XX:+AlwaysPreTouch -server -Xss1m -Djava.awt.headless=true -Dfile.encoding=UTF-8 -Djna.nosys=true -Djdk.io.permissionsUseCanonicalPath=true -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true -Dio.netty.recycler.maxCapacityPerThread=0 -Dlog4j.shutdownHookEnabled=false -Dlog4j2.disable.jmx=true -Dlog4j.skipJansi=true -XX:+HeapDumpOnOutOfMemoryError -Des.path.home=/usr/share/elasticsearch -cp /usr/share/elasticsearch/lib/elasticsearch-5.3.0.jar:/usr/share/elasticsearch/lib/* org.elasticsearch.bootstrap.Elasticsearch -p /var/run/elasticsearch/elasticsearch.pid --quiet -Edefault.path.logs=/var/log/elasticsearch -Edefault.path.data=/var/lib/elasticsearch -Edefault.path.conf=/etc/elasticsearch

今度は正常にElasticsearchが起動した。

Elasticsearch動作確認

Elasticsearchを起動し、GETに応答することを確認する。デフォルトでは9200番ポートで起動するので、以下のcurlコマンドで応答があることをまず確認する。

$ curl -XGET http://localhost:9200
{
  "name" : "8qxuL9m",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "KMhFRm0tScuDQ0GnZWeNfQ",
  "version" : {
    "number" : "5.3.0",
    "build_hash" : "3adb13b",
    "build_date" : "2017-03-23T03:31:50.652Z",
    "build_snapshot" : false,
    "lucene_version" : "6.4.1"
  },
  "tagline" : "You Know, for Search"
}

サンプルインデックスも作成してみる。

$ curl -XPUT http://localhost:9200/sample_index/sample_log/1 -d '
{
  "timestamp": "01/May/2015:05:10:22 +0000",
  "value": "hoge",
  "number": "200"
}
'

作ったサンプルインデックスを検索する。

$ curl -XGET http://localhost:9200/sample_index/_search -d '
{
  "query": {
    "match_all": {}
  }
}
'

以下の応答が得られた。

{"took":46,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":1,"max_score":1.0,"hits":[{"_index":"sample_index","_type":"sample_log","_id":"1","_score":1.0,"_source":
{
  "timestamp": "01/May/2015:05:10:22 +0000",
  "value": "hoge",
  "number": “200"
}
}]}}

問題なく、インデックスの作成、検索もできている。Elasticsearchは正しく動作しているよう。

Kibana 5.3.0インストール

KibanaもElasticsearchと同様に公式ドキュメントを参照すると、yumでインストールできるよう。
https://www.elastic.co/guide/en/kibana/current/rpm.html

この手順によると、最初にRPMリポジトリを登録するため/etc/yum.repos.dディレクトリにkibana.repoファイルを作成する手順があるが、
よく見るとこれは先ほどElasticsearchをインストールする前に登録したリポジトリと同じである。
そのため、この手順は省略できる。

なので、直接yumでkibanaをインストールする。

$ sudo yum install kibana
$ sudo systemctl start kibana
$ sudo systemctl status kibana
● kibana.service - Kibana
   Loaded: loaded (/etc/systemd/system/kibana.service; disabled; vendor preset: disabled)

   Active: active (running) since Sun 2017-04-09 02:03:12 UTC; 2s ago
Main PID: 11311 (node)
   CGroup: /system.slice/kibana.service
           └─11311 /usr/share/kibana/bin/../node/bin/node --no-warnings /usr/share/kibana/bin/../src/cli -c ...

Kibanaも正常に起動した。インストールは問題なく完了。
ただし、デフォルトではKibanaはlocalhostからのリクエストしか受け付けないようになっており、ゲストOSから画面を見ることはできない。
これは不便なので設定ファイルを編集して任意の送信元からアクセスできるようにする。

$ sudo vi /etc/kibana/kibana.yml

以下の行がコメントアウトされているので、コメントを外し、0.0.0.0に変更する。

#server.host: “localhost"
server.host: “0.0.0.0”

さらにelasticsearchと連携用に以下の行のコメントも外しておく。

elasticsearch.url: "http://localhost:9200"

kibanaを再起動する。

$ sudo systemctl restart kibana

Kibana動作確認

ホストOSから以下のURLにアクセスし、Kibanaの画面が表示されることを確認する。
http://guest-os-ip:5601
f:id:osn_th:20170411092041p:plain
画面が表示されればOK。

さらに、Kibana 5ではDev ToolsからConsole画面があり、ここからElasticsearchへのREST APIを発行できるようになっている。
これは、今までSenseというKibanaのプラグインだったものが標準で取り込まれたものである。

以下のように、GET/PUTリクエストを発行し、正常にElasticsearchに登録、検索等の処理ができている!
f:id:osn_th:20170411092033p:plain
KibanaとElasticsearchの疎通も問題なさそう。

まとめ

Fluentd 2.3 + Elasticsearch 5.3 + Kibana 5.3という2017年4月現在の最新バージョンの組み合わせで環境構築を行った。
手順は前回のものを参考にしつつも、公式ドキュメントに従えば簡単に構築できることが分かった。
今回は環境構築しただけだが、特にKibanaなどはUIも大きく変わっているようなので新機能も近いうちに試してみたい。

以上!