ElasticSearch の基本概念とクラスター分散の基礎となる実装

ElasticSearch の基本概念とクラスター分散の基礎となる実装

[[333989]]

ディープページングによるマシンパフォーマンスの問題

最近、ElasticSearch のディープ ページング検索が発生し、CPU 使用率が高くなりすぎました。 ElasticSearch: The Authoritative Guide を参考にして、ディープ ページングがマシン リソースの使用を引き起こす理由を学びました。

クラスター化されたシステムでのディープ ページング ディープ ページングがなぜ問題になるのかを理解するために、5 つのプライマリ シャードを持つインデックスを検索することを想像してみましょう。結果の最初のページ (結果 1 ~ 10) を要求すると、各シャードは独自の上位 10 件の結果を生成し、要求元のノードに返します。その後、要求元のノードは 50 件の結果すべてを並べ替えて上位 10 件の結果を選択します。ここで、ページ 1000 (結果 10001 ~ 10010) をリクエストするとします。各シャードが上位 10010 件の結果を生成する必要がある点を除いて、すべて同じように動作します。リクエスト ノードは、これらの 50,050 件の結果を並べ替え、50,040 件を破棄します。分散システムでは、ページングが深くなるにつれて、結果のソートに費やされるリソースと時間が指数関数的に増加することがわかります。このため、Web 検索エンジンは、どのクエリに対しても 1,000 件を超える結果を返すことはできません。

上記のテキストを理解するには、ElasticSearch クラスターとクラスター内のクエリの基本原理を理解する必要があります。この記事では、ElasticSearch の基本的な概念と基本原理を要約することで、理解を深めることを目指します。同時に、ユーザーにとって役に立ち、不必要な落とし穴を避けることができることを願っています。

基本概念

索引

ElasticSearch のコンテキストでは、「インデックス」という単語には複数の意味があります。インデックス (名詞): 従来のリレーショナル データベース分野と同様に、インデックスは SQL のデータベースに相当します。インデックスは名前 (すべて小文字である必要があります) によって識別され、この名前を参照してドキュメントが作成、検索、更新、削除されます。

インデックス (動詞): ドキュメントをインデックス化するということは、ドキュメントを取得および検索できるようにインデックス (名詞) に保存することです。これは、SQL ステートメントの INSERT キーワードと非常によく似ていますが、古いドキュメントが既に存在する場合は新しいドキュメントが古いドキュメントを置き換える点が異なります。

逆インデックス: リレーショナル データベースでは、指定された列に B ツリー インデックスなどの「インデックス」を追加することで、データ取得速度が向上します。 ElasticSearch と Lucene は、同じ目的を達成するために「転置インデックス」と呼ばれる構造を使用します。

たとえば、ドキュメントと用語の関係は次のようになります。

図1: 文書と用語の関係

フィールド値が分析された後、転置インデックスに格納されます。転置インデックスは、用語 (Term) とドキュメント (Doc) の関係を格納します。転置インデックスの簡略版は次のとおりです。

図2: 逆インデックス

タイプ

タイプはインデックス内の論理パーティション (カテゴリ/パーティション) ですが、その意味はユーザーのニーズによって完全に異なります。したがって、インデックス内で 1 つ以上のタイプを定義できます。一般的に、同じドメインを持つドキュメントに対してはタイプが事前定義されています。従来のリレーショナル データベース フィールドと同様に、このタイプは「テーブル」に相当します。

書類

ドキュメントは完全なデータ行に似ています。 ElasticSearch では、ドキュメントは JSON 形式に基づいて表現されます。ドキュメントは、インデックス作成と検索の最小単位です。 1 つ以上のフィールドを含むコンテナーです。各ドキュメントには異なるフィールド セットを保存できますが、同じタイプのドキュメントには少なくともある程度の類似性が必要です。

ノード

実行中の ElasticSearch インスタンスはノードと呼ばれ、クラスターは同じ cluster.name 構成を持つ 1 つ以上のノードで構成され、データと負荷の圧力を共有します。

ES クラスターには 3 種類のノードがあります。

  • マスターノード: インデックスの追加や削除、ノードの追加や削除など、クラスター内のすべての変更を管理する役割を担います。マスター ノードは、ドキュメント レベルの変更や検索に関与する必要はありません。これは、プロパティ node.master を介して設定できます。
  • データ ノード: データとそれに対応する転置インデックスを格納します。デフォルトでは、すべてのノードはデータ ノード (マスター ノードを含む) であり、node.data プロパティを通じて設定できます。
  • 調整ノード: node.master プロパティと no​​de.data プロパティの両方が false の場合、このノードは調整ノードと呼ばれ、クライアント要求に応答し、各ノードの負荷を分散するために使用されます。

シャード

インデックス内のデータは複数のシャードに保存されます。これは水平テーブルシャーディングに相当します。シャードは Lucene のインスタンスであり、それ自体が完全な検索エンジンです。ドキュメントはシャード内に保存され、インデックス化されますが、アプリケーションはシャードではなくインデックスと直接対話します。

シャードはプライマリ シャードまたはレプリカ シャードのいずれかになります。インデックス内のすべてのドキュメントはプライマリ シャードに属しているため、プライマリ シャードの数によって、インデックスが保存できるデータの最大量が決まります。レプリカ シャードは、プライマリ シャードの単なるコピーです。レプリカ シャードは、ハードウェア障害が発生した場合にデータが失われないように保護する冗長バックアップとして機能し、ドキュメントの検索や返却などの読み取り操作のためのサービスを提供します。

クラスター分散基盤実装

ElasticSearch の基本概念について理解できたので、分散システムでデータがどのように保存され、クエリされるかをより深く理解できるように、内部の詳細を詳しく見ていきましょう。

ES は実際には分散を実現するためにシャーディングを使用します。シャードはデータのコンテナです。ドキュメントはシャードに保存され、シャードはクラスター内のさまざまなノードに分散されます。クラスターのサイズが拡大または縮小すると、ES はノード間でシャードを自動的に移行し、データがクラスター内で均等に分散された状態を維持します。

プライマリ シャードの数はインデックスの作成時に決定されますが、レプリカ シャードの数はいつでも変更できます。デフォルトでは、インデックスには 5 つのプライマリ シャードがあり、任意の数のレプリカを持つことができます。

プライマリ シャードとレプリカ シャードのステータスによって、クラスターの健全性が決まります。各ノードにはプライマリ シャードまたはそれに対応するレプリカ シャードのいずれかのみが保存され、同じレプリカ シャードが同じノードに存在することはありません。クラスター内にノードが 1 つしかない場合、レプリカ シャードは割り当てられません。現時点では、クラスターのヘルス ステータスは黄色であり、データが失われるリスクがあります。

分散ドキュメント CRUD

新しいドキュメントのインデックス作成 (作成)

ユーザーが新しいドキュメントをインデックスするリクエストをノードに送信すると、ノードは新しいドキュメントをどのシャードに追加するかを計算します。各ノードには、各シャードがどのノードに保存されているかに関する情報が格納されているため、調整ノードは対応するノードにリクエストを送信します。このリクエストはプライマリ シャードに送信されることに注意してください。プライマリ シャードがインデックス作成を完了すると、各シャードが最新のデータを保持するように、リクエストがすべてのレプリカ シャードに並行して送信されます。

新しいドキュメントが書き込まれるたびに、まずメモリに書き込まれ、操作がトランスログ ファイル (トランザクション ログ) に書き込まれます。この時点で検索操作を実行すると、新しいドキュメントをインデックス化できません。

図3: 新しいドキュメントはメモリに書き込まれ、操作はトランスログに書き込まれます

ES は 1 秒ごとに更新操作を実行します (この時間は変更できます)。このとき、この 1 秒以内にメモリに書き込まれた新しいドキュメントは、ファイル システム キャッシュに書き込まれ、セグメントを形成します。この時点では、このセグメント内のドキュメントは検索可能ですが、まだハードディスクに書き込まれていません。つまり、この時点で停電が発生すると、これらの文書が失われる可能性があります。

図4: リフレッシュを実行すると、メモリがクリアされ、新しいドキュメントがファイルシステムキャッシュに書き込まれます。

新しいドキュメントが継続的に作成されるため、このプロセスが繰り返されます。毎秒新しいセグメントが生成され、トランスログ ファイルはどんどん大きくなります。

図5: Translogは新しい文書レコードを追加し続けます

fsync 操作は 30 分ごとに、またはトランスログ ファイルが非常に大きくなったときに実行されます。この時点で、ファイル システム キャッシュ内のすべてのセグメントがディスクに書き込まれ、トランスログは削除されます (その後、新しいトランスログが生成されます)。

図6: fsyncを実行すると、セグメントがディスクに書き込まれ、メモリとトランスログがクリアされます。

上記のプロセスからわかるように、2 つの fsync 操作の間、メモリとファイル システム キャッシュに保存されたドキュメントは安全ではなく、停電が発生するとこれらのドキュメントは失われます。そのため、ES では、2 つの fsync 間のすべての操作を記録するトランスログを導入し、マシンが障害から回復したり再起動したりするときに、トランスログに従って ES を復元できるようにします。

もちろん、translog 自体もメモリ内に存在するファイルなので、停電が発生すると失われます。したがって、ES は 5 秒ごとに、または書き込み要求が完了した後に、トランスログをディスクに書き込みます。ドキュメントに対する操作がディスクに書き込まれると、その操作は安全で回復可能であると想定できます。したがって、現在の操作レコードがディスクに書き込まれた場合にのみ、ES は操作要求を送信したクライアントに成功した操作の結果を返します。

さらに、毎秒新しいセグメントが生成されるため、すぐにセグメントの数が膨大になります。シャードに対してクエリ要求が行われると、シャード内のすべてのセグメントが順番にクエリされるため、検索の効率が低下します。したがって、ES はセグメントのマージ作業を自動的に開始し、同様のサイズのいくつかのセグメントを新しい大きなセグメントにマージします。マージ プロセスでは、実際に新しいセグメントが作成されます。新しいセグメントがディスクに書き込まれると、マージされた古いセグメントはすべてクリアされます。

図7: セグメントの結合

図8: マージが完了すると、古いセグメントは削除され、新しいセグメントが検索可能になります。

ドキュメントの更新と削除

ES インデックスは変更できないため、更新および削除操作は元のインデックスに対して直接実行されません。

ディスク上の各セグメントは、削除されたファイルを記録するための del ファイルを保持します。ユーザーが削除要求を行っても、ドキュメントは実際には削除されず、インデックスも変更されません。代わりに、ドキュメントは del ファイル内で削除済みとしてマークされます。したがって、削除されたドキュメントは引き続き取得できますが、検索結果が返されるときにフィルター処理されて除外されます。セグメントのマージが開始されるたびに、削除対象としてマークされたドキュメントが実際に削除されます。

ドキュメントを更新する場合、まず元のドキュメントが検索され、ドキュメントのバージョン番号が取得されます。変更されたドキュメントはメモリに書き込まれます。このプロセスは、新しいドキュメントを書き込む場合と同じです。同時に、ドキュメントの古いバージョンは削除対象としてマークされます。同様に、ドキュメントは検索できますが、最終的にはフィルタリングされます。

読み取り操作: クエリプロセス

クエリ プロセスは通常、クエリとフェッチの 2 つの段階に分かれています。このノードのタスクは、クエリ要求をすべての関連するシャードにブロードキャストし、それらの応答をグローバルにソートされた結果セットに統合して、クライアントに返すことです。

クエリフェーズ

ノードが検索要求を受信すると、調整ノードになります。

クエリプロセス分散検索

図9: クエリ処理中の分散検索

最初のステップは、インデックス内のシャードのすべてのノードのコピーにリクエストをブロードキャストすることです。クエリ要求はプライマリ シャードまたはレプリカ シャードによって処理され、コーディネータ ノードは後続の要求ですべてのシャード コピーをポーリングして負荷を分散します。

各シャードはローカルに優先キューを構築します。クライアントが結果のソートで from 番目のノードから始まるサイズの結果セットを返すように要求した場合、各ノードはサイズ from+size の結果セットを生成する必要があるため、優先キューのサイズも from+size になります。シャードは、結果セット内の各ドキュメントの ID とソートに必要な情報を含む軽量の結果のみを調整ノードに返します。

コーディネータ ノードは、すべてのシャードの結果を集約し、グローバル ソートを実行して最終的なクエリ ソート結果を取得します。この時点でクエリ フェーズは終了します。

回収段階

クエリ プロセスでは、検索要件を満たすドキュメントをマークして並べ替えられた結果が取得されます。現時点では、これらの文書を入手してクライアントに返却する必要があります。

コーディネータノードは、実際に返す必要があるドキュメントを決定し、そのドキュメントを含むシャードに GET リクエストを送信します。シャードはドキュメントを取得し、それを調整ノードに返します。調整ノードは結果をクライアントに返す

著者: 張勇

翻訳元

<<:  ガートナー:クラウド技術は急速にローカルデータセンターネットワークに浸透している

>>:  サービスとしてのデータベースのさまざまな形態

推薦する

evlgaming-5.25 USD/KVM/1 GB RAM/25 GB HDD/500 GB フロー/Win

evlgaming の今回のプロモーションの目玉は、エンタープライズ レベルの VPS で、こちらも...

ガートナーは、世界のパブリッククラウドのエンドユーザーの支出が2021年に18%増加すると予測している。

[[352897]]ガートナーは、パブリッククラウドサービスに対する世界のエンドユーザーの支出が、2...

人間のように言葉の暗黙の意味を理解するアリババAIの最新の研究成果がトップの国際会議に登場

AIの言語理解能力がさらに向上しました! 7月30日、オンラインで開催された世界最高峰の人工知能カン...

ユー・ミンホン:検索マーケティングは現在最高のマーケティング手法です

最近、第4回「起業家サロン」が北京新雲南皇冠酒店で開催された。新東方教育科技集団の創設者である于敏宏...

小紅書は莫大な利益を上げているのでしょうか?

小紅書が主要なAndroidアプリストアから削除された疑いがあるというニュースは、今朝すぐにWeib...

ウェブサイトのユーザーエクスペリエンス: インタラクションについて知っておくべき視覚的な事柄

プロダクトマネージャーやインタラクションデザイナーが、ビジュアルデザインのドラフトが当初の計画とあま...

初期ウェブサイト構築に関するSEOテクニック(I)

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますウェブサイ...

SEO に必須のウェブマスター ツール

SEO担当者として、私たちは日々データ分析を行う必要があり、データ分析の方法は、一般的に使用されてい...

電子商取引市場調査の観点から百度有為の必然的な失敗を考察する

電子商取引市場調査の観点から百度有為の必然的な失敗を考察するBaidu Youa は、日常生活の消費...

APPのプロモーションと新規ユーザーの獲得のためのプロセスとチャネル!

アプリの運用やプロモーションの方法は人それぞれです。アプリをプロモーションするには、次の 2 つのこ...

Huawei Cloud Distributed Cache Redis サービスが企業のデータ処理を加速

Huawei Cloud Distributed Cache Redis サービスは、Redis と...

オラクルのクラウドへの強気な姿勢はデータベースの絶望を隠している

Oracle は昔のエンタープライズ アプリケーションには優れたデータベースでしたが、現代のビッグ ...

A5サイズで好きなように投稿するための3つのヒント

A5 でソフトな記事を公開して Web サイトを宣伝できることは、すべての Web マスターの夢です...

imidc: (香港 + 台湾) 独立サーバー、月額 30 ドル、e3-12xx/16g メモリ/1T ハードディスク/20Mbps 帯域幅 (CN2)

imidc(レインボーネットワーク、有名な大物が運営、日本、アメリカ、香港などに会社を登録、アメリカ...

製品価値とユーザーエクスペリエンス:どちらが重要か?どちらも欠かせない

[編集者注] この記事は、@SamaelRen Shuai の個人ブログに掲載されました。製品価値と...