この記事では、主にコンシステント ハッシュ アルゴリズムの原理とデータ スキューの問題について説明し、次にデータ スキューの問題を解決する方法を紹介し、最後に Dubbo でのコンシステント ハッシュ アルゴリズムの使用を分析します。この記事を通じて、コンシステント ハッシュ アルゴリズムの原理と、このアルゴリズムの問題点と解決策を理解することができます。 1. 負荷分散以下はダボ公式サイトからの引用です: LoadBalance は中国語で負荷分散を意味します。その役割は、ネットワーク要求やその他の形式の負荷を異なるマシンに「均等に分散」することです。クラスター内の一部のサーバーが過負荷になり、他のサーバーがアイドル状態になる状況を回避します。負荷分散により、各サーバーは自身の処理能力に適した負荷を得ることができます。トラフィックを高負荷サーバーに転送しながら、リソースの無駄も回避できるので、一石二鳥です。負荷分散は、ソフトウェア負荷分散とハードウェア負荷分散に分けられます。日常の開発では、ハードウェアの負荷分散に触れることは一般的に困難です。ただし、Nginx などのソフトウェア負荷分散は引き続き利用可能です。 Dubbo には、負荷分散の概念とそれに応じた実装もあります。 Dubbo は、いくつかのサービス プロバイダーに過負荷がかかるのを避けるために、サービス コンシューマーの呼び出し要求を分散する必要があります。サービス プロバイダーが過負荷状態になっているため、一部の要求がタイムアウトする可能性があります。そのため、各サービスプロバイダーへの負荷を分散させる必要があります。 Dubbo は、重み付けランダム アルゴリズムに基づく RandomLoadBalance、最もアクティブでない呼び出し番号アルゴリズムに基づく LeastActiveLoadBalance、ハッシュ一貫性に基づく ConsistentHashLoadBalance、および重み付けポーリング アルゴリズムに基づく RoundRobinLoadBalance の 4 つの負荷分散実装を提供します。これらの負荷分散アルゴリズムのコードはそれほど長くはありませんが、理解するのは簡単ではありません。これらのアルゴリズムの原理をある程度理解している必要があります。 2. ハッシュアルゴリズム図1 ハッシュアルゴリズムを使用しないリクエスト 上記のように、サーバー 0、1、2 のすべてがユーザー情報を保存していると仮定すると、特定のユーザー情報を取得する必要がある場合、ユーザー情報がどのサーバーに保存されているかわからないため、サーバー 0、1、2 を個別に照会する必要があります。この方法でデータを取得する効率は極めて低いです。 このようなシナリオでは、ハッシュ アルゴリズムを導入できます。 図2 ハッシュアルゴリズム導入後のリクエスト 上記のシナリオと同じですが、前提として、各サーバーは特定のハッシュ アルゴリズムに従ってユーザー情報を保存します。したがって、ユーザー情報を取得するときは、同じハッシュアルゴリズムを使用するだけです。 ユーザー番号 100 のユーザー情報を照会するとします。特定のハッシュ アルゴリズム (ここでは userId mod n、つまり 100 mod 3) を実行すると、結果は 1 になります。したがって、ユーザー番号 100 からのリクエストは、最終的にサーバー番号 1 によって受信され、処理されます。 これにより、無効なクエリの問題が解決されます。 しかし、そのような計画はどのような問題をもたらすのでしょうか? 容量を拡張または縮小すると、大量のデータが移行されます。少なくとも 50% のデータが影響を受けます。 図3 サーバーの追加 問題を説明するために、サーバー 3 を追加します。サーバーの数 n が 3 から 4 に増加します。ユーザー番号100のユーザー情報を照会すると、100 mod 4の結果は0になります。このとき、リクエストはサーバー 0 によって受信されます。
そのため、サーバーの台数が増減すると、必然的に大量のデータ移行が必要になります。 上記のハッシュ アルゴリズムの利点は、シンプルで使いやすいことであり、ほとんどのデータベースおよびテーブル シャーディング ルールはこのアプローチを採用しています。通常、パーティションの数はデータの量に基づいて事前に見積もられます。 デメリットは、ノードの拡張や縮小によりノード数が変わると、ノードのマッピング関係を再計算する必要があり、データの移行が発生することです。したがって、容量を拡張する場合、すべてのデータ マッピングが中断され、完全な移行が発生しないように、通常は容量を 2 倍にします。この方法では、データの 50% のみが移行されます。 3. 一貫性ハッシュアルゴリズム** コンシステント ハッシュ アルゴリズムは、1997 年にマサチューセッツ工科大学の Karger 氏とその協力者によって提案されました。このアルゴリズムは、もともと大規模なキャッシュ システムの負荷分散に使用されていました。 ** 動作プロセスは次のとおりです。まず、IP またはその他の情報に基づいてキャッシュ ノードのハッシュが生成され、そのハッシュが [0, 232 - 1] リングに投影されます。クエリまたは書き込み要求があると、キャッシュ項目のキーに対してハッシュ値が生成されます。次に、ハッシュ値以上の最初のキャッシュ ノードを見つけ、このノードにキャッシュ アイテムを照会または書き込みます。現在のノードがダウンしている場合は、次にキャッシュをクエリまたは書き込むときに、キャッシュ項目のハッシュ値よりも大きい別のキャッシュ ノードを見つけることができます。一般的な効果は下の図に示されており、各キャッシュ ノードがリング上の位置を占めています。キャッシュ アイテムのキーのハッシュ値がキャッシュ ノードのハッシュ値より小さい場合、キャッシュ アイテムはキャッシュ ノードに保存されるか、キャッシュ ノードから読み取られます。たとえば、下の緑色の点に対応するキャッシュ項目は、cache-2 ノードに保存されます。 cache-3 がダウンしているため、そのノードに保存されるはずだったキャッシュ項目は、最終的に cache-4 ノードに保存されることになります。 図4 一貫性ハッシュアルゴリズム 一貫性ハッシュ アルゴリズムでは、ノードの追加またはノードのシャットダウンのいずれの場合でも、影響を受ける間隔は、サーバーの追加またはシャットダウン時にハッシュ リング空間で反時計回り方向に最初に検出されたサーバー間の間隔のみであり、他の間隔は影響を受けません。 しかし、一貫性のあるハッシュにも問題があります。 図5 データの偏り この分散は、ノード数が少なく、サービス A がほとんどのリクエストを処理する場合に発生する可能性があります。この状況はデータスキューと呼ばれます。 では、データの偏りの問題をどのように解決すればよいのでしょうか? 仮想ノードに参加します。 まず、サーバーは必要に応じて複数の仮想ノードを持つことができます。サーバーに n 個の仮想ノードがあると仮定します。次にハッシュ値を計算するときは、IP + ポート + 番号の形式を使用してハッシュ値を計算できます。数字は0からnまでです。 IP + ポートは同じなので、これらの n 個のノードはすべて同じマシンを指します。 図6: 仮想ノードの紹介 仮想ノードを追加する前は、サーバー A がリクエストの大部分を処理していました。しかし、各サーバーに仮想ノード (A-1、B-1、C-1) があり、ハッシュ計算後に上図に示す位置になるものとします。すると、サーバAが負担したリクエストは、ある程度仮想ノードB-1とC-1に分散され(図の五芒星でマークされた部分)、実際にサーバBとCに分散されます。 一貫性ハッシュ アルゴリズムでは、仮想ノードを追加することでデータの偏りの問題を解決できます。 4. DUBBOにおけるコンシステントハッシュの応用図7. Dubboの一貫性のあるハッシュリング ここで、同じ色のノードは、Invoker1-1、Invoker1-2、...、Invoker1-160 など、同じサービス プロバイダーに属します。この目的は、仮想ノードを導入してリング上の Invoker を分散し、データの偏りの問題を回避することです。いわゆるデータスキューとは、ノードの分散が不十分なために多数のリクエストが同じノードに集中し、他のノードは少数のリクエストしか受信しない状況を指します。例えば: 図8 データスキュー問題 上記のように、リング上の Invoker-1 と Invoker-2 の分散が不均一なため、システム内の要求の 75% が Invoker-1 に送られ、要求の 25% のみが Invoker-2 に送られます。この問題の解決策は、仮想ノードを導入し、それを使用して各ノードの要求のバランスを取ることです。 ここまでで背景知識は普及したので、次はソースコードの解析に入っていきます。次のように、ConsistentHashLoadBalance の doSelect メソッドから始めましょう。 前述のように、doSelect メソッドは主に、呼び出し元リストが変更されたかどうかを検出したり、ConsistentHashSelector を作成したりするなどの予備作業を実行します。これらのタスクが完了すると、ConsistentHashSelector の select メソッドが呼び出され、負荷分散ロジックが実行されます。 select メソッドを分析する前に、一貫性のあるハッシュ セレクター ConsistentHashSelector の初期化プロセスを次のように見てみましょう。 ConsistentHashSelector のコンストラクターは、設定から仮想ノードの数やハッシュ計算に関係するパラメーターの添え字を取得するなど、一連の初期化ロジックを実行します。デフォルトでは、最初のパラメーターのみがハッシュに使用されます。 ConsistentHashLoadBalance の負荷分散ロジックはパラメータ値によってのみ影響を受け、同じパラメータ値を持つリクエストは同じサービス プロバイダーに割り当てられることに注意してください。 ConsistentHashLoadBalance は重みを考慮しないので、使用時には注意が必要です。 仮想ノードの数とパラメータインデックス構成を取得したら、次に仮想ノードのハッシュ値を計算して、仮想ノードを TreeMap に格納します。この時点で、ConsistentHashSelector の初期化は完了です。次に、select メソッドのロジックを見てみましょう。 前述のように、選択プロセスは比較的簡単です。まず、パラメータに対して md5 およびハッシュ操作を実行してハッシュ値を取得します。次に、この値を取得して、TreeMap でターゲット Invoker を検索します。 これで ConsistentHashLoadBalance の分析は終了です。 ConsistentHashLoadBalance のソース コードを読む前に、まず背景知識を補足することをお勧めします。そうしないと、コード ロジックを理解するのが非常に難しくなります。 5. 応用シナリオ
|
>>: 任意のデータセットに基づいて LLM (大規模言語モデル) ロボットを作成する
文 | 李水清5月25日のZhidongxiの報道によると、Huawei Machine Visio...
進化し続けるテクノロジーの世界において、OM5 光ファイバー ケーブルは革新的なソリューションとして...
この研究では、スタンフォード ビジョン アンド ラーニング ラボ (SVL) の Silvio/Fe...
「分野が違えば意味も違う」とよく言われます。機械学習コミュニティは部外者から見るとどのように見えるの...
ルイス・ペレス・ブレバは、マサチューセッツ工科大学 (MIT) の教授であり、MIT エンジニアリン...
Google を含む多くの企業が、人間の寿命を延ばす方法を研究しています。たとえ何百年も長く生きられ...
COVID-19 パンデミックにより、顧客および従業員エクスペリエンスのデジタル化に対する企業の投資...
[[374766]]米フォーチュン誌のウェブサイトは1月1日、「なぜ『ソフトロボット』はNASAや...
協調フィルタリング協調フィルタリング (CF) とそのバリエーションは、最も一般的に使用される推奨ア...