アーキテクチャの成長への道: 分散システムの設計方法、Elasticsearch の仕組みをご覧ください

アーキテクチャの成長への道: 分散システムの設計方法、Elasticsearch の仕組みをご覧ください

[[269842]]

分散システムにはさまざまな種類があり、非常に広範囲にわたります。システムの種類によって特性が異なります。バッチ コンピューティングとリアルタイム コンピューティングは非常に異なります。この記事では、分散ストレージ システム、分散検索システム、分散分析システムなどの分散データ システムの設計に焦点を当てます。

まず、Elasticsearch のアーキテクチャを簡単に見てみましょう。

Elasticsearch クラスター アーキテクチャ

Elasticsearch は、よく知られているオープンソースの検索および分析システムです。現在、インターネットのさまざまな分野で広く利用されていますが、特に以下の 3 つの分野で利用されています。 1 つ目は検索フィールドです。 Solr と比較すると、これは本当に注目の的であり、多くの検索システムの第一選択肢となっています。 2 つ目は Json ドキュメント データベースです。これは MongoDB よりも読み取りおよび書き込みパフォーマンスが優れており、より豊富な地理的位置クエリと数値とテキストの混合クエリをサポートします。 3つ目は時系列データの分析と処理です。現在、当社は監視データのログ処理、保存、分析、可視化において非常に優れた成果を上げており、この分野のリーダーであると言えます。

Elasticsearch の詳しい紹介については、公式 Web サイトをご覧ください。まず、Elasticsearch の重要な概念をいくつか見てみましょう。

  • ノード: 物理的な概念、実行中の Elasticarch インスタンス、通常はマシン上のプロセス。
  • インデックスは、構成情報のマッピング、逆方向および順方向のデータ ファイルを含む論理概念です。インデックスのデータ ファイルは、1 台のマシンまたは複数のマシンに分散される場合があります。インデックスの別の意味は、逆インデックス ファイルです。
  • シャード: 大量のデータに対応するために、インデックスは通常、特定のディメンションに従って複数の部分に分割されます。各部分はシャードであり、シャードはノードによって管理されます。ノードは通常、同じインデックスまたは異なるインデックスに属する可能性のある複数のシャードを管理します。ただし、信頼性と可用性を確保するために、同じインデックスのシャードは可能な限り異なるノードに分散されます。シャードには、プライマリ シャードとレプリカ シャードの 2 種類があります。
  • レプリカ: 同じシャードのバックアップ データ。シャードには 0 個以上のレプリカが存在する場合があります。これらのレプリカ内のデータは、強い一貫性または結果的な一貫性が保証されます。

グラフで表すと次のようになります。


  • インデックス 1: 青い部分には、3 つの異なるノードに配置された 3 つのシャード (P1、P2、P3) があります。ここにはレプリカはありません。
  • インデックス 2: 緑の部分には 2 つのシャード P1 と P2 があり、これらは 2 つの異なるノードに配置されています。そして、各シャードにはレプリカ、つまり R1 と R2 があります。システムの可用性を考慮すると、同じシャードのプライマリとレプリカを同じノードに配置することはできません。ここで、Shard1 の P1 と R1 はそれぞれ Node3 と Node2 に配置されています。 Node2 がダウンした場合でも、P1 と R2 は引き続き利用可能であるため、サービスは基本的に影響を受けません。マスタースレーブアーキテクチャであるため、プライマリシャードに障害が発生した場合は切り替える必要があります。この時点で、レプリカを新しいマスターとして選出する必要があります。少し時間がかかるだけでなく、データが失われるリスクもあります。

インデックスプロセス

インデックスを構築する際、ドキュメントは最初にルーティング ルールを通じてプライマリ シャードに配置され、その後インデックス作成のためにプライマリ シャードに送信されます。成功すると、ドキュメントはインデックス作成のためにシャードのレプリカに送信されます。レプリカ上にインデックスが正常に構築された後にのみ成功が返されます。

このアーキテクチャでは、すべてのインデックス データはシャード内に配置され、1 つのコピーがプライマリ シャードに保存され、もう 1 つのコピーがレプリカ シャードに保存されます。レプリカ シャードまたはプライマリ シャードが失われた場合 (たとえば、マシンのクラッシュやネットワークの中断により)、失われたシャードを他のノードで復元する必要があります。この時点で、新しいシャードを構築するには、シャードのすべてのデータを他のレプリカから新しいノードにコピーする必要があります。このコピー プロセスには時間がかかり、その間は残っているプラ​​イマリ レプリカのみがトラフィックを伝送できます。リカバリが完了する前に、フェイルオーバーが完了するまで、システム全体が比較的危険な状態になります。

これは、レプリカが存在する理由の 1 つを反映しており、データの損失を回避し、データの信頼性を向上させることです。レプリカが存在するもう 1 つの理由は、読み取り要求の数が多い場合、1 つのノードではすべてのトラフィックを処理できないことです。このとき、クエリ機能を拡張するために、クエリ負荷を分散するためのレプリカが必要です。

ロール展開方法

次に、役割を分担する 2 つの異なる方法を見てみましょう。

Elasticsearch は上記の 2 つの方法をサポートしています。

1. ハイブリッド展開(左)

  • デフォルトモード。
  • マスターノードを考慮せずに、データノードとトランスポートノードの 2 種類のノードがあります。このデプロイメント モードでは、これら 2 つの異なるタイプのノード ロールが同じノードに配置されます。これは、1 つのノードがデータとトランスポートの 2 つの機能を持つのと同じです。
  • インデックスまたはクエリ要求がある場合、その要求はランダムに(カスタマイズされて)任意のノードに送信されます。このノードはグローバル ルーティング テーブルを保持し、ルーティング テーブルを通じて適切なノードを選択し、これらのノードに要求を送信し、すべての要求が返されるのを待機し、結果をマージしてユーザーに返します。ノードは 2 つの役割を果たします。
  • 利点は、使い方が非常に簡単で、簡単に始めることができ、システムの宣伝に大きな価値があることです。最も単純なシナリオでは、すべての機能を完了するために 1 つのノードを起動するだけで済みます。
  • 欠点は、複数の種類のリクエストが相互に影響を及ぼしてしまうことです。大規模なクラスターでは、データ ノードがホットになると、このデータ ノードを通過する他のすべてのノード間リクエストに影響します。障害が発生した場合、その影響はさらに大きくなります。
  • Elasticsearch の各ノードは、他のすべてのノードと 13 個の接続を維持する必要があります。この場合、各ノードは他のすべてのノードとの接続を維持する必要があり、システム内の接続数には上限があるため、接続数によってクラスターのサイズが制限されます。
  • また、クラスターのホットアップデートはサポートされていません。

2. 階層型展開(右図):

  • ノードは構成によって分離できます。
  • いくつかのノードをトランスポート ノードとして設定します。トランスポート ノードは、特に要求の転送と結果のマージに使用されます。
  • 他のノードは、データを具体的に処理するためのデータノードとして設定できます。
  • 欠点は、始めるのが複雑なことです。トランスポートの数を事前に設定する必要があります。この数はデータ ノード、トラフィックなどに関連しています。そうしないと、リソースがアイドル状態になるか、マシンが過負荷になります。
  • 利点は、役割が互いに独立しており、互いに影響を及ぼさないことです。通常、トランスポート ノードのトラフィックは均等に分散され、単一のマシンの CPU またはトラフィックが完全に利用されることはまれです。ただし、DataNode はデータを処理するため、CPU、ネットワーク、ディスクなどの単一のマシンのリソースが最大限に活用されやすくなります。独立した後、DataNode に障害が発生した場合、単一のノードのデータ処理にのみ影響し、他のノードの要求には影響しません。影響は最小限の範囲に限定されます。
  • 役割が独立すると、トランスポート ノードのみがすべてのデータ ノードに接続する必要があり、データ ノードは他のデータ ノードに接続する必要はありません。クラスター内のデータノードの数はトランスポートノードの数よりもはるかに多いため、クラスターはより大きくなる可能性があります。さらに、トランスポート ノードが固定グループ内のデータノードにのみ接続するようにグループ化することもできます。これにより、Elasticsearch の接続数の問題が完全に解決されます。
  • ホット アップデートをサポートします。まず DataNode を 1 つずつアップグレードし、アップグレードが完了したら Transport Node をアップグレードします。プロセス全体を通して、ユーザーはそれに気付かない場合があります。

上記では、Elasticsearch のデプロイメント レイヤー アーキテクチャについて紹介しました。さまざまなシナリオに応じて、さまざまな展開方法が適しています。ニーズに応じて適切な方法を選択する必要があります。

Elasticsearch データ層アーキテクチャ

次に、現在の Elasticsearch データ層アーキテクチャを見てみましょう。

データストレージ

Elasticsearch のインデックスとメタは現在、ローカル ファイル システムでのストレージをサポートしており、niofs、mmap、simplefs、smb などのさまざまな読み込み方法もサポートしています。最高のパフォーマンスを実現する MMap 方法は、インデックスをメモリに直接ロックすることです。デフォルトでは、Elasticsearch は読み込み方法を自動的に選択しますが、設定ファイルで自分で設定することもできます。ここにはいくつか詳細がありますので、詳細については公式ドキュメントを参照してください。

インデックスとメタデータをローカルに保存すると、マシンがクラッシュしたりディスクが破損したりすると、データが失われるという問題が発生します。この問題を解決するには、レプリカ機能を使用できます。

レプリカ

各インデックスに対して、レプリカの数という構成項目を設定できます。レプリカの数を 2 に設定すると、シャードは 3 つ存在し、そのうちの 1 つは PrimaryShard、他の 2 つは ReplicaShard になります。これら 3 つのシャードは、マスターによって可能な限り異なるマシンまたはラックにスケジュールされます。これら 3 つのシャード内のデータは同じであり、同じサービス機能を提供します。

レプリカには 3 つの目的があります。

  • サービスの可用性の確保: 複数のレプリカが設定されている場合、1 つのレプリカが使用できなくなった場合でも、要求トラフィックは引き続き他のレプリカに送信され、サービスを迅速に復元できます。
  • データの信頼性を確保する: プライマリ ノードが 1 つしかなく、レプリカ ノードがない場合、プライマリ ノードのディスクが破損すると、このノード内のすべてのシャードのデータが失われ、再インデックスしか選択できなくなります。
  • より優れたクエリ機能を提供: Shard が提供するクエリ機能がビジネス ニーズを満たせない場合は、N 個のレプリカを追加し続けることで、クエリ機能を N 倍に増やすことができ、システムの同時実行性を簡単に高めることができます。

質問

上記でいくつかの利点について説明しましたが、このアーキテクチャでは、シナリオによっては問題が発生する可能性もあります。

Elasticsearch は、データの信頼性を確保するために、ローカル ファイル システムとレプリカに基づく技術アーキテクチャを使用します。このアーキテクチャは、ある程度までほとんどのニーズとシナリオを満たすことができますが、いくつか残念な点もあります。

  • レプリカはコストの無駄をもたらします。データの信頼性を確保するには、レプリカを使用する必要があります。ただし、1 つのシャードが処理能力を満たす場合、別のシャードの計算能力は無駄になります。
  • レプリカは書き込みパフォーマンスとスループットの低下をもたらします。インデックスまたは更新が実行されるたびに、最初にプライマリ シャードを更新し、更新が成功した後にレプリカ シャードを並行して更新する必要があります。ロングテールと相まって、書き込みパフォーマンスは大幅に低下します。
  • ホットスポットが発生した場合や緊急に容量拡張が必要な​​場合、レプリカを動的に追加すると時間がかかります。新しいシャードのデータは他のシャードから完全にコピーする必要があり、これには長い時間がかかります。

上記では、Elasticsearch データ層のアーキテクチャと、レプリケーション戦略の長所と短所について紹介しました。以下では、分散データ システム アーキテクチャのさまざまな形式について簡単に紹介します。

分散システム

***: ローカルファイルシステムに基づく分散システム

上の図は、ローカル ディスクに基づいてデータを保存する分散システムを示しています。インデックスには合計 3 つのシャードがあります。各シャードにはプライマリ シャードとレプリカ シャードがあります。ノード 3 のマシンがクラッシュするか、ディスクが破損した場合、まず P3 が使用できないことを確認し、R3 をプライマリ シャードとして再選択し、このシャードでマスターとスレーブの切り替えが行われます。次に、新しいマシン Node 7 を見つけて、Node 7 で P3 の新しいレプリカを再起動します。データはローカル ディスクに保存されるため、Shard 3 のデータを Node 6 から Node 7 にコピーする必要があります。200G のデータとギガビット ネットワークがある場合、コピーには 1600 秒かかります。レプリカがない場合、これらのシャードは 1600 秒以内に機能できません。

信頼性を確保するには冗長なシャードが必要であり、これにより物理リソースの消費量が増加します。

このアイデアのもう 1 つの具体化は、デュアル クラスターを使用してクラスター レベルのバックアップを実行することです。

このアーキテクチャでは、データが HDFS/HBase などの他のストレージ システムで生成される場合、準備されたデータを対応するマシンに配布するためのデータ転送システムも必要になります。

このアーキテクチャの可用性と信頼性を確保するには、実稼働環境でデュアル クラスターまたはレプリカを使用する必要があります。メリットと副作用については、上記で Elasticsearch を紹介した際に紹介したので、ここでは繰り返さないことにします。

Elasticsearch はこのアーキテクチャを使用します。

2番目のタイプ: 分散ファイルシステム(共有ストレージ)に基づく分散システム

最初のアーキテクチャの問題に対処するための別のアプローチは、ストレージとコンピューティングを分離することです。

最初のアイデアの問題の根本的な原因は、データの量が多く、データのコピーに時間がかかることです。では、データのコピーを回避する方法はあるのでしょうか?この目標を達成するための 1 つのアイデアは、基盤となるストレージ層で共有ストレージを使用することです。各シャードは、分散ファイル システム内のディレクトリ/ファイルに接続するだけで済みます。シャードにはデータは含まれず、コンピューティング部分のみが含まれます。つまり、各ノードはコンピューティング部分のみを担当し、ストレージ部分は HDFS などの下部にある別の分散ファイル システムに配置さます。

上の図では、ノード 1 は最初のファイルに接続されています。ノード 2 は 2 番目のファイルに接続されます。ノード 3 は 3 番目のファイルに接続されます。ノード 3 がダウンした場合は、ノード 4 に空のシャードを作成し、基盤となる分散ファイル システムの 3 番目のファイルに接続するための新しい接続を構築するだけで済みます。接続は非常に速く確立され、かかる合計時間も非常に短くなります。

これは、ストレージとコンピューティングを分離した典型的なアーキテクチャであり、次のような利点があります。

  • このアーキテクチャでは、リソースをより柔軟にすることができます。ストレージが不足している場合は、ストレージ システムの容量のみを拡張する必要があります。コンピューティングが不足する場合は、コンピューティング部分の容量のみを拡張する必要があります。
  • ストレージとコンピューティングは独立して管理され、リソース管理の粒度は小さくなり、管理はより洗練され、無駄が減るため、全体的なコストが削減されます。
  • 負荷がより顕著になり、ホットスポットに対する耐性が強くなります。一般的に、ホットな問題は主にコンピューティング部分で発生します。ストレージとコンピューティングが分離されたシステムの場合、コンピューティング部分はデータにバインドされていないため、リアルタイムで拡張、縮小、移行できます。ホットスポットが発生した場合、最短時間で新しいノードにコンピューティングをスケジュールできます。

このアーキテクチャには欠点もあります。分散ファイル システムへのアクセスのパフォーマンスは、ローカル ファイル システムへのアクセスほど良くない可能性があります。これは、以前の世代の分散ファイルシステムではより明白な問題でしたが、さまざまなユーザーモード プロトコル スタックの使用により、そのギャップはますます小さくなってきています。 HBase はこのアーキテクチャを使用します。

Solr もこの形式のアーキテクチャをサポートしています。

要約する

上記の 2 つのアーキテクチャには、それぞれ長所と短所があります。一部のアーキテクチャの欠陥や不具合については、さまざまなアイデアやソリューションも大きく異なりますが、アイデアの範囲が広ければ広いほど、一般的にメリットも大きくなります。

上記では、分散データ(保存/検索/分析など)システムのストレージ層の 2 つの異なるアーキテクチャ方式のみを紹介しました。皆様のお役に立てれば幸いです。ただし、分散システム アーキテクチャの設計には、幅広いコンテンツ、多くの詳細、および多くのトレードオフが伴います。特定の分野や側面にご興味がある場合は、メッセージを残していただければ、後ほどご相談させていただきます。

<<:  VDI 災害復旧オプションを調べる

>>:  マルチクラウド管理が混乱する理由

推薦する

90年代以降の若者がウェブサイトの運用と最適化に関する提案を共有

著者は 1994 年以降に生まれた SEO 実践者です。私は最年少の SEO 実践者だと考えられてい...

Rushmail: メールマーケティングツールを評価する際に考慮すべき4つのスキル

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

ウェブサイト診断:小さな改善がトラフィックの大きな改善につながる

SEO について話すとき、最初に頭に浮かぶ要素は、キーワード、外部リンク、包含ステータスなどです。こ...

SEOクエイク

SEOquake は、主要な SEO メトリックのほか、SEO 監査などの便利なツールも提供する無料...

ウェブサイトの運用に影響を与える決定的な要因は何ですか?

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

ソフトウェアダウンロードサイトのいくつかの収益モデルについて話す

みなさんこんにちは。2006 年と 2007 年に、<年収 2 万元で Web マスターの仲間...

企業がドメイン名を登録する際に注意すべき点を簡単に分析

インターネットの発展に伴い、電子商取引は事業主からますます注目を集めるようになりました。おそらく、T...

ウェブサイト運営に関するいくつかの考察

良いドメイン名はケーキの上のアイシングであり、良い運用はタイムリーな助けです。良いドメイン名がうまく...

H3C: ABC の緊密な統合により企業のデジタル変革を強化

[51CTO.comより引用] 2019年12月16日、中国電子技術標準化協会主催の「第9回中国クラ...

現実的なKubernetesログソリューション

マイクロサービス アプリケーションのログ チェーンは通常長く、ログ収集 → ログ バッファリング →...

デルテクノロジーズ「天山七剣士」がコンテナ永続ストレージの課題に取り組む

現在、「クラウドネイティブ」という概念が世界を席巻しています。特にデジタル経済の急速な発展と拡大に伴...

大規模ウェブサイトの SEO 戦略を共有する

検索エンジン最適化では、SEO 戦略が最終的な最適化効果に影響します。 SEO 戦略は中小規模のウェ...

Baiduの継続的なアップデートについての私の考え

Baidu は 12 月から継続的に更新しています。3 日から 7 日が経ちました。75% の割合か...

パンデミックにより企業はクラウドへの移行を迫られるだろうが、パブリッククラウドは非常に一般的なクラウドオプションである。

10月14日、海外メディアは、新型コロナウイルスの流行が多くの企業に影響を与えているが、一部の企業は...

アリババ国際ステーションのSEO分析

今日は日曜日なので、少し時間を取ってアリババ国際駅のSEOを分析した記事を書きます。この記事はA5で...