負荷分散アルゴリズムを理解していますか?

負荷分散アルゴリズムを理解していますか?

[[286998]]

負荷分散アルゴリズムには、ポーリング、ランダム、最小接続の 3 つがあります。ただし、他の負荷分散アルゴリズムもあるため、それらも調べる必要があります。さらに、面接中にそれらについて質問される可能性が高くなります。

高性能なクラスターを実現するには、適切なロード バランサーを選択することが重要です。また、さまざまなビジネス シナリオに適したロード バランシング アルゴリズムを選択することも非常に重要です。これまでにいくつかのアルゴリズムを挙げてきました。次に、残りのアルゴリズムについて説明しましょう。

1. 送信元アドレスハッシュアルゴリズム

これは戦略を失わない唯一のアルゴリズムですが、負荷分散はソース データ情報とハッシュ アルゴリズムに大きく関係します。

ソース アドレス ハッシュ方式の考え方は、クライアントを要求しているサービス コンシューマーの IP アドレスに基づいてハッシュ関数を介してハッシュ値を取得し、このハッシュ値とサーバー リストのサイズに対してモジュロ演算を実行することです。結果は、アクセスするサーバー アドレスのシリアル番号になります。送信元アドレス ハッシュ方式は、負荷分散に使用されます。同じ IP クライアントのサーバー リストが変更されていない場合は、同じバックエンド サーバーにマップされてアクセスされます。

前回の操作の疑似コード:

  1. プライベート静的Map<String, Integer > serviceWeightMap = new HashMap<String, Integer >();
  2.  
  3. 静的{
  4. serviceWeightMap.put( "192.168.1.100" , 1);
  5. serviceWeightMap.put( "192.168.1.101" , 1);
  6. serviceWeightMap.put( "192.168.1.102" , 4);
  7. serviceWeightMap.put( "192.168.1.103" , 1);
  8. }
  9.  
  10. 公共 静的文字列testConsumerHash(文字列remoteIp) {
  11.  
  12. Map<String, Integer > serverMap = new HashMap<String, Integer >();
  13. serverMap.putAll(サービス重みマップ);
  14.  
  15. //IPアドレスリストを取得
  16. <文字列>を設定します。keySet = serverMap.keySet();
  17. ArrayList<String> keyList = 新しいArrayList<String>();
  18. キーリストにすべてを追加します(キーセット)。
  19.  
  20. intハッシュコード = remoteIp.hashCode();
  21. int pos = ハッシュコード % keyList.size ( ) ;
  22.  
  23. keyList.get(pos);を返します
  24. }

このコードは Will.Shun によって書かれています。最初見たときは意味がよくわかりませんでした。後で調べてみると、説明と非常によく似ていることがわかりました。ハッシュ値はハッシュ関数によって計算されます。ハッシュ値はサーバーリストのサイズを法として計算され、結果はアクセスするサーバーアドレスのシリアル番号になります。

2. 加重ラウンドロビンアルゴリズム

重み付けラウンドロビンアルゴリズムを見てみましょう。まず、Nginx の重み設定を見てみましょう。

  1. http {
  2. 上流クラスター
  3. サーバーaの重み=1;
  4. サーバーbの重み=2;
  5. サーバーc 重み=3;
  6. }

Nginx が 6 つのクライアント要求を受信した場合、そのうち 1 つをバックエンド a に、2 つをバックエンド b に、3 つをバックエンド c に転送します。

重み付けポーリング アルゴリズムの結果は、サーバー シーケンスを生成することです。リクエストが届くたびに、次のサーバーがシーケンスから取り出され、リクエストが処理されます。

加重ラウンドロビンアルゴリズムの疑似コード:

  1. プライベート静的Map<String, Integer > serviceWeightMap = new HashMap<String, Integer >();
  2.  
  3. 静的{
  4. serviceWeightMap.put( "192.168.1.100" , 1);
  5. serviceWeightMap.put( "192.168.1.101" , 1);
  6. serviceWeightMap.put( "192.168.1.102" , 4);
  7. serviceWeightMap.put( "192.168.1.103" , 1);
  8. }
  9.  
  10.  
  11. 公共 静的文字列testWeightRoundRobin() {
  12.  
  13. // サーバーのオンラインとオフラインによって発生する同時実行の問題を回避するためにマップを再作成します
  14. Map<String, Integer > serverMap = new HashMap<String, Integer >();
  15. serverMap.putAll(サービス重みマップ);
  16.  
  17. //IPアドレスリストを取得
  18. <文字列>を設定します。keySet = serverMap.keySet();
  19. イテレータ<String> it = keySet.iterator();
  20.  
  21. リスト<文字列> serverList = 新しい ArrayList<文字列>();
  22.  
  23. (it.hasNext()) の間 {
  24. 文字列 server = it.next ();
  25. 整数の重み = serverMap.get(server);
  26. ( int i=0; i<weight; i++)の場合{
  27. serverList.add (サーバー);
  28. }
  29. }
  30.  
  31. 文字列サーバー = null ;
  32.  
  33. 同期(正){
  34. if (pos > serverList.size ()) {
  35. 位置 = 0;
  36. }
  37.  
  38. サーバー = serverList.get(pos);
  39. 位置++;
  40. }
  41.  
  42. サーバーを返す
  43. }

実際、加重ラウンドロビン アルゴリズムには欠陥があります。特定の特別な重みでは、加重ラウンドロビン スケジューリングによって不均一なインスタンス シーケンスが生成されます。この不均一な負荷により、一部のインスタンスに瞬間的に高い負荷がかかり、システム ダウンタイムが発生するリスクがあります。このスケジューリングの欠点を解決するために、滑らかな重み付けラウンドロビン スケジューリングがあります。興味のある学生は、この滑らかな重み付けラウンドロビン スケジューリングを調べてみてください。

3. 重み付きランダムアルゴリズム

加重ランダム方式は、加重ポーリング方式に似ています。バックグラウンド サーバーのさまざまな構成と負荷条件に応じて、異なる重みが構成されます。違いは、順序ではなく重みに基づいてサーバーをランダムに選択することです。

  1. プライベート静的Map<String, Integer > serviceWeightMap = new HashMap<String, Integer >();
  2.  
  3. 静的{
  4. serviceWeightMap.put( "192.168.1.100" , 1);
  5. serviceWeightMap.put( "192.168.1.101" , 1);
  6. serviceWeightMap.put( "192.168.1.102" , 4);
  7. serviceWeightMap.put( "192.168.1.103" , 1);
  8. }
  9.  
  10. 公共 静的文字列testWeightRandom() {
  11. // サーバーのオンラインとオフラインによって発生する同時実行の問題を回避するためにマップを再作成します
  12. Map<String, Integer > serverMap = new HashMap<String, Integer >();
  13. serverMap.putAll(サービス重みマップ);
  14.  
  15. //IPアドレスリストを取得
  16. <文字列>を設定します。keySet = serverMap.keySet();
  17. リスト<文字列> serverList = 新しい ArrayList<文字列>();
  18. イテレータ<String> it = keySet.iterator();
  19.  
  20. (it.hasNext()) の間 {
  21. 文字列 server = it.next ();
  22. 整数の重み = serverMap.get(server);
  23. ( int i=0; i<weight; i++)の場合{
  24. serverList.add (サーバー);
  25. }
  26. }
  27.  
  28. ランダム random = new Random();
  29. int randomPos = random.nextInt(serverList.size ( ));
  30.  
  31. 文字列サーバー = serverList.get(randomPos);
  32.  
  33. サーバーを返す
  34. }

ここでの違いは、サーバーがランダムアルゴリズムを通じて取得されることです。

実際、次のような例を考えることができます。たとえば、次のシナリオでは、セット S があり、その中に 4 つの項目 A、B、C、D が含まれています。このとき、その中からランダムに 1 つのアイテムを選択したいのですが、抽選の確率が異なります。たとえば、A を引く確率は 50%、B と C を引く確率は 20%、D を引く確率は 10% であるとします。一般的に言えば、各項目に重みを付けることができ、抽出の確率はこの重みに比例します。

4. HTTP 国際化

HTTP メッセージは、画像、ムービー、またはあらゆる種類のメディアを伝送できるのと同様に、任意の言語のコンテンツを伝送できます。 HTTP にとって、エンティティ本体は単なるバイナリ情報のコンテナです。

国際的なコンテンツをサポートするには、サーバーは各ドキュメントのアルファベットと言語をクライアントに伝え、クライアントがドキュメント内の情報を正しく文字に展開してユーザーにコンテンツを提示できるようにする必要があります。

サーバーは、HTTP プロトコルの Content-Type ヘッダーと Content-Language ヘッダーの charset パラメータを通じて、ドキュメントのアルファベットと言語をクライアントに通知します。これらのヘッダーは、エンティティ本体の「情報ボックス」の内容、画面に表示するためにコンテンツを適切な文字に変換する方法、およびその中の単語が表す言語について説明します。

同時に、クライアントは、ユーザーが理解できる言語と、ブラウザにインストールされているアルファベットエンコードアルゴリズムをサーバーに伝える必要があります。クライアントは Accept-Charset ヘッダーと Accept-Language ヘッダーを送信して、サーバーが理解できる文字セット エンコーディング アルゴリズムと言語、およびそれらの優先順位をサーバーに伝えます。

<<:  アンドリュー・ン氏のチームが2019年のAIトレンドを振り返る:自動運転は寒い冬を迎え、ディープフェイクはモンスターとなった

>>:  「手を自由にする」は夢ではありません! AI がソフトウェア テストの未来を形作る 5 つの方法...

ブログ    
ブログ    
ブログ    

推薦する

アプリケーションの利点はたくさんあります!チャットボットは経済の活性化に貢献する

時代の変化に伴い、インテリジェント技術の発展は新たな傾向を示し、人工知能などの技術はますます注目を集...

...

AIは、DevOps開発者が新世代のランサムウェアに対抗するために不可欠である

Android オペレーティング システムを含むすべての主要なオペレーティング システムにおいて、人...

データセットには独自の世界観がありますか?いいえ、それは実際には人々の世界観です。

この記事はLeiphone.comから転載したものです。転載する場合は、Leiphone.com公式...

2021 年のテクノロジートレンドはどこに向かうのでしょうか? IEEEが答えを教えます

[[357471]]このほど、全人類に利益をもたらす科学技術の進歩を促進することに尽力している世界最...

デジタルツインがディープラーニングのデータ格差を埋める

企業がデータを活用するディープラーニング (DL) プロジェクトに着手する場合、そのデータを保護する...

李開復氏、ペントランド氏と会談:AIはワンマンショーではない、AI冷戦は避けるべき

最近、Sinovation Venturesの会長兼CEOであるKai-Fu Lee博士とAlex ...

数時間のビデオを視聴するだけで人間のチャットを真似できますか? Facebookのロボットは表情が豊か

ヒューマノイドロボットの類似性は人間の好感度に比例するわけではありません。 1970年に日本のロボッ...

Googleの上級研究員が解雇される:論文論争の裏側

[51CTO.com クイック翻訳] 12月初旬、Googleは著名なAI倫理研究者のティムニット・...

AIデザイナー「ルバン」のコア技術が明らかに:1秒間に8,000枚のポスターをデザインする方法とは?

[[228895]] AI は囲碁のゲームを変え、今度はポスターのデザインを変えています。アリババ...

大手企業がどのように人工知能を活用し、実践しているのかご覧ください。

人工知能に関しては、人々は複雑な感情を抱くことが多い。映画ファンなら、ウィル・スミスが『アイ、ロボッ...

人工知能とモノのインターネット - 未来の技術の融合

[[388165]]将来は自動化となり、人工知能 (AI) とモノのインターネット (IoT) が融...

...

OpenAIの画像検出ツールが公開され、CTO: AI生成画像の99%を認識可能

OpenAI は AI 画像認識を開始しようとしています。最新のニュースとしては、同社が検出ツールを...