#author("2021-03-10T11:07:00+00:00","default:wikiadmin","wikiadmin") #author("2021-03-10T11:12:39+00:00","default:wikiadmin","wikiadmin") -Elasticsearchを独立させた。Solrと同じくLuceneベース #ls2(Elasticsearch) #contents *Docker local環境 [#d0f1bad1] docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:6.4.1 *REST API [#v3939558] ?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.json|test.jsonを投入| *elastic dump [#z715721d] **ファイルへ [#da23f682] elasticdump --input=http://localhost:9200/test --output=/var/tmp/test.json --type=data *気になりワード [#sa424e34] -elasticdump *JavaClient [#y1348d89] **HighLevelRestClient [#t06782e6] -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 [#rdea2bbe] -ほぼcurlと同じクエリーを自分で組み立て、JSONも自分でparseする必要がある *構成 [#k746709d] |INDEX|RDBのDatabaseに相当。この単位でSHADE数を決めることができる、更新頻度が違うものはINDEXを分ける。検索系のインデックスはシャードを増やすとか| |シャード|インデックスを何分割するか?作成時のみしか指定できず| |TYPE|INDEXに格納されるドキュメントの型。テーブルみたいなもの| |DOCUMENT|RDBの1レコード| |FIELD|列定義| |CLUSTER|NODEの集合| |NODE|ESの1プロセス。最小構成単位である| シャードの数はノードの数に合わせておくと良いらしい。ノードが少ないのにシャードを増やしても早くならない。 -更新は苦手なのでINDEX単位で日付を付与して、古くなったものはINDEX毎すてていく |RDB|Elasticsearch| |Databases|Indices| |Tables|Types| |Rows|Documents| |Fields|Columns| *ノードの種類 [#x8972509] -マスターノード(Master-eligible node) node_master: trueになっているものがマスターノードになれる。デフォルトtrue。マスターノードはクラスターをコントロールするノードである。 -データノード(node_data: true) CRUDに関する動作を請け負うノード -クライアントノード(masterでもなくdataでもない) データも保持せず、マスターにも昇格しない。検索時の負荷分散など シャードはノード数と同じにしておくと良いのだが、将来的にノードを増やすことで負荷分散することを考えているのであればノード数以上にシャードを設定しておくのもあり。 *シャードの数 [#l0d1c113] https://qbox.io/blog/optimizing-elasticsearch-how-many-shards-per-index *INDEX設計 [#g369415b] 一つのINDEXでシャードの数が決まるので、スケールさせる前提であればINDEXを分ける。また親子関係がある場合は一つのINDEXにする必要がある。INDEX名を適当に決めるとINDEX TEMPLATEが適用できなくなってしまうので、きちんと命名規約を決めておくこと! *AWS Elasticserach Service [#i8eac1c7] -基本的なプラグインはインストール済みだが、カスタムプラグインはインストールできない。 -バージョンが古い(2.1が出ている時期に1.5.2) -S3 Pluginを利用すればES on EC2 to ElasticSearchServiceのimportは可能 -2016/08ようやく2.3がでた! **ElasticSearchServiceへCloudWatchから流す [#u2e0255e] VPCFlowLogやCloudTrailをElasticSearchServiceに流しているが、これは裏でLambdaを自動で作成してくれているだけである。そのLambdaをカスタマイズすれば任意の場所へ送信可能。 *Elastic Cloud(旧Found) [#xadb022d] -バージョン選択可能 -基本プラグイン導入済み -リージョンも選択可能 -高い! *参考ページ [#z359591d] dstat投入 http://qiita.com/yumatz/items/debbc6d6063c85531fd1 *運用 [#r3ccb3b1] **本番環境向け推奨マシンスペック [#m8867028] 実験用途で2GBのマシンに入れたが、結構な割合でOomKillerを発動させたり、落ちてたりする。 -メモリは64gbが理想だが、32−16GBでも大丈夫。8GB以下はインスタンスをたくさん用意しなければならぬ羽目に陥るので結局損。64GB以上でも問題があるので推奨範囲にとどめておくこと。 -CPUのスペックはマルチコアであれば特にハイスペックは要求しない。もしコアあたりの性能アップかコアを増やすかの選択に迫られた時はコアを増やす方向がベターである。 -ディスクはSSDベースにしておけばベター。NASはダメ! -ネットワークはデータセンター内部にとどめておき、仮に早い専用線があったとしても地理的に離れた場所に配置しない。 -HEAPは初期設定では実運用には適さない。マシンの実メモリの半分程度を最大としつつ、32GBは超えないように設定する。 **設定 [#d6110a6b] |JVM|1GB以上推奨。最小と最大を同じにしておく。/etc/elasticsearch/jvm.optionsで設定する| |File Descriptors|65535| |mmap|rpmであれば変更済みとなる| |swap|disable swap(swapoff -a)| **投入までの流れ [#f9fd33ac] +INDEX作成(curl -XPUT "${ES_URL}/${INDEX_NAME}") +検索で使う型を定義するmappingをJSONで指定(curl -XPUT "${ES_URL}/${INDEX_NAME}/_mapping/default" -d @${MAPPING_FILE}) **Mappingの定義 [#m674eb8a] スキーマレスとはいえ、集計や検索などを考えると事前にMappingの定義は必須である。 単なる型以外にも、入れ子になっているもの(Nested Type)やRDBの親子関係に近いParent-Childなどのデータ構造のバリエーションがある。同じインデックスの同じフィールド名は同じ定義にしなければいけないので、一つのインデックスに複数のタイプが存在する場合でデータ型も違うなら、名前を分けるように(titleではなくblog_title,post_title) |mapping定義の参照|curl -XGET http://localhost:9200/INDEX/TYPE/_mapping| **クラスターの可視化 [#u022dd5d] -elasticsearch-head インストール後以下のURLで参照可能。 http://133.18.30.106:9200/_plugin/head/ *プラグインインストール [#l778eff3] -インストール済みプラグイン確認 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 **有償プラグイン [#qe169624] -サブスクリプション加入が必要である。30日間無料でトライアル可能。 |Sheild|認証|| |Watcher|通知|有料なのに設定画面がないのが痛い| |Beats||| |Kuromoji||| |Ec2 Discovery||| |Kibana||| |Sense||| |PacketBeat||| |TopBeat||| ***Graph Deep Dive [#d8feb317] Sinificant Term Aggrigation https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-significantterms-aggregation.html Graphの利点 関連性を見て分析 。 404のエラーからさらにドリルダウンして、各ブラウザを表示させることができる。 トライアルは30日 データが入っていればすぐ利用可能。 *アラート [#d37153b6] 無料ならelastalert(Yelp開発)。有料ならWatcher(サブスクリプション契約必要) https://github.com/Yelp/elastalert *情報 [#s19a4767] パフォーマンスチューニングの注意点 http://qiita.com/rjkuro/items/e79eec7ffb0511b7c678 **td-agentとの連携 [#t82cc0fa] -fluent-plugin-elasticsearchのインストール。1.0系だとfluent-gemのパスが違うので注意。 /opt/td-agent/embedded/bin/fluent-gem install fluent-plugin-elasticsearch *Elasticsearch 2.2 [#ta64c66a] デフォルトはローカルからのみ接続可能なので、以下の変更を入れる。 -/etc/elasticsearch/elasticsearch.yml network.host: 0.0.0.0 *Kibana4.4 [#p135a5c4] 解凍して、host変えて、起動して5601ポートでアクセス。 *Beats [#xc90fcfb] エージェント型だが、マシンの情報を定期的に送ってくれる上にダッシュボードのテンプレートも併せて提供されている。 *トラブルシューティング [#f554ab0e] **cluster_block_exception [#z13c546a] ディスク容量が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」 [#a70427e7] -以下のパラメータを入れることにより再接続をするようになる。 reload_connections false *利用事例 [#xaaa6362] +MySQL Slow Query Log +Apache Log *運用履歴 [#j608360a] **Kagoya 2G [#sfc328b3] 限界ぎりぎりまでメモリを使う。何もしてなくても自然に落ちるという・・ 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 [#d115f779] 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 [#o03e36a7] 視覚化ツールの標準。認証機能が単体ではまだ実装されておらず、SearchGuardなどのプラグイン頼み **プラグイン [#u9a23223] kibana単体にもプラグインインストール可能。RPMインストールの場合は以下の場所からインストール可能。下記例はtimelionをインストールする。 /opt/kibana/bin/kibana plugin -i kibana/timelion **検索 [#icd56f32] |条件検索|フィールド名: 検索したい値| |typeで絞る|_type: process|beatsの場合| **Visualize [#u4f7e1de] 単一の値の平均値を出す。metrics ***時系列での特定の値の変化を出す。 [#rd2ce11c] +Line Chartを選択 +X-axisにDate Histgramを選択して、@Timestampを選択 +Y-axisに任意のフィールドを出す。countはフィールド選べないので注意 *timelionプラグイン [#u22ec19f] kibanaとは別アプローチで流れるSQLのように関数でグラフを作成できるツール。まだ出たばっかりだが、プログラマー的にはこちらの方が再利用しやすいのではないかな? *ElastAlert [#j8a43fab] 無料のアラート検知&通知ツール。コマンドラインで実行する。 **インストール [#a2455ba3] *大量投入 [#j568b08f] http://ameblo.jp/fcv-system/entry-11950051736.html *API [#kdf2f1f8] https://medium.com/hello-elasticsearch/elasticsearch-api-83760ce1424b#.igvw3frk5 *Kibana クエリー [#x48b333e] _type: road_times AND road_id: 1 _type: marcket_records AND marcket_id: 1 #counter