MongoDB
Elasticsearch
kibana

MongoDB + Elasticsearch + Kibana の構築メモ

概要

kibanaでビジュアライズしたかったので、構築手順のメモ

全体の流れを簡単に言うと、MongoDBにあるログをElasticsearchに同期して、Kibanaでビジュアライズし、さらにkibanaの設定(Index PatternとかSaved Objectsとか)をexport/importする手段についてメモる。

環境

  • Ubuntu 16.04 or CentOS 7 or macOS 10.13
  • Elasticsearch 5.6.x
  • kibana 5.6.x
  • MongoDB 3.4.7 (適当に新しめのでいいと思う)
  • Python 3.6.x

なお、後述するelasticsearch-dumpがElasticsearch 5にしか対応していない(2017/12/06現在)ため、わざと5にしている。

elasticsearchとkibanaインストール

なおMongoDBは各自適当にインストールしてください。

後述するレプリカセットの設定は必須です。

Ubuntuの場合

elasticsearch

ElasticsearchをUbuntu 14.04にインストールする

wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
sudo apt-get update && sudo apt-get install elasticsearch
sudo /etc/init.d/elasticsearch start

kibana

Download Kibanaから適当に

CentOSの場合

elasticsearch

Elasticsearch を yumでインストール (CentOS)

Install Elasticsearch with RPM

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo yum install elasticsearch
sudo /etc/init.d/elasticsearch restart

kibana

適当にDownloadしてもいいが、yumでも入れられる

Install Kibana with RPM

rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
sudo yum install kibana
sudo systemctl restart kibana.service

macOSの場合

brew install elasticsearch@5.6 kibana@5.6

それぞれの設定

elasticsearch.yml

Elasticsearch導入前に気を付けておきたいこと!
Elasticsearch+kibanaでConnection Failedが出た時の対処法

基本的にはそのままで良さげだが、これらは要変更した方が良い?

network.host: 0.0.0.0
http.cors.allow-origin: "*"
http.cors.enabled: true
action.auto_create_index: true

tips

vm.max_map_count が足りないとか言われたら

sudo sysctl -w vm.max_map_count=262144

Ubuntu LinuxにElasticsearch 5.0.0、Kibana 5.0.0をインストールするAdd Star

ダウンロードしてきたやつから普通に起動するなら

Choosing configuration file to start elastic cluster

./bin/elasticsearch -Epath.conf=/path/to/my/config/

kibana.yml

後述のリバースプロキシでアクセスしたいなら、以下の変更

server.basePath: "/kibana"

mongod.conf

myRS は任意のレプリカセット名

mongodを --replSet myRS で起動するか、mongod.confで設定

replication:
    replSetName: myRS

ポートはいい感じにしてください。

次に、mongoコマンドでどれかに接続して、

config = {_id: 'myRS', members: [
    {_id: 0, host: 'localhost:27017'},
    {_id: 1, host: 'localhost:27018'},
    {_id: 2, host: 'localhost:27019', arbiterOnly:true}
    ]
}
rs.initiate(config)
rs.status()

一時しのぎで適当にレプリカ作るなら

mkdir rs1
mongod --dbpath rs1 --port 27018 --replSet myRS --logpath rs1log --fork
mkdir rs2
mongod --dbpath rs2 --port 27019 --replSet myRS --logpath rs2log --fork

完全にレプリカセットの設定を削除して再設定したい時

dbpathのところで

rm -f local.*
rm -f mongod.lock

MongoDBのレプリカセット作成 & 再構成

再構築したい時

スレーブのデータを全部削除してレプリカセットな起動をすると再構築される

kibanaを外からアクセス

nginxでリバースプロキシ

kibanaをnginxのリバースプロキシでアクセスする

proxy_passとrewriteだけで動いた

location /kibana/ {
    proxy_pass http://localhost:5601;
    rewrite /kibana/(.*)$ /$1 break;
    auth_basic "welcome to Kibana";
    auth_basic_user_file "/usr/local/nginx/.htpasswd";
}

後述のbasic認証のために一部追記している

basic認証

x-packで認証かけられるが 有料 なので仕方なくbasic認証する。

先述したように /usr/local/nginx/.htpasswd にid:pwを書く

普通にhtpasswdコマンドでやってもいいが、http://www.luft.co.jp/cgi/htpasswd.php でもできた

mongo-connector

MongoDBのデータをelasticsearchに同期する。

レプリカセットの構築は必須。

pip install 'mongo-connector[elastic5]'
pip install 'elastic2-doc-manager[elastic5]'

MongoDBのデータをElasticsearchにリアルタイム同期

なんか途中で中断したとか、最初からしたいって時はoplog.timestampを削除する。

例えばlinuxならこの辺にある

sudo rm /var/log/mongo-connector/oplog.timestamp

要はoplog.timestampでどこまで同期しているのかをmongo-connectorが見ている。

つまり、mongo-connectorが突然死んだとしても、再度起動すれば最新まで同期してくれる。

全データ消して最初からしたい時はmongodb_metaも消す必要がある?

kibanaのDev ToolsのConsoleなどで

DELETE YOUR_NAME_SPACE
DELETE mongodb_meta

同期済みだけどnamespaceを追加する

_idがprimary keyとなっているため、oplog.timestampを削除して最初からやったとしても、重複してデータが入ることはないが、再挿入の処理が入るためコストはかかる。

daemon化

https://github.com/mongodb-labs/mongo-connector/wiki/Installation にあるようにsetup.pyでする

sudo python setup.py install_service
sudo chmod +x /etc/init.d/mongo-connector
sudo /etc/init.d/mongo-connector start

この時、同ディレクトリのconfig.jsonが /etc/mongo-connector.json にコピーされるので以後はそちらを参照

この時、デーモンのスクリプトである scripts/mongo-connector において、/usr/bin/python -m mongo_connector.connector とあるが、環境に応じて/usr/bin/python3 に変更する必要があるかもしれない。

config.json

mongo-connector --config-file=config.json

renameの部分をhoge.wifi\_logにすると、indexはhogeで貼られて、wifi_logでは貼れないので注意。

つまりhogeが親になってしまうので。wifi_logはwifi_logだけでindexを貼りたい時は以下の例のようにして別々にする。

後からindexingはkibanaでまとめて参照することができるので、別々でも大丈夫

https://github.com/mongodb-labs/mongo-connector/wiki/Configuration-Options この辺を参考にしつつ、例えばlinuxなら、

{
  "mainAddress": "localhost:27017",
  "oplogFile": "/var/log/mongo-connector/oplog.timestamp",
  "verbosity": 1,
  "logging": {
    "type": "file",
    "filename": "/var/log/mongo-connector/mongo-connector.log",
    "__rotationWhen": "D",
    "__rotationInterval": 1,
    "__rotationBackups": 10
  },
  "namespaces": {
    "hoge.wifi_log": {
      "rename": "hoge-wifi_log.hoge-wifi_log"
    }
  },
  "docManagers": [
    {
      "docManager": "elastic2_doc_manager",
      "targetURL": "localhost:9200"
    }
  ]
}

バックアップとリストア

kibanaの設定を丸ごとバックアップとリストアしたいなら、elasticsearch-dumpを使う

バックアップは

elasticdump --input="http://localhost:9200/.kibana" --output=kibana_config.json

リストアは

elasticdump --input=kibana_config.json --output="http://localhost:9200/.kibana"

kibanaのManagementのSaved Objectsから設定全部exportできるような雰囲気はあるが、これではIndex Patternsなどはexportされない。

結局設定の実体はelasticsearchの.kibanaの下に居るので、elasticsearch-dumpでlocalhost:9200/.kibanaをdumpする。リストアはその逆。

tips

elasticsearchのindexの状況とか見る

kibanaのDev ToolsのConsoleとかで

GET _cat/indices

kibanaでアンダーバー始まりのフィールド使えない

デフォルトだと、アンダーバーから始まるフィールドは、indexとして使えない。

なので、kibanaのManagement -> Advanced Settings -> metaFields にそのフィールド名を足すとtimeとして選択できるようになる。

elasticsearchのGUIツール

結局使ってない

https://github.com/mobz/elasticsearch-head

git clone git://github.com/mobz/elasticsearch-head.git
cd elasticsearch-head
npm install
npm run start