負荷等化の基本アルゴリズム

10549 ワード

負荷等化の基本アルゴリズムは、主に以下のいくつか(参考F 5製品)がある.
  • ランダム:負荷等化方法ランダムに各利用可能なサーバに負荷を割り当て、乱数生成アルゴリズムにより1つのサーバを選択し、接続を送信する.多くの均衡製品がこのアルゴリズムをサポートしていますが、サーバの実行可能時間を重視しない限り、その有効性は疑問視されています.
  • ポーリング:ポーリングアルゴリズムは、新しい接続要求ごとに次のサーバに順次割り当てられ、最終的にはすべての要求をすべてのサーバに分割します.ポーリングアルゴリズムは多くの場合よく動作しますが、負荷が均等なデバイスが処理速度、接続速度、メモリなどの面で完全に均等でなければ、より効果的です.
  • 重み付けポーリング:このアルゴリズムでは、各マシンが受信する接続数は、重みの割合で割り当てられます.これは、通常のポーリングアルゴリズムの改良です.例えば、3台目のマシンの処理能力が1台目のマシンの2倍であると、負荷イコライザは2倍の接続数を3台目のマシンに割り当てることができます.
  • 動的ポーリング:重み付けポーリングと同様ですが、重み値は各サーバの継続的な監視に基づいて更新されます.これは、各ノードの現在の接続数やノードの最も速い応答時間など、サーバのリアルタイムパフォーマンス分析に基づいて接続を割り当てる動的負荷等化アルゴリズムです.
  • 最速アルゴリズム:最速アルゴリズムは、すべてのサーバの最速応答時間に基づいて接続を割り当てます.このアルゴリズムは、サーバが異なるネットワークにまたがる環境で特に有用である.
  • 最小接続:システムは、現在の接続数が最も少ないサーバに新しい接続を割り当てます.このアルゴリズムは,各サーバの演算能力がほぼ類似している環境で非常に有効である.
  • 観察アルゴリズム:このアルゴリズムは、最小接続アルゴリズムと最速アルゴリズムを同時に利用して負荷等化を実施する.サーバは、現在の接続数と応答時間に基づいてスコアを取得します.スコアが高いと、パフォーマンスが向上し、より多くの接続が得られます.
  • 予判アルゴリズム:このアルゴリズムは観察アルゴリズムを使用してスコアを計算するが、予判アルゴリズムはスコアの変化傾向を分析して、あるサーバの性能が改善されているか低下しているかを判断する.改善傾向のあるサーバは、より多くの接続を得ることができます.このアルゴリズムはほとんどの環境に適用されます.

  • 性能調整コミュニティdynatraceはそのブログの中で取引先の実例を分かち合い、電子商取引サイトは休日の客流のピーク期間中に数回崩壊し、SQLの最適化と負荷均衡アルゴリズムの調整を経て関連問題を解決した.まず、実行が最も遅いデータベース文を分析し、インデックスの追加などのパフォーマンス最適化を行います.ピーク時のニーズを満たすために接続プールのサイズも最適化されています.そして、企業はロードイコライザのアルゴリズムをRound-RobinからLeast-Busyに変更した.
    関連記事:
    電子商取引サイトのダウンタイム事例分析
    ASP.NET Session State Partitioning
    ASP.NET Session State Partitioning using State Server Load Balancing
    解析nginx負荷等化
    Round Robin Scheduling
     
    using System;
    
    using System.Collections.Generic;
    
    using System.Linq;
    
    using System.Runtime.CompilerServices;
    
    using System.Text;
    
    
    
    namespace LoadBalancer
    
    {
    
        public class LoadBalance
    
        {
    
            /// <summary>
    
            ///    
    
            /// </summary>
    
            private static readonly object locker = new object();
    
    
    
            /// <summary>
    
            ///        
    
            /// </summary>
    
            private static List<int> weightList = new List<int>();
    
    
    
            /// <summary>
    
            ///     
    
            /// </summary>
    
            private static int currentIndex;
    
    
    
            /// <summary>
    
            ///     
    
            /// </summary>
    
            private static int currentWeight;
    
    
    
            private static int maxWeight;
    
    
    
            /// <summary>
    
            ///      
    
            /// </summary>
    
            private static int gcd;
    
    
    
            static LoadBalance()
    
            {
    
                currentIndex = -1;
    
                currentWeight = 0;
    
    
    
                //         ,     
    
                weightList = GetWeightList();
    
                maxWeight = GetMaxWeight(weightList);
    
                gcd = GetMaxGCD(weightList);
    
            }
    
    
    
            private static List<int> GetWeightList()
    
            {
    
                List<int> list = new List<int>();
    
                list.Add(3);
    
                list.Add(1);
    
                list.Add(1);
    
                list.Add(4);
    
                list.Add(1);
    
                list.Add(7);
    
    
    
                return list;
    
            }
    
    
    
            [MethodImpl(MethodImplOptions.Synchronized)]
    
            public static int Start()
    
            {
    
                lock (locker)
    
                {
    
                    int? iWeight = RoundRobin();
    
                    if (iWeight != null)
    
                    {
    
                        return (int)iWeight;
    
                    }
    
                    return weightList[0];
    
                }
    
            }
    
    
    
    
    
            /// <summary>
    
            ///        
    
            /// </summary>
    
            /// <param name="list">    int  </param>
    
            /// <returns>              </returns>
    
            private static int GetMaxGCD(List<int> list)
    
            {
    
                list.Sort(new WeightCompare());
    
    
    
                int iMinWeight = weightList[0];
    
    
    
                int gcd = 1;
    
    
    
                for (int i = 1; i < iMinWeight; i++)
    
                {
    
                    bool isFound = true;
    
                    foreach (int iWeight in list)
    
                    {
    
                        if (iWeight % i != 0)
    
                        {
    
                            isFound = false;
    
                            break;
    
                        }
    
                    }
    
                    if (isFound) gcd = i;
    
                }
    
                return gcd;
    
            }
    
    
    
    
    
            /// <summary>
    
            ///                
    
            /// </summary>
    
            /// <param name="list"></param>
    
            /// <returns></returns>
    
            private static int GetMaxWeight(List<int> list)
    
            {
    
                int iMaxWeight = 0;
    
                foreach (int i in list)
    
                {
    
                    if (iMaxWeight < i) iMaxWeight = i;
    
                }
    
                return iMaxWeight;
    
            }
    
    
    
            private static int? RoundRobin()
    
            {
    
                while (true)
    
                {
    
                    currentIndex = (currentIndex + 1) % weightList.Count;
    
                    if (0 == currentIndex)
    
                    {
    
                        currentWeight = currentWeight - gcd;
    
                        if (0 >= currentWeight)
    
                        {
    
                            currentWeight = maxWeight;
    
                            if (currentWeight == 0) return null;
    
                        }
    
                    }
    
    
    
                    if (weightList[currentIndex] >= currentWeight)
    
                    {
    
                        return weightList[currentIndex];
    
                    }
    
                }
    
            }
    
    
    
        }
    
    
    
        public class WeightCompare : IComparer<int>
    
        {
    
            public int Compare(int x, int y)
    
            {
    
                return x - y;
    
            }
    
        }
    
    
    
    }

    <!--
    .csharpcode, .csharpcode pre
    {
    font-size: small;
    color: black;
    font-family: consolas, "Courier New", courier, monospace;
    background-color: #ffffff;
    /*white-space: pre;*/
    }
    .csharpcode pre { margin: 0em; }
    .csharpcode .rem { color: #008000; }
    .csharpcode .kwrd { color: #0000ff; }
    .csharpcode .str { color: #006080; }
    .csharpcode .op { color: #0000c0; }
    .csharpcode .preproc { color: #cc6633; }
    .csharpcode .asp { background-color: #ffff00; }
    .csharpcode .html { color: #800000; }
    .csharpcode .attr { color: #ff0000; }
    .csharpcode .alt
    {
    background-color: #f4f4f4;
    width: 100%;
    margin: 0em;
    }
    .csharpcode .lnum { color: #606060; }
    -->