負荷等化アルゴリズムの概要

4128 ワード

登録センターに問い合わせると、サービスの使用可能なノードのリストが得られ、使用可能なノードのリストから起動呼び出しを選択する必要があります.これが負荷等化に使用されます.
2つの要因を考慮する必要がある.1つは、アプリケーションの均一性、すなわち、各ノードにアプリケーションを受信させ、すべてのノードのアプリケーションを発揮させることであり、もう1つは、アプリケーションの性能、すなわち、どのノードが最も応答が速く、どのノードを優先的にアプリケーションするかを考慮することである.

一般的な負荷等化アルゴリズム


ランダムアルゴリズム(擬似ランダム)


ランダムアルゴリズムは,その名の通り,利用可能なサービスノードからランダムに1つのノードを選択してアクセスする.
実装時、ランダムアルゴリズムは通常、1つの乱数を生成することによって実現され、サービスに10のノードがあれば、1回に1つの1〜10の間の乱数を生成し、生成されたものが2であると仮定すると、2番のノードにアクセスする.
ランダムアルゴリズムを用いて,ノード数が十分多く,アクセス量が大きい場合,各ノードがアクセスされる確率はほぼ同じである.
アルゴリズムを変更する核心は、サービスノードのリストサイズを超えないランダムな整数を取得することです.
int idx = (int) (ThreadLocalRandom.current().nextDouble() * servicesList.size()); 

真のランダム化の実現方法


ホーキングには「誰が薛定谔の猫を私に話してくれたら、私は銃を取りに行きます」という名言がある.私たちのマクロ世界で薛定谔の猫は実はでたらめな なので、この猫は生きているだけでなく死んでいるので、箱を開ける前に、すべてが不確定で、同時に、これこそ本当にランダムだと思います.コンピュータの中のランダム数の生成とは違います.多くの言語のランダム数の生成は時計に基づいているからです.例えばcにおけるsrandは,コンピュータの現在の時刻と1970年1月1日0時0分0秒との時間差に関係する.
もし私が時間のコントロールに対して十分に強いとしたら、私はある特定の時点で呼び出しを開始することができて、このようにランダム呼び出しの負荷均衡アルゴリズムを使っていったいどのノードを呼び出したのか、もちろん私のコントロールの中にあります.
だから私たちのマクロ世界では、いわゆるランダムはすべて存在しません.ラプラス妖は既存の状態に基づいて私たちのいわゆるランダム値を得ることができます.
ではミクロ世界では?高校の物理の中で覚えていて、私达は光の波粒の二象性を学んだことがあって、光は波で粒子で、よく考えてみると、细かく考えて、あなたは男で女で、身を検査する前にあなたは男女の太监の3种类の状态があって、薛定谔の猫のようで、箱を开く前に死活の2种类の状态がありません.これはアインシュタインが発見したもので、教科書で二重縫い実験を使ったことを覚えています.プローブで観察した場合は光は粒子であり,単一スリットのみを通過し,観察しなかった場合は波であり,二重スリットを通過した.粒子がどのスリットを通過するかについては、これこそ本当のランダムです.
物理学者にとって,この量子ランダム性は宇宙の唯一のランダム性であり,物理法則では予測できない結果である.
スケジューリングが便利でランダムアルゴリズムを使う人は、まず光子放出装置を作って、コンピュータの中に置いてランダムアルゴリズムを実現することをお勧めします.

ポーリングアルゴリズム


ポーリングアルゴリズムは,その名の通り一定の順序で,利用可能なサービスノードを1つずつアクセスする.
実装では、ポーリングアルゴリズムは、通常、すべての適用可能なノードを1つの配列⾥に配置し、配列番号に従って1つずつアクセスする.
⽐如服务有10个节点,放到数组⾥就是⼀个大小为10的数组,这样的话就可以从序号为0的节点开始访问,访问后序号⾃动加1,下⼀次就会访问序号为1的 节点,以此类推.
ポーリングアルゴリズムは、すべてのノードがアクセスされる確率が同じであることを保証することができる.
もちろん、私たちの現実生活では、異なるサービスノードのパフォーマンスが異なる可能性があります.その能力に基づいてスケジューリングする必要があります.

重み付けポーリングアルゴリズム


ポーリングアルゴリズムはすべてのノードがアクセスされる確率が同じであることを保証することができ、
実装時、重み付けポーリングアルゴリズムは、n個のノードがあり、nはすべてのノードの重み付けの和であるノードシーケンスを生成する.
このシーケンスでは、ノードごとに現れる回数がウェイト値です.⽐3つのノード:a,b,c,重みがそれぞれ3,2,1であれば,生成されたシーケンスは{a,a,b,c,b,a}であり,このシーケンスに従ってアクセスすると,前の6回のリクエストはそれぞれノードaに3回,ノードbに2回,ノードcに1回アクセスする.7番目のリクエストから、このシーケンスの順序でノードに再アクセスします.
重み付けポーリングアルゴリズムを適用すべきときは,生成されたシーケンスの均一性を可能な限り保証し,生成された不均一がノードアクセスのアンバランスをもたらす場合,先ほどの例

最もアクティブな接続アルゴリズム


最もアクティブな接続アルゴリズムは、名前の通り、アクセスごとに接続数が最も少ないノードを選択します.
異なるノードが要求を処理する速度が異なるため、同じサービス消費者と各ノードとの接続数が異なる.
接続数が大きいノードは,処理要求が遅い,接続数が小さいノードと考えられ,処理要求が速いと考えられる.したがって,ノードを選択する際には,接続数に基づいて,接続数が最も少ないノードアクセスを選択することができる.
実装時には、各ノードとの接続数を記録する必要があり、このようにノードを選択すると、接続数が最も⼩⽐しているノードを比較することができる.

いっぱんせいhashアルゴリズム


一致性hashアルゴリズムは,あるhash関数により,同一ソースの要求を同一ノードにマッピングする.一致性hashアルゴリズムの最も大きな特徴は,同一ソースの要求が同一ノードにのみマッピングされることであり,記憶機能を有するといえる.このノードが適用できない場合にのみ、要求は隣接する適用可能ノードに割り当てられる.

まとめ


上の5種類の負荷等化アルゴリズムはそれぞれ異なるシーンに適用することができ、最近ちょうどZeusの負荷等化戦略を書いて、考えた後に改造された重み付けポーリングアルゴリズムを使用することを決定し、各clientの中で1つのタイミングタスクがあって、すべてのノードの最近の訪問の性能統計を取得して、性能の速さによって、サービスノードを2、8分して20%の遅いノード80の速いノードに分けて、動的に重みを調整します.