ELK(Elasticsearch, Logstash, Kibana)に触れてみる

日頃、Amazon CloudSearchの担当をしている私ですが、ふと、Elasticsearchと戯れたくなりました。
とりあえず、おもむろにMacbookのTerminalを立ち上げます。
 
■ Elasticsearchを立ち上げる
 
現時点での最新版のElasticsearchのZipファイルをダウンロードしてきて↓
https://download.elastic.co/elasticsearch/elasticsearch/elasticsearch-1.7.1.zip
 
解凍して、

$ unzip elasticsearch-1.7.1.zip
Archive:  elasticsearch-1.7.1.zip
   creating: elasticsearch-1.7.1/
   creating: elasticsearch-1.7.1/config/
  inflating: elasticsearch-1.7.1/config/elasticsearch.yml
〜略〜

 
起動します。

$ bin/elasticsearch
[2015-08-18 14:57:11,382][INFO ][node                     ] [Arsenal] version[1.7.1], pid[22952], build[b88f43f/2015-07-29T09:54:16Z]
[2015-08-18 14:57:11,383][INFO ][node                     ] [Arsenal] initializing ...
[2015-08-18 14:57:11,530][INFO ][plugins                  ] [Arsenal] loaded [], sites []
[2015-08-18 14:57:11,832][INFO ][env                      ] [Arsenal] using [1] data paths, mounts [[/ (/dev/disk1)]], net usable_space [6.3gb], net total_space [232.5gb], types [hfs]
[2015-08-18 14:57:14,807][INFO ][node                     ] [Arsenal] initialized
[2015-08-18 14:57:14,808][INFO ][node                     ] [Arsenal] starting ...
[2015-08-18 14:57:15,032][INFO ][transport                ] [Arsenal] bound_address {inet[/0:0:0:0:0:0:0:0:9300]}, publish_address {inet[/10.66.68.147:9300]}
[2015-08-18 14:57:15,076][INFO ][discovery                ] [Arsenal] elasticsearch/7bpI2cEtQKeCAq5lAU-hYQ
[2015-08-18 14:57:18,866][INFO ][cluster.service          ] [Arsenal] new_master [Arsenal][7bpI2cEtQKeCAq5lAU-hYQ][b8e85601e846.ant.amazon.com][inet[/10.66.68.147:9300]], reason: zen-disco-join (elected_as_master)
[2015-08-18 14:57:18,884][INFO ][http                     ] [Arsenal] bound_address {inet[/0:0:0:0:0:0:0:0:9200]}, publish_address {inet[/10.66.68.147:9200]}
[2015-08-18 14:57:18,884][INFO ][node                     ] [Arsenal] started
[2015-08-18 14:57:18,900][INFO ][gateway                  ] [Arsenal] recovered [0] indices into cluster_state

 
とりあえず叩いてみますよ、と。

$ curl -i -XGET 'localhost:9200/'
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 340

{
  "status" : 200,
  "name" : "Joe Cartelli",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.1",
    "build_hash" : "b88f43fc40b0bcd7f173a1f9ee2e97816de80b19",
    "build_timestamp" : "2015-07-29T09:54:16Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

 
cURLでRESTにイジれるのがElasticsearchの良いところですが、
SenseというWebなGUIからやった方が何かと簡単な気がするので、Marvelというプラグインを入れます。

$ bin/plugin -i elasticsearch/marvel/latest
-> Installing elasticsearch/marvel/latest...
Trying http://download.elasticsearch.org/elasticsearch/marvel/marvel-latest.zip...
Downloading .....DONE
Installed elasticsearch/marvel/latest into /Users/eshinoha/Downloads/elasticsearch-1.7.1/plugins/marvel

 
elasticsearch.ymlに↓を追記します。

388 http.cors.enabled:      true
389 http.cors.allow-origin: /https?://(www.)?elastic.co/

 
再起動してSenseにアクセスすると↓こんなような感じでcURLじゃなくてもサクサクいろいろ出来ます。
(この例だとwebsiteっていうindexにblogっていうtypeで123ってidでデータをストア)

 
 
■ Logstashを立ち上げる
 
同じようにLogstashも落としてきて、

$ wget https://download.elastic.co/logstash/logstash/logstash-1.5.4.zip
--2015-08-24 10:28:16--  https://download.elastic.co/logstash/logstash/logstash-1.5.4.zip
Resolving download.elastic.co... 174.129.205.54, 184.73.223.96, 107.22.237.122, ...
〜略〜

 
解凍して、(ものすごい量のjrubyのホゲホゲしてきたヤツが落ちてきました)

$ unzip logstash-1.5.4.zip
Archive:  logstash-1.5.4.zip
  inflating: logstash-1.5.4/LICENSE
  inflating: logstash-1.5.4/CHANGELOG.md
  inflating: logstash-1.5.4/NOTICE.TXT
  inflating: logstash-1.5.4/CONTRIBUTORS
〜略〜

 
まんまだと立ち上げられないようになってます。笑

$ bin/logstash
No command given

Usage: logstash  [command args]
Run a command with the --help flag to see the arguments.

 
–helpで叩いたら、設定ファイル指定してねんって事だそうで。

Options:
    -f, --config CONFIG_PATH      Load the logstash config from a specific file
                                  or directory.  If a directory is given, all
                                  files in that directory will be concatenated
                                  in lexicographical order and then parsed as a
                                  single config file. You can also specify
                                  wildcards (globs) and any matched files will
                                  be loaded in the order described above.

 
なんとなくRedisのデータを食いたいので、ググってみると、
↓のページで設定の方法が書いてありましたよ、と。
https://www.elastic.co/guide/en/logstash/current/plugins-inputs-redis.html
 
data_typeをchannelにするとRedisのチャンネルが読めるっぽくて、
その際は key を設定してねって↓のように書いてありました。
The name of a Redis list or channel. TODO: change required to true

  1 input {
  2     redis {
  3         data_type => "channel"
  4         host => "127.0.0.1"
  5         key => "foo"
  6         port => 6379
  7     }
  8 }
  9
 10 output {
 11     stdout {}
 12 }

 
起動は出来たけど、Redisに繋げねぇぞゴルァって怒られてます。笑

$ bin/logstash -f hoge.conf
$ bin/logstash -f hoge.conf
Logstash startup completed
Redis connection problem {:exception=>#, :level=>:warn}
Redis connection problem {:exception=>#, :level=>:warn}
Redis connection problem {:exception=>#, :level=>:warn}

 
 
■ Redisを立ち上げる
 
Redisも↓から最新版を落としてきて、解凍して、makeしてってシンプルなヤツで、
http://download.redis.io/releases/redis-3.0.3.tar.gz
 
起動してからの、、

a$ src/redis-server
6120:C 24 Aug 12:27:48.384 # Warning: no config file specified, using the default config. In order to specify a config file use src/redis-server /path/to/redis.conf
6120:M 24 Aug 12:27:48.386 * Increased maximum number of open files to 10032 (it was originally set to 256).
                _._
           _.-``__ ''-._
      _.-``    `.  `_.  ''-._           Redis 3.0.3 (00000000/0) 64 bit
  .-`` .-```.  ```/    _.,_ ''-._
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 6120
  `-._    `-._  `-./  _.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |           http://redis.io
  `-._    `-._`-.__.-'_.-'    _.-'
 |`-._`-._    `-.__.-'    _.-'_.-'|
 |    `-._`-._        _.-'_.-'    |
  `-._    `-._`-.__.-'_.-'    _.-'
      `-._    `-.__.-'    _.-'
          `-._        _.-'
              `-.__.-'

6120:M 24 Aug 12:27:48.393 # Server started, Redis version 3.0.3
6120:M 24 Aug 12:27:48.395 * DB loaded from disk: 0.001 seconds
6120:M 24 Aug 12:27:48.395 * The server is now ready to accept connections on port 6379

 
Hello Worldしてみると、、

$ src/redis-cli publish 'foo' 'Hello World!'
(integer) 1

 
Logstashの方にも吐き出されていますよ、と。

$ bin/logstash -f hoge.conf
Logstash startup completed
2015-08-24T03:32:54.082Z %{host} Hello World!

 
 
■ Kibanaを立ち上げる
 
ダウンロードしてきて、解凍します、と。

$ wget https://download.elastic.co/kibana/kibana/kibana-4.1.1-darwin-x64.tar.gz
$ tar xvf kibana-4.1.1-darwin-x64.tar.gz
x kibana-4.1.1-darwin-x64/
x kibana-4.1.1-darwin-x64/bin/
x kibana-4.1.1-darwin-x64/bin/kibana
x kibana-4.1.1-darwin-x64/bin/kibana.bat
x kibana-4.1.1-darwin-x64/node/
x kibana-4.1.1-darwin-x64/node/bin/
〜略〜

 
起動したら、Kibana用のインデックスが無いよ的なことを言われています。

$ bin/kibana
{"name":"Kibana","hostname":"hogehoge.com","pid":6549,"level":30,"msg":"No existing kibana index found","time":"2015-08-24T03:43:27.858Z","v":0}
{"name":"Kibana","hostname":"hogehoge.com","pid":6549,"level":30,"msg":"Listening on 0.0.0.0:5601","time":"2015-08-24T03:43:27.876Z","v":0}

 
ダッシュボードは↓こんな感じ。

 
 
■ Redisに入れたデータをLogstash経由でElasticsearchに入れてKibanaで可視化する
 
ようやくありそうなシチュエーションになってきました。
 
Logstashの設定でローカルのElasticsearchにもデータを投入するようにします。

 11 output {
 12     stdout {}
 13     elasticsearch {
 14         host => "localhost"
 15     }
 16 }

 
Redisにデータを入れてElasticsearch側から見てみます。

$ src/redis-cli publish 'foo' 'Hello World!'
(integer) 1

 
インデックス一覧をみるのに↓のように補完してくれるの嬉しい…
# ちなみに、Elasticsearchでは、_index(RDBMSで言えばdatabase)と_type(RDBMSで言えばtable)という概念です

 
↓に入っていることが分かります。

 
インデックスを検索して、

 
↓データが入っているのが分かります。

 
続いてKibanaのダッシュボードを開くと、今度はインデックスがあるのでCREATE出来て、

 
Discoverに行くと、ソレっぽいのが出てきます。

 

ということで、一旦ローカルに環境は出来たので、続きは ELK テクニカルワークショップ
ハンズオンでイロイロ楽しんできたいと思います〜(´▽`)ノ
 

Elasticsearch: The Definitive Guide
O’Reilly Media (2015-01-22)

コメント

タイトルとURLをコピーしました