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

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

  [[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 教育会社はどこでしょうか?米国、中国、欧州、イスラエルが先頭を走る

ブログ    
ブログ    
ブログ    

推薦する

消費財の画像認識:無人店舗を支える商品認識技術

[[208848]]人工知能は世界を席巻しており、AIの重要な分野の1つであるコンピュータービジョン...

...

顔認識システムはすごいですね!チケット転売業者が体調を崩して入院、警戒を呼び起こす

最近、北京同仁病院の警報システムが作動し、職員は北京天壇病院で活動していたチケット転売業者が北京同仁...

...

...

AIでAIを守る、次世代のAIベースのサイバー脅威ソリューション

多くの関係者は、AI が「悪」の力にもなり得るという事実を受け入れ始めています。関連する海外メディア...

2019年の中国の人工知能産業の現状と今後の動向

[[264806]]新たな産業変革の中核的な原動力であり、将来の発展に関わる戦略的技術として、国は人...

...

人工知能が他に何ができるか知りたいですか?明確な「ベイジアン意識」を持たなければならない

私たちとの会話の中で、多くの読者が、人工知能が予想外の多くのことを実行できることに驚いたと述べていま...

テクノロジーが建設業界に及ぼす8つの影響

人工知能 (AI): ChatGPT などのツールの最近の登場により、AI はビルダーの間で注目を集...

...

生成型 AI がソフトウェア開発を変える 10 の方法

翻訳者 |陳俊レビュー | Chonglou 1990 年代にソフトウェア プログラミングについて話...

よく使われる 3 つの C# ソート アルゴリズム

C# アルゴリズムは、C# 言語学習の重要な部分です。C# ソート アルゴリズムは、言語の基礎とデー...

AI はどのようにして既存の人間の偏見を強化するのでしょうか?

定義上、人工知能 (AI) は人間の脳の働きを模倣して組織活動を最適化することを目的としています。 ...