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

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

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

ブログ    
ブログ    
ブログ    

推薦する

AI危機の前に、この3つの資質を備えた子供たちが将来勝利するだろう

[[234521]]文|ハオ・ジンファンSF作家第74回ヒューゴー賞受賞者公式アカウント「小唐科学子...

畳み込みニューラルネットワークは「グラフ」構造化データを処理できないのですか?この記事でその答えが分かります

この記事で紹介する論文は、ICML2016でのグラフへのCNNの応用に関する論文です。 ICML は...

データ、アルゴリズム、処理は人工知能にとって不可欠である

[[276859]]人工知能プロジェクトにおいて、最も重要なのはデータ、アルゴリズム、プロセスのうち...

人工知能とモノのインターネット:スマートシティの交通管理

今日のスマート シティは、都市部を再形成する高度なテクノロジーによって推進されています。人工知能とモ...

AI導入時に解決すべき無線ネットワークの運用・保守における4つの大きな課題

無線通信ネットワークの発展に伴い、今後のネットワークは周波数帯域やネットワーク構成の面でより複雑化し...

量子化学計算と機械学習に基づいて、肉眼で検出可能な蛍光分子をゼロから作成する

蛍光分子を設計するには、分子の光吸収など、分子構造に直接関連するものだけでなく、相互に関連する複数の...

6つの権威あるリストを制覇したDAMOアカデミー独自の深層言語モデルシステムAliceMindはオープンソースです

[[406821]]自然言語処理 (NLP) は、AI の最高傑作として知られています。従来の NL...

Facebook が人工知能を活用する 6 つの方法 (予想外のものもいくつかある)

[51CTO.com クイック翻訳] Facebook は人工知能を使用してポルノを識別し、マーク...

...

IoTがAIの可能性をどう活用できるか

過去 10 年間、モノのインターネットはビジネスの世界で着実に導入されてきました。企業はすでに Io...

...

Photoshop 2020が登場、人工知能でデザインが簡単に

Photoshop Elements 2020エディション数日前、Adobe は最新バージョンの ...

人工知能が自立して考えることができるようになると、機械生命体になるのでしょうか?必ずしも

人類が人工知能の時代に突入したことは否定できません。人工知能技術が急速に発展するにつれ、私たちの周り...

量子コンピューティングは今後10年間で物流業界を変えるだろう

近年、サプライチェーンおよび物流業界は、労働力不足から予測不可能な天候、需給の変化まで、ますます多く...