elsticsearchについて調べたよ

最近、E C2にelasticsearchを建てたもにdatadogでリソース監視を設定しました。 初めてelasticsearchに関わったので、勉強して見ました。

elastic searchとは

分散処理が可能な検索分析エンジン。 Elastic社が提供しているElastic Stockというプロダクト群に含まれる。 elastic searchはその中でも、jsonベースの検索/分析エンジンの位置付けとなっている。 特徴として、スケーラブル、リアルタイム、REST APIの提供がある。

ユースケース

  • アプリ検索
  • webサイト検索
  • ロギングとログ分析 などなど

アーキテクチャ

ここに関したはもっと深ぼって記事にまとめます。 elasticsearchはclusterを形成し1つ以上のnode(elasticsearch server)で構成される。 検索トラフィックが増大と書き込み速度の分散をNodeに分散し対応する。 elasticsearchにはindexというものがあります。これがRDBにおけるデータベースです。 レコードにあたるものが、documentになります。そのdocumentはkey valueの組み合わせで格納されており、 fieldといいRDBにおけるカラムにあたります。 indexはelasticsearchクラスター内で形成され、それを分散させる為に各node間でshardという単位で管理します。

ここまでで、elasticsearchはclusterを形成し、indexは各nodeにshardとという単位で分散管理してます。

elastic seatchはjavaで動いている

elasticsearchはjavaで動いています。 nodeのメモリ管理はGCで管理されています。

ドキュメントを保存する時はindexingする

ドキュメントを保存する時にindexingする。 またドキュメントはnodeのストレージに保存します。 documenを保存する際には保存する内容を一旦buffer memoryへ展開し、すでに保存している内容を取得しメモリに割り当てた上で、 buffer上のものと取得してきたものをmergeしてストレージにコミットします。(間違っていたら、ツッコミお願いします。) ということはすでに、保存された内容や保存対象が大きければメモリを消費しますし、それをストレージにコミットする際や取得の際にi/oに負荷がかかります。 加えて、javaで管理されているので、メモリの管理には注意が必要ですし、リソースに十分なメモリを割り当てを行なっていないとGCが頻回動作し頻回にリソースがロックされたり、 逆に大きすぎるメモリを割り当ててしまうと、GCがうまく動作せずメモリが高知で張り付いてしまうこともあるそうです。

なので、基本的なリソース監視も然り、j VMヒープやディスクの監視(容量やIOPS)の監視がポイント(クエリのレイテンシにも影響しそうだし)なのかなと感じました。

datadogで設定していきながら、理解するのに時間がかかりました。 まだまだ理解が追いついていなかったり、間違っていることもあるかと思いますが、今後も学習を継続していくぞー!!!

自前で建てたelasticseachは自動復旧の仕組みが整ってないため、toil撲滅の為今後対応していきたいです。(となるとコンテナかなー) ではまたー。。