あけましておめでとうございます。僕の中では2019年はまだ9月くらいなんですが、世間はもう2020年に突入しているらしいですね。
半年ほど前にElasticsearchとKibanaを自宅のUbuntuマシンに入れてみたのですが、
- 当時のマシンは何年も前のメモリ2GB(しかもDDR2)マシン(サーバ用途なので割と間に合ってた)
- Elasticsearch/Kibanaを起動したら動かない置物と化す
Elasticsearch7.3.0を入れたはずなのになぜか6.x系が入ってKibanaに怒られる(1敗)
Elasticsearchを入れ直したら起動して秒で落ちて原因究明に手間取る(2敗)
というか物理メモリが足りていないのでそもそもまともに動かせない(3敗)— ぱらつり (@paralleltree) August 10, 2019
ということでインストールだけして放置する事態が続いていました。
以前のエントリで述べた通りこのマシンがぶっ壊れ、新たなマシンを調達したことでメモリが8GBに増えたので再び動かしてみることに。
ゆくゆくは運用しているアプリケーションのログをリアルタイムで収集して可視化するところまで持っていきます。一応メトリックのモニタリングしたいなあとは思いつつもなかなか手を出さない状況が続いていたんですよね。
今回はとりあえずログを記録する部分を構成していきます。
- ElasticsearchとKibanaを立ち上げてみる←イマココ
- LogstashでElasticsearchにログを取り込んでみる
- KibanaでElasticsearchのデータを可視化する
- FilebeatとLogstashでリモートのログを安全に転送する
つかうもの
ElasticsearchとKibana
Elastic StackはElastic社が提供するElasticsearch, Kibana, Beats, Logstashをまとめたプロダクト群を指します。
ElasticsearchはElastic社が提供するApache Luceneベースの分散型検索エンジンで、構造化データと非構造化データの両方に対応し、柔軟なクエリを実行したりスケーリングすることで大規模なデータ処理を行うことができます。
KibanaはElasticsearch上のデータを管理・可視化するツールで、Elasticsearchが備えるクエリ機能によってさまざまな角度からデータを見ることができます。
Docker
DockerはOSレベルで仮想化した環境をコンテナ単位で提供するソフトウェアです。
特定のサービスを実際のマシン上ではなく、コンテナ単位で実行することでシステム環境への変更を局所化し、1台のサーバで複数のサービスを分離して実行できます。
あるコンテナでの動作に問題が生じた場合、そのコンテナのみを削除することでそのほかの環境に影響を及ぼさずに済むといった利点があります。
ElasticsearchやKibanaを直接サーバに入れていると壊したりしたときに面倒そうなので、一度削除してから改めてDockerコンテナで動かすことにしました。docker-composeで複数のコンテナを1発立ち上げできるし気軽に壊せていいと思います。
環境構築
Ubuntu 18.04.2 LTS上に立てていきます。
Docker
Dockerの公式ドキュメントに沿ってコマンドを叩けばOK。
しかしそのまま利用しようとすると権限がないと怒られます。
$ docker ps
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.37/containers/json: dial unix /var/run/docker.sock: connect: permission denied
使うたびにsudoするのも煩雑ですが、自分をdocker
グループに追加すれば解決します。
$ sudo gpasswd -a user docker
1度ログアウトしてからシェルを開きなおせば実行可能に。
docker-compose
公式ドキュメントでLinuxのタブを見ながら進めればOKです。
一応最新のバージョンをGitHubで確認したうえで必要に応じてURLのバージョン部分を変更します。
コンテナを立ち上げる
早速Elasticsearchの公式ドキュメントを見ながら以下のような感じにdocker-compose.yml
を記述。
version: '3'
services:
es:
image: docker.elastic.co/elasticsearch/elasticsearch:7.5.1
ports:
- 9200:9200
environment:
- discovery.type=single-node
- node.master=true
- node.data=true
- xpack.security.enabled=false
- bootstrap.memory_lock=true
- "ES_JAVA_OPTS=-Xms2048m -Xmx2048m"
volumes:
- esdata:/usr/share/elasticsearch/data
ulimits:
memlock:
soft: -1
hard: -1
logging:
driver: 'json-file'
options:
max-size: '10m'
max-file: '3'
kibana:
image: docker.elastic.co/kibana/kibana:7.5.1
ports:
- 5601:5601
environment:
ELASTICSEARCH_HOSTS: http://es:9200
volumes:
esdata:
driver: local
Kibanaの設定においてElasticsearchのホストは設定でつけたサービス名(es
)として指定します。
あくまでもElasticsearchが動いているのはes
コンテナであるため、ここでlocalhost
と指定するとKibanaのコンテナ自身を指すので注意が必要です。
またElasticsearchは基本的に複数のノードで1クラスタを構成しますが、個人のテスト用途なのでdiscovery.type=single-node
の指定が入っています。
また、メモリはswapさせないほうがいい(公式曰く「Swapping Is the Death of Performance」)のでbootstrap.memory_lock=true
を指定しています。http://localhost:9200/_nodes/process?pretty
でmlockallがtrueになればOK。
docker-compose up -d
で立ち上げた後、しばらく待ってからホストの9200番ポートにアクセスしてみると起動していることが確認できます。
{
"name" : "35cd35ec72c0",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "0xeGot0JTn-icxJ5RPVigw",
"version" : {
"number" : "7.5.1",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96",
"build_date" : "2019-12-16T22:57:37.835892Z",
"build_snapshot" : false,
"lucene_version" : "8.3.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
同様に5601番ポートをブラウザで開くとダッシュボードが出現しますが、準備ができていないとKibana server is not ready yet
とだけ表示されます。
KibanaコンテナのログでNo living connections
と出力される間は待っておく必要があります。
特にインデックスが作成された後に起動するとマスター選出とシャードの配置を待ってからでないとKibanaが動き出さないっぽいです。思ってたより時間がかかる印象(single-nodeなのに)。
/_cat/shards?h=index,shard,prirep,state,unassigned.reason
を叩くとstateがUNASSIGNED
、resasonがCLUSTER_RECOVERED
となっているシャードが出ている間は一服したほうが良さげ。
ただし、single-nodeではレプリカは必ずUNASSIGNEDになるのでcurl http://localhost:9200/_cat/shards?h=index,shard,prirep,state,unassigned.reason | awk '$3=="p"' | less
で確認したほうが楽そう。
ElasticsearchとKibanaの起動が確認できたので、次回はElasticsearchにログを投入してみます。