ElasticSearchの仕組み

面接の質問

ES書き込みデータの動作原理は何ですか?ESクエリデータはどのように機能しますか?一番下のLuceneはどうですか?転置インデックスを理解していますか?

インタビュアーの精神分析

実際、インタビュアーはesの基本原則を理解しているかどうかを確認したいと考えています。これは、esの使用はデータの書き込みと検索にすぎないためです。書き込みと検索のリクエストを開始したときにesが何をしているのかわからない場合は、実際には...

はい、esは基本的にブラックボックスですが、他に何ができますか?できることは、esAPIを使用してデータの読み取りと書き込みを行うことだけです。何かがうまくいかず、何もわからない場合、あなたはあなたに何を期待できますか?

面接の質問の分析

es書き込みデータプロセス

  • クライアントはリクエストを送信するノードを選択し、このノードが coordinating node (調整ノード)です。
  • coordinating node ドキュメントはルーティングされ、リクエストは対応するノードに転送されます(プライマリシャードがあります)。
  • 実際のノードprimary shard でリクエスト処理してから、データをノード に同期します replica node 。
  • coordinating node それが見つかり primary node 、すべて replica node が完了すると、応答結果がクライアントに返されます。

es-write

es読み取りデータプロセス

を介してdoc id 照会することができ doc id 、ハッシュに基づいて、その時点でdoc id どのシャードが割り当てられているかが 判断され 、シャードが照会されます。

  • クライアントは任意のノードにリクエストを送信し、になり coordinate node ます。
  • coordinate nodedoc id ハッシュルートの うち 、今度round-robin はランダムポーリングアルゴリズム、 primary shard ランダム選択、レプリカをすべて使用して、対応するノードにリクエストを転送 し、読み取りリクエストの負荷分散を行います。
  • リクエストを受信したノードは、ドキュメントをに返します coordinate node 。
  • coordinate node ドキュメントをクライアントに返します。

es検索データプロセス

最も強力なesは、全文検索を実行することです。つまり、たとえば、次の3つのデータがあります。

java真好玩儿啊
java好难学啊
j2ee特别牛clipboardErrorCopiedにコピーします

java キーワードに基づいて 検索し、含まれているjava ものを検索し ます document 。esはあなたに戻ります:javaはとても楽しいです、javaは学ぶのがとても難しいです。

  • クライアントは1つにリクエストを送信します coordinate node 。
  • 調整ノードは、検索要求をすべてのシャードの対応する primary shard ORに 転送しますreplica shard 。
  • クエリフェーズ:各シャードは独自の検索結果(実際には一部doc id )を調整ノードに返し 、調整ノードはデータのマージ、並べ替え、ページングなどの操作を実行して最終結果を生成します。
  • フェッチフェーズ:doc id さまざまなノードに応じてコーディネーターノードが続き 、実際の document データプルし、最終的にクライアントに返されます。

書き込み要求はプライマリシャードに書き込まれ、すべてのレプリカシャードに同期されます。読み取り要求は、ランダムポーリングアルゴリズムを使用して、プライマリシャードまたはレプリカシャードから読み取ることができます。

データ書き込みの基本原則

es-write-detail

最初にメモリバッファに書き込みます。バッファ内にある間はデータを検索できません。同時に、データをトランスログログファイルに書き込みます。

バッファがほぼいっぱいになるか、一定の時間が経過するrefresh と、メモリバッファのデータは新しいバッファに転送され ます segment file が、この時点では、データはsegment fileディスクファイルに直接入力されるのではなく、最初に入力され ます os cache 。このプロセスはまさにそれ refresh です。

1秒ごとに、ESは、バッファにデータを書き込む新しいもの segment file 、および新しいディスクファイルが 毎秒生成されsegment file 、 segment file 最後の1秒でバッファに書き込まれたデータを格納します。

ただし、この時点でバッファにデータがない場合は、もちろん更新操作は実行されません。バッファにデータがある場合、更新操作はデフォルトで1秒に1回実行され、新しいセグメントファイルにフラッシュされます。 。

オペレーティングシステムでは、ディスクファイルには実際にはos cache オペレーティングシステムキャッシュと呼ばれるものがあります 。つまり、データがディスクファイルに書き込まれる前に os cache 、最初にオペレーティングシステムレベルでメモリキャッシュに入ります。buffer のデータが更新操作os cache で更新されている 限り 、このデータを検索できます。

なぜ準リアルタイムでesと呼ばれるのですか? NRT 、フルネーム near real-time 。デフォルトでは1秒ごとに更新されます。これは、書き込まれたデータが1秒後にしか表示されないため、esはほぼリアルタイムです。restful api または を介して java api 、手動で更新操作を実行すると、データバッファが手動でブラシ os cache に挿入されるため、データをすぐに見つけることができます。データが入力されている限り os cache 、バッファを保持する必要がなく、データがトランスログのディスクに保持されているため、バッファは空になります。

上記の手順を繰り返すと、新しいデータが継続的にバッファとトランスログに入り、buffer データを次々に 継続的に書き込みます segment file 。 refresh バッファがクリアされるたびに、トランスログが保持されます。このプロセスが進むにつれて、トランスログはますます大きくなります。トランスログが特定の長さに達すると、commit 操作がトリガーされ ます。

最初のステップのコミット操作が発生します。これは、バッファーを 空にするrefresh にデータをバッファーに 入れる os cacheことです。次に、 対応するすべて commit point を識別するディスクファイルに1つを 書き込み  、同時に すべての現在のデータ をディスクファイルに強制 し ます。最後に 既存のトランスログログファイルをクリアし、トランスログを再起動すると、コミット操作が完了します。commit pointsegment fileos cachefsync

このコミット操作はと呼ばれ flush ます。デフォルトは30分ごとに自動的に実行されますが flush 、トランスログが大きすぎるとトリガーされ flush ます。フラッシュ操作はコミットプロセス全体に対応します。esapiを介して手動でフラッシュ操作を実行し、OSキャッシュ内のデータを手動でフラッシュしてディスクにfsyncすることができます。

トランスログログファイルの目的は何ですか?コミット操作を実行する前に、データはバッファまたはosキャッシュに残ります。バッファとosキャッシュはどちらもメモリです。マシンが停止すると、メモリ内のすべてのデータが失われます。したがって、データに対応する操作を特別なログファイルに書き込む必要があります translog 。マシンがダウンして再起動すると、esは自動的にトランスログログファイルのデータを読み取り、メモリバッファとOSキャッシュに復元します。

トランスログは実際には最初にosキャッシュに書き込まれます。デフォルトでは、5秒ごとにディスクにフラッシュされるため、デフォルトでは、バッファまたはトランスログファイルのosキャッシュにのみ残る5秒のデータが存在する場合があります。この時点でマシンが稼働している場合電話を切ると  5秒間のデータ失われます。ただし、このパフォーマンスは優れており、最大5秒のデータが失われます。各書き込み操作fsync がディスクに直接行われるようにトランスログを設定することもできます が、パフォーマンスは大幅に低下します。

実際、あなたはここにいます。インタビュアーがデータを失うことについて質問しなかった場合は、ここでインタビュアーに見せびらかすことができます。最初は準リアルタイムであり、データは1秒後に検索できます。 。;データが失われる可能性があります。バッファ、トランスログOSキャッシュ、セグメントファイルOSキャッシュには、5秒間のデータが残っていますが、ディスクにはありません。この時点でデータがダウンすると、5秒間のデータ損失が発生します。

要約すると、データは最初にメモリバッファに書き込まれ、次に1秒ごとにデータがosキャッシュに更新され、osキャッシュでデータを検索できます(つまり、esは書き込みから検索できると言いました、および間に1があります。delay)。5秒ごとに、トランスログファイルにデータを書き込みます(したがって、マシンがダウンしてメモリデータが完全になくなった場合、最大で5秒のデータ損失が発生します)、トランスログはある程度大きく、デフォルトでは30分ごとになります。コミット操作がトリガーされ、バッファがバッファリングされます。ゾーン内のデータは、セグメントファイルディスクファイルにフラッシュされます。

データがセグメントファイルに書き込まれた後、同時に転置インデックスが作成されます。

データの削除/更新の基本原則

削除操作の場合、コミット時に.del ファイルが生成され 、特定のドキュメントがdeleted ステータスとしてマークされ ます。検索すると、.del ファイルに応じて ドキュメントが削除されたかどうかを確認できます。

更新操作の場合、元のドキュメントはdeleted 状態としてマークされ 、新しいデータが書き込まれます。

更新ごとに1つのバッファが生成される segment file ため、デフォルトでは1秒ごとに1つ segment file であるためsegment file 、ますますダウン します。このとき、マージは定期的に実行されます。あなたはマージするたびに、複数の ドキュメントがされる segment file と同時に、特定された。1にマージ deletedドキュメントがされる物理的に削除し、新しい segment file 1がディスクに書き込まれます。一つは、こちらを書き込まれます commit point すべて新しいものを識別し segment file て、次にsegment file 、検索用に開き ます。、そして同時に古いものを削除し segment file ます。

低レベルのlucene

簡単に言うと、luceneは、転置インデックスを確立するためのさまざまなカプセル化されたアルゴリズムコードを含むjarパッケージです。Javaで開発する場合は、lucene jarを導入し、luceneapiに基づいて開発します。

luceneを使用すると、既存のデータにインデックスを付けることができ、luceneはローカルディスク上のインデックスのデータ構造を整理します。

転置インデックス

検索エンジンでは、各ドキュメントに対応するドキュメントIDがあり、ドキュメントのコンテンツは一連のキーワードのコレクションとして表されます。たとえば、ドキュメント1は単語セグメント化され、20個のキーワードが抽出され、各キーワードはドキュメントに表示される回数と表示される場所を記録します。

次に、転置インデックスは 、キーワードからドキュメントIDのマッピングです。各キーワードは一連のファイルに対応し、キーワードはこれらのファイルに表示されます。

栗をあげます。

次のドキュメントが利用可能です。

DocId Doc
1 グーグルマップの父がフェイスブックにジャンプ
2 グーグルマップの父がフェイスブックに参加
3 グーグルマップの創設者ラスはフェイスブックに参加するためにグーグルを去る
4 グーグルマップの父は、ウェーブプロジェクトのキャンセルに関連してフェイスブックを辞めた
5 グーグルマップの父であるラスがソーシャルネットワーキングサイトのフェイスブックに参加

ドキュメントの単語セグメンテーション後、次の転置インデックスが取得されます。

WordId DocIds
1 グーグル 1、2、3、4、5
2 地図 1、2、3、4、5
3 お父さん 1、2、4、5
4 仕事のホッピング 1、4
5 フェイスブック 1、2、3、4、5
6 参加する 2、3、5
7 創設者 3
8 ラス 3、5
9 どこかに行って 3
10 4
.. .. ..

さらに、実用的な転置インデックスは、ドキュメントの頻度情報など、ドキュメントコレクション内の特定の単語を含むドキュメントの数を示すより多くの情報を記録することもできます。

次に、転置インデックスを使用すると、検索エンジンはユーザーのクエリに簡単に応答できます。たとえば、ユーザーがクエリを入力する Facebook と、検索システムが転置インデックスを検索し、そこから単語を含むドキュメントを読み取ります。これらのドキュメントは、ユーザーに提供される検索結果です。

転置インデックスの2つの重要な詳細に注意してください。

  • 転置インデックスのすべての用語は、1つ以上のドキュメントに対応しています。
  • 転置インデックスの用語は、辞書式順序の昇順で並べ替えられます

おすすめ

転載: blog.csdn.net/qq_27828675/article/details/115374940