一般的な負荷分散アルゴリズムをいくつ知っていますか?

一般的な負荷分散アルゴリズムをいくつ知っていますか?

  [[275226]]

コールドスタンバイとホットスタンバイ

  • コールドスタンバイとは、通常は稼働していない予備の機器を使用することを指します。稼働中の機器に障害が発生した場合、予備の機器を使用して交換します。
  • ホットスタンバイとは、デバイスが稼働している間にスタンバイデバイスを稼働させることを意味します。稼働中のデバイスに障害が発生した場合、スタンバイデバイスは自動的に置き換えられます。

フェイルオーバーとフェイルバック

  • フェイルオーバーとは、予備設備において、稼働中の機器を停止し、予備設備を使用して作業するプロセスを交換と呼び、英語ではフェイルオーバーまたはスイッチオーバーと呼ばれます。
  • フェイルバックとは、交換後に元の稼働中のデバイスに復元するプロセス、つまり稼働中のバックアップ デバイスから元の稼働中のデバイスに切り替えるプロセスのことで、英語ではフェイルバックまたはスイッチバックとも呼ばれます。

冗長性タイプ

1. アクティブ・スタンバイ

ルーターを 2 台用意し、そのうち 1 台は通常業務を遂行するアクティブ デバイス (マスター デバイスまたはプライマリ デバイスとも呼ばれます) にします。もう一方のデバイスは、障害が発生した場合に交換するスタンバイ デバイスとして機能します。バックアップ デバイス、スレーブ デバイス、セカンダリ デバイスとも呼ばれます。アクティブ デバイスとスタンバイ デバイスは、デバイスに関するセットアップ情報を共有する必要があります。

2. アクティブ-アクティブ

ルーターを 2 台用意し、1 台をプライマリ デバイス、もう 1 台をセカンダリ デバイスとして同時に実行して冗長構造を形成します。この方法は、負荷分散デバイスと組み合わせて使用​​したり、クライアント側で DNS やルーティング情報を設定したりすることで、負荷分散の目的を達成できます。

3. クラスター

アクティブスタンバイモードまたはアクティブアクティブモードでは、3 つ以上のハードウェアユニットを使用して冗長構造を形成します。

負荷分散とは

負荷分散(英語名は Load Balance)とは、複数のサーバーを対称的に構成したサーバーセットを指します。各サーバーは同等のステータスを持ち、他のサーバーの支援なしに独立して外部にサービスを提供できます。何らかの負荷分散技術により、外部から送信されたリクエストは対称構造のサーバーに均等に分散され、リクエストを受信したサーバーはクライアントのリクエストに独立して応答します。ロード バランシングにより、クライアント要求をサーバー アレイに均等に分散できるため、重要なデータへの高速アクセスが可能になり、大量の同時アクセス サービスの問題が解決されます。このクラスター テクノロジにより、最小限の投資でメインフレームに近いパフォーマンスを実現できます。

負荷分散アルゴリズムは、サービス ガバナンスや分散キャッシュなど、さまざまな場所で使用されています。この記事では、主にいくつかの一般的な負荷分散アルゴリズムを紹介します。

1. 投票方法

ポーリング方式は理解しやすいです。リクエストを順番にサーバーに分散します。各バックエンド サーバーを均等に扱い、接続数やサーバーの負荷を気にしません。次のコードはこのアルゴリズムを示しています。

  1. パブリッククラスBalanceServer{
  2. 公共 静的リスト<String> サーバー =
  3. Arrays.asList( "192.168.0.1" , "192.168.0.2" , "192.168.0.3" , "192.168.0.4" ,
  4. "192.168.0.5" );
  5. 公共 静的 整数位置 = 0;
  6. 公共 静的文字列getServer() {
  7. 文字列サーバー = null ;
  8. if (pos >= servers.size ()) {
  9. 位置 = 0;
  10. }
  11. サーバー = servers.get(pos);
  12. 位置++;
  13. サーバーを返す
  14. }
  15. 公共 静的void main(String[] args) {
  16. ( int i=0;i<10;i++)の場合{
  17. System.out.println (BalanceServer.getServer()) ;
  18. }
  19. }
  20. }

ポーリング戦略の目的は、リクエストの絶対的なバランスを確保することですが、実際にはサーバーがまったく同じではない場合があり、その結果、一部の高性能サーバーがリソースを十分に活用できない可能性があります。

2. ランダム法

システムのランダム機能により、バックエンド サーバー リストのサイズに応じて、バックエンド サーバーの 1 つがランダムに取得され、アクセスされます。呼び出し回数が増えるにつれて、実際の効果は各サーバーに均等に分散されることに徐々に近づいていきます。ポーリングの効果と同様に、コードは次のようになります。

  1. パブリッククラスBalanceServer{
  2. 公共 静的リスト<String> サーバー = Arrays.asList( "192.168.0.1" , "192.168.0.2" , "192.168.0.3" , "192.168.0.4" ,
  3. "192.168.0.5" );
  4. 公共 静的 整数位置 = 0;
  5. 公共 静的文字列getServer() {
  6. 文字列サーバー = null ;
  7. ランダム random = new Random();
  8. int randomPos = random.nextInt ( servers.size ());
  9. サーバー = servers.get(randomPos);
  10. サーバーを返す
  11. }
  12. }

ポーリング アルゴリズムと比較すると、同時実行シナリオではポーリングにロックが必要であり、ランダム メソッドの方がパフォーマンスが優れています。

3. 送信元アドレスハッシュ方式

ソースアドレスハッシュ方式の考え方は、クライアントがアクセスした IP アドレスを取得し、ハッシュ関数を通じてハッシュ値を計算し、そのハッシュ値を使用してサーバーリストのサイズに対してモジュロ演算を実行することです。得られた値は、アクセスするサーバーのシリアル番号です。コードは次のとおりです。

  1. パブリッククラスBalanceServer{
  2. 公共 静的リスト<String> サーバー = Arrays.asList( "192.168.0.1" , "192.168.0.2" , "192.168.0.3" , "192.168.0.4" ,
  3. "192.168.0.5" );
  4. 公共 静的 整数位置 = 0;
  5. 公共 静的文字列 getServer(文字列 ip) {
  6. 文字列サーバー = null ;
  7. intハッシュコード = ip.hashCode();
  8. pos = ハッシュコード % servers.size ();
  9. サーバー = servers.get(pos);
  10. サーバーを返す
  11. }
  12. }

ハッシュ方式の利点は、サーバー リストが変更されない場合、クライアントがアクセスするサーバーは毎回同じサーバーになることです。この機能を使用すると、ステートフル セッションを実現できます。スティッキー セッションは、追加操作なしで実装できます。

4. 加重ラウンドロビン

前述のように、サーバーによってパフォーマンスが異なるため、一般化することはできません。パフォーマンスが低いサーバーには低い重みを与え、パフォーマンスが高いサーバーには高い重みを与える必要があります。コードは次のとおりです。

  1. パブリッククラスBalanceServer{
  2. 公共 静的Map<String, Integer > serverMap = 新しい HashMap<String, Integer >();
  3. 公共 静的 整数位置 = 0;
  4. 静的{
  5. serverMap.put( "192.168.0.1" , 1);
  6. serverMap.put( "192.168.0.2" , 1);
  7. serverMap.put( "192.168.0.3" , 4);
  8. serverMap.put( "192.168.0.4" , 3);
  9. serverMap.put( "192.168.0.5" , 3);
  10. serverMap.put( "192.168.0.6" , 2);
  11. }
  12. 公共 静的文字列getServer() {
  13. <文字列>を設定します。keySet = serverMap.keySet();
  14. イテレータ<String> it = keySet.iterator();
  15. List<String> サーバー = 新しい ArrayList<String>();
  16. (it.hasNext()) の間 {
  17. 文字列 server = it.next ();
  18. 整数の重み = serverMap.get(server);
  19. ( int i = 0; i < 重み; i++) {
  20. servers.add (サーバー);
  21. }
  22. }
  23. 文字列サーバー = null ;
  24. if (pos >= servers.size ()) {
  25. 位置 = 0;
  26. }
  27. サーバー = servers.get(pos);
  28. 位置++;
  29. サーバーを返す
  30. }
  31. 公共 静的void main(String[] args) {
  32. ( int i=0;i<14;i++)の場合{
  33. System.out.println (BalanceServer.getServer()) ;
  34. }
  35. 35 }
  36. 36}

5. 加重ランダム法

加重ラウンドロビン方式と同様に、加重ランダム方式でも、バックエンド サーバーのさまざまな構成と負荷条件に基づいて異なる重みが構成されます。違いは、順序ではなく重みに基づいてサーバーをランダムに選択することです。重み付けランダム法のコード実装は次のとおりです。

  1. パブリッククラス WeightRandom
  2. {
  3. 公共 静的文字列 getServer()
  4. {
  5. // サーバーの起動と停止による同時実行の問題を回避するためにマップを再構築します
  6. マップ<文字列、整数> serverMap =
  7. 新しい HashMap<String, Integer >();
  8. serverMap.putAll(IpMap.serverWeightMap);
  9. // IPアドレスリストを取得
  10. <文字列>を設定します。keySet = serverMap.keySet();
  11. イテレータ<String> iterator = keySet.iterator();
  12. リスト<文字列> serverList = 新しい ArrayList<文字列>();
  13. (イテレータ.hasNext()) の間
  14. {
  15. 文字列サーバー = iterator.next ();
  16. int重み = serverMap.get(server);
  17. ( int i = 0; i < 重み; i++)の場合
  18. serverList.add (サーバー);
  19. }
  20. java.util.Random ランダム = new java.util.Random();
  21. int randomPos = random.nextInt(serverList.size ( ));
  22. serverList.get(randomPos);を返します
  23. }
  24. }

<<:  1 つの記事で 26 個のニューラル ネットワーク活性化関数 (ReLU から Sinc まで) を紹介します

>>:  世界最高の AI 教育会社はどこでしょうか?米国、中国、欧州、イスラエルが先頭を走る

ブログ    
ブログ    
ブログ    

推薦する

「無人時代」が来ます。準備はできていますか?

DJIのドローン、JDの無人倉庫、アリババの無人スーパー、百度の無人自動車など、数年前からすでに台...

機械学習の4つの異なるカテゴリの概要

[[420892]]学習の実行方法に基づいて、アルゴリズムをさまざまなカテゴリに分類できます。教師あ...

Google の大きな動き!検索結果からAIが生成したスパムをクリーンアップします

3月6日火曜日(米国時間)、Googleは、検索結果に蔓延するAI生成のスパムを排除し、ユーザーが検...

シンプルで使いやすいPythonの顔認識アルゴリズムをいくつかまとめます

こんにちは、みんな。今日は、シンプルで使いやすい顔認識アルゴリズムをいくつかまとめます。顔認識はコン...

IBM Cloud Pak for Data 4.0 で大規模なインテリジェント オートメーションを統合

あなたのビジネスが本当に予測可能かどうか、そしてデータ担当者、モデル、アプリケーションが適切なデータ...

AIoT はセキュリティ業界にどのような影響を与えますか?

進化し続けるテクノロジーの世界における最新のトレンドやイノベーションを追い続ける中で、私たちが注目...

生物学的ニューラルネットワークから人工ニューラルネットワークへ

今日、人工知能について話すとき、私たちは数学モデルを使用してデータからパターンの表現を抽出することで...

ソラを解剖:技術的な詳細を推測するための37ページのリバースエンジニアリング、マイクロソフトも参加、中国チームが制作

ソラは発売後すぐにリバースエンジニアリングによって「解剖」されたのでしょうか? !リーハイ大学とマイ...

Xunlei 創設者 Cheng Hao: 人工知能起業における 6 つの核心課題

編集者注:この記事はWeChatの公開アカウントHaoge Says(ID:haogetalks)か...

...

ApolloとCarSim/TruckSimの共同シミュレーション

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

爆発力で動く昆虫ロボットは、自重の22倍を運ぶことができ、垂直に59cmジャンプできる。

この小さなロボットはエネルギーに溢れています。体は昆虫ほどの大きさですが、自分の体重の22倍の重さの...

2023年の生成AIの包括的なレビュー

2023年には、生成AIが開発者のアプリケーション構築支援において飛躍的な進歩を遂げ、大手ツールベン...

...

顔認識アクセス制御システムが起動した後は、ゲートを簡単に通過する際に潜在的なリスクにも注意する必要があります。

かつて、伝統的な入退室管理システムとして、アクセス制御システムは、通常、カードのスワイプとパスワード...