elasticsearch 基本用語編


elasticsearchとは

全文検索データベース,保存するデータをインデックスとして保存する

ノードとは

elasticsearchを構成している端末のこと

ノードの種類

マスターノード: インデックスの作成と削除、ノードの割り当てなどを行う

クラスターとは

ノード全てを使って構成している枠組み
elasticsearchは1台以上のノードでクラスターを構成する

インデックスとは

保存するデータの一つの名目
例えば毎日の天気を登録するインデックスがあったとして
その時に使用するインデックス名は"every_weather"みたいな感じです

ドキュメントとは

上記の例だと一日の天気を登録しているものです。

シャーディングとは

インデックス細かく分けて設定したノードに振り分ける動作
そうすることによって検索する際に効率良く検索することができる。検索クエリ実行時には登録しているノード全てに並列的に検索を行う。
件数が少ないのにシャーディングを行うと非効率になってしまう。
設定するシャードは最初や後からでも変更することができるがはじめにやったほうがいい。

データのスケーリングとは

能力を向上させること
スケールアップ: 各サーバーそのものの性能を向上させる。
スケールアウト: サーバーを増やすことによって処理能力を向上させる。

レプリケーションとは

インデックスに含まれる各シャードのコピーを作成する機能、いくつコピーを作成するかは設定できる

プライマリーシャードとは

インデックスをノードに振り分けた一つの破片

レプリカシャードとは

プライマリーシャードのコピー
インデックスを作成するときに、必要なプライマリーシャードのレプリカの数を選択できます。
インデックスにはシャードが含まれており、シャードにはレプリカシャードが含まれている可能性があります。
レプリカシャードはコピー元のプライマリーシャードがいるノードにはコピーされずに違うノードに保存される。
こうすることによって一部のノードが死んでも他のノードにコピーされているから大丈夫になる。

ルーティングとは

例えば検索する時にidを指定したとしてそのidがどこにあるかを膨大なデータから探さないといけません。基本インデックスはシャードに登録されています。まず探したいドキュメントがあるシャードを見つけないといけません。その探し方がルーティングです。
elasticsearchは最初にドキュメントをインデックスに登録する時に下記の関数を利用してどのシャードに登録するかを決める。ドキュメントを更新、削除する時も同様。
shard_num = hash(_routing) % num_primary_shards
_routingとは_idのことである。
実際のルーティンング動作
①POST /products/_update/100でアクセスする。idは100
②関数を利用し登録するシャードを導き出し、登録する。
この結果からいきなりシャードを追加してもIDで検索した場合に見つからない可能性がある。
また、通常運用しながらシャードを追加する場合は今まで登録されていたシャードのドキュメントの数が不均等になり、エラーが起こる場合がある。その時はインデックスの再作成をしないといけない。

elasticsearchがデータを読み取る方法

①クエリを実施
GET /products/_doc/100
②coorginating node(調整ノード)と呼ばれるノードがクエリを受け取る。
③探しているドキュメントが格納されている場所を探す(ルーティング)
④ARSという方法を使用しドキュメントがあるプライマリーシャードのレプリカシャードを選択する
⑤選択したレプリカシャードに調整ノードから読み取り依頼が出され、読み取り帰ってくる。

elasticsearchがデータを書き込む方法

①クエリを実施
POST /products/_doc/100
②リクエストはプライマリーシャードにルーティングされる。
③プライマリーシャードはリクエストのフィールドが変な値ではないか確認する。
④プライマリーシャード自身にリクエストを書き込む。
⑤レプリカシャード全てに書き込むようにリクエストを配布する。

書き込み時の問題発生

書き込みの際にプライマリーシャードが死んでしまった場合は回復プロセスが実行されレプリカシャードがプライマリーシャードに昇格する。その際様々なエラーが予想される。
そのエラーを改善するためにprimary termsとseqence numbersという名目がある。
primary terms: これはelasticsearchが古いプライマリと新しいプライマリを区別する方法。既存のプライマリが死ぬと新しいプライマリができますがこの二つのプライマリはoldとnewに区別されます。この区別がクラスターが管理しています。区別することによってたくさんのエラーを改善することができる。

seqence number: 操作ごとにカウンタが上がっていく仕組みです。プライマリーシャードは書き込み要求を処理する時にこの数を増やさないといけません。シーケンス番号によりelasticsearchは指定された操作がどの順序で行われたかしることができるため多くのエラーを改善することができる。

check point: チェックポイントにはグローバルチェックポイントとローカルチェックポイントがある。
グローバルチェックポイント: 各レプリケーショングループに存在しレプリケーション内の全てのアクティブなシャードのシーケンス番号です。グローバルチェックポイントよりも小さいシーケンス番号を含む全ての操作がレプリケーショングループ内の全てのシャードで実行されています。つまりグローバルチェックポイントを利用し何らかの不具合があった場合でもそれを検知し修正することができる。

ローカルチェックポイント: 各レプリカシャードに存在する。最後に行なった動作を記録する。

REST APIとは

webシステムに対するクエリのようなもの