• Elasticsearchを独立させた。Solrと同じくLuceneベース

Docker local環境

docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.4.1

REST API

?pretty=trueをつけないと超見辛い!

curl -X GET "localhost:9200/_cat/health"クラスターの状態
curl -X GET "localhost:9200/_cat/indices?v"インデックスの一覧
curl -XGET 'localhost:9200/[インデックス名]?pretty=true'インデックスの詳細
curl -X GET "localhost:9200/_aliases"エイリアス一覧
curl -I "localhost:9200/index名"indexの存在確認。200なら存在
curl "localhost:9200/index名/_settings"設定一覧
curl "localhost:9200/index名/_search"検索条件なしで表示
curl "localhost:9200/index名/_count"件数
curl -X PUT -H "Content-Type: application/json" 'localhost:9200/test/test/_bulk?pretty' --data-binary @test.jsontest.jsonを投入

elastic dump

ファイルへ

elasticdump --input=http://localhost:9200/test --output=/var/tmp/test.json --type=data

気になりワード

  • elasticdump

JavaClient

HighLevelRestClient

  • transport client廃止後のデファクトスタンダード
  • JsonをうまくラップしてObjectで扱えるようにしてくれる

https://medium.com/@sourav.pati09/how-to-use-java-high-level-rest-client-with-spring-boot-to-talk-to-aws-elasticsearch-2b6106f2e2c

RestClient

  • ほぼcurlと同じクエリーを自分で組み立て、JSONも自分でparseする必要がある

構成

INDEXRDBのDatabaseに相当。この単位でSHADE数を決めることができる、更新頻度が違うものはINDEXを分ける。検索系のインデックスはシャードを増やすとか
シャードインデックスを何分割するか?作成時のみしか指定できず
TYPEINDEXに格納されるドキュメントの型。テーブルみたいなもの
DOCUMENTRDBの1レコード
FIELD列定義
CLUSTERNODEの集合
NODEESの1プロセス。最小構成単位である

シャードの数はノードの数に合わせておくと良いらしい。ノードが少ないのにシャードを増やしても早くならない。

  • 更新は苦手なのでINDEX単位で日付を付与して、古くなったものはINDEX毎すてていく
RDBElasticsearch
DatabasesIndices
TablesTypes
RowsDocuments
FieldsColumns

ノードの種類

  • マスターノード(Master-eligible node) node_master: trueになっているものがマスターノードになれる。デフォルトtrue。マスターノードはクラスターをコントロールするノードである。
  • データノード(node_data: true) CRUDに関する動作を請け負うノード
  • クライアントノード(masterでもなくdataでもない) データも保持せず、マスターにも昇格しない。検索時の負荷分散など

シャードはノード数と同じにしておくと良いのだが、将来的にノードを増やすことで負荷分散することを考えているのであればノード数以上にシャードを設定しておくのもあり。

シャードの数

https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index

INDEX設計

一つのINDEXでシャードの数が決まるので、スケールさせる前提であればINDEXを分ける。また親子関係がある場合は一つのINDEXにする必要がある。INDEX名を適当に決めるとINDEX TEMPLATEが適用できなくなってしまうので、きちんと命名規約を決めておくこと!

AWS Elasticserach Service

  • 基本的なプラグインはインストール済みだが、カスタムプラグインはインストールできない。
  • バージョンが古い(2.1が出ている時期に1.5.2)
  • S3 Pluginを利用すればES on EC2 to ElasticSearchServiceのimportは可能
  • 2016/08ようやく2.3がでた!

ElasticSearchServiceへCloudWatchから流す

VPCFlowLogやCloudTrailをElasticSearchServiceに流しているが、これは裏でLambdaを自動で作成してくれているだけである。そのLambdaをカスタマイズすれば任意の場所へ送信可能。

Elastic Cloud(旧Found)

  • バージョン選択可能
  • 基本プラグイン導入済み
  • リージョンも選択可能
  • 高い!

参考ページ

dstat投入

http://qiita.com/yumatz/items/debbc6d6063c85531fd1

運用

本番環境向け推奨マシンスペック

実験用途で2GBのマシンに入れたが、結構な割合でOomKillerを発動させたり、落ちてたりする。

  • メモリは64gbが理想だが、32−16GBでも大丈夫。8GB以下はインスタンスをたくさん用意しなければならぬ羽目に陥るので結局損。64GB以上でも問題があるので推奨範囲にとどめておくこと。
  • CPUのスペックはマルチコアであれば特にハイスペックは要求しない。もしコアあたりの性能アップかコアを増やすかの選択に迫られた時はコアを増やす方向がベターである。
  • ディスクはSSDベースにしておけばベター。NASはダメ!
  • ネットワークはデータセンター内部にとどめておき、仮に早い専用線があったとしても地理的に離れた場所に配置しない。
  • HEAPは初期設定では実運用には適さない。マシンの実メモリの半分程度を最大としつつ、32GBは超えないように設定する。

設定

JVM1GB以上推奨。最小と最大を同じにしておく。/etc/elasticsearch/jvm.optionsで設定する
File Descriptors65535
mmaprpmであれば変更済みとなる
swapdisable swap(swapoff -a)

投入までの流れ

  1. INDEX作成(curl -XPUT "${ES_URL}/${INDEX_NAME}")
  2. 検索で使う型を定義するmappingをJSONで指定(curl -XPUT "${ES_URL}/${INDEX_NAME}/_mapping/default" -d @${MAPPING_FILE})

Mappingの定義

スキーマレスとはいえ、集計や検索などを考えると事前にMappingの定義は必須である。 単なる型以外にも、入れ子になっているもの(Nested Type)やRDBの親子関係に近いParent-Childなどのデータ構造のバリエーションがある。同じインデックスの同じフィールド名は同じ定義にしなければいけないので、一つのインデックスに複数のタイプが存在する場合でデータ型も違うなら、名前を分けるように(titleではなくblog_title,post_title)

mapping定義の参照curl -XGET http://localhost:9200/INDEX/TYPE/_mapping

クラスターの可視化

  • elasticsearch-head

インストール後以下のURLで参照可能。

http://133.18.30.106:9200/_plugin/head/

プラグインインストール

  • インストール済みプラグイン確認
    curl -XGET 'http://localhost:9200/_nodes?plugin=true&pretty'

yumの場合はコマンドは以下の場所にある

/usr/share/elasticsearch/bin

plugin install プラグイン名
# kuromojiインストール
/usr/share/elasticsearch/bin/plugin install analysis-kuromoji
# watcherのためのライセンスプラグイン
/usr/share/elasticsearch/bin/plugin install elasticsearch/license/latest
# watcher
/usr/share/elasticsearch/bin/plugin install elasticsearch/watcher/latest
# bigdisk
/usr/share/elasticsearch/bin/plugin install lukas-vlcek/bigdesk

有償プラグイン

  • サブスクリプション加入が必要である。30日間無料でトライアル可能。
Sheild認証
Watcher通知有料なのに設定画面がないのが痛い
Beats
Kuromoji
Ec2 Discovery
Kibana
Sense
PacketBeat
TopBeat

Graph Deep Dive

Sinificant Term Aggrigation

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html

Graphの利点

関連性を見て分析 。

404のエラーからさらにドリルダウンして、各ブラウザを表示させることができる。

トライアルは30日 データが入っていればすぐ利用可能。

アラート

無料ならelastalert(Yelp開発)。有料ならWatcher(サブスクリプション契約必要)

https://github.com/Yelp/elastalert

情報

パフォーマンスチューニングの注意点

http://qiita.com/rjkuro/items/e79eec7ffb0511b7c678

td-agentとの連携

  • fluent-plugin-elasticsearchのインストール。1.0系だとfluent-gemのパスが違うので注意。
/opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch

Elasticsearch 2.2

デフォルトはローカルからのみ接続可能なので、以下の変更を入れる。

  • /etc/elasticsearch/elasticsearch.yml
    network.host: 0.0.0.0

Kibana4.4

解凍して、host変えて、起動して5601ポートでアクセス。

Beats

エージェント型だが、マシンの情報を定期的に送ってくれる上にダッシュボードのテンプレートも併せて提供されている。

トラブルシューティング

cluster_block_exception

ディスク容量が95%超えると書き込み抑制する。管理コマンドで解除する。

curl -XPUT -H "Content-Type: application/json" http://localhost:9200/_all/_settings -d '{"index.blocks.read_only_allow_delete": null}'

fluentd + ElasticSearchServiceで時折「Cannot get new connection from pool」

  • 以下のパラメータを入れることにより再接続をするようになる。
    reload_connections false

利用事例

  1. MySQL Slow Query Log
  2. Apache Log

運用履歴

Kagoya 2G

限界ぎりぎりまでメモリを使う。何もしてなくても自然に落ちるという・・

Apr 27 02:19:53 v9215 elasticsearch: # There is insufficient memory for the Java Runtime Environment to continue. Apr 28 09:11:22 v9215 elasticsearch: # There is insufficient memory for the Java Runtime Environment to continue. Apr 28 13:01:44 v9215 elasticsearch: # There is insufficient memory for the Java Runtime Environment to continue.

Azure A2

3.5Gあるので通常のサーバー用途と共存させてもなんとか耐えられる。 5/12 3:55AMを境にpacket&top beatsが勝手に停止していた。

5/24 4:05AMを境にElasticSearchが落ちていた。その近辺でoom-killerが発動していた。

そしてkibana has broken completely! plugin:elasticsearch Elasticsearch is still initializing the kibana index.

全部のインデックスを消去して、わけわからんけど復旧。

Kibana

視覚化ツールの標準。認証機能が単体ではまだ実装されておらず、SearchGuardなどのプラグイン頼み

プラグイン

kibana単体にもプラグインインストール可能。RPMインストールの場合は以下の場所からインストール可能。下記例はtimelionをインストールする。

/opt/kibana/bin/kibana plugin -i kibana/timelion

検索

条件検索フィールド名: 検索したい値
typeで絞る_type: processbeatsの場合

Visualize

単一の値の平均値を出す。metrics

時系列での特定の値の変化を出す。

  1. Line Chartを選択
  2. X-axisにDate Histgramを選択して、@Timestampを選択
  3. Y-axisに任意のフィールドを出す。countはフィールド選べないので注意

timelionプラグイン

kibanaとは別アプローチで流れるSQLのように関数でグラフを作成できるツール。まだ出たばっかりだが、プログラマー的にはこちらの方が再利用しやすいのではないかな?

ElastAlert

無料のアラート検知&通知ツール。コマンドラインで実行する。

インストール

大量投入

http://ameblo.jp/fcv-system/entry-11950051736.html

API

https://medium.com/hello-elasticsearch/elasticsearch-api-83760ce1424b#.igvw3frk5

Kibana クエリー

_type: road_times AND road_id: 1
_type: marcket_records AND marcket_id: 1
Counter: 3408, today: 2, yesterday: 1

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-03-10 (水) 20:12:39