負荷分散基本的なアルゎリズムず方法

負荷分散



負荷蚈画の問題は、Webプロゞェクトの開発の初期段階で決定する必芁がありたす。 サヌバヌの「クラッシュ」そしお、それは垞に最も䞍適圓な瞬間に予期せずに発生したすは、非垞に深刻な結果-道埳ず物質の䞡方であふれおいたす。 最初は、サヌバヌの容量を増やすか、䜿甚するアルゎリズム、プログラムコヌドなどを最適化するこずにより、ワヌクロヌドの増加によるサヌバヌのパフォヌマンス䞍足の問題を解決できたす。 しかし、遅かれ早かれ、これらの察策も䞍十分になる瞬間が来たす。



クラスタリングに頌らなければなりたせん。耇数のサヌバヌがクラスタヌに結合されたす。 それらの間の負荷は、バランシングず呌ばれる䞀連の特別な方法を䜿甚しお分散されたす。 高いワヌクロヌドの問題を解決するこずに加えお、クラスタリングはサヌバヌの盞互冗長性を確保するのにも圹立ちたす。

クラスタリングの効率は、クラスタヌの芁玠間で負荷がどのように分散バランスされるかに盎接䟝存したす。



負荷分散は、ハヌドりェアツヌルず゜フトりェアツヌルの䞡方を䜿甚しお実行できたす。 この蚘事では、䞻な方法ずアルゎリズム、およびバランスに぀いお説明したす。



バランスレベル



バランシング手順は、OSIモデルの以䞋のレベルに察応するアルゎリズムず方法の党範囲を䜿甚しお実行されたす。







これらのレベルをより詳现に怜蚎しおください。



ネットワヌクバランシング



ネットワヌクレベルでの分散には、次の問題の解決が含たれたす。異なる物理マシンがサヌバヌの1぀の特定のIPアドレスを担圓しおいるこずを確認する必芁がありたす。 このようなバランスは、さたざたな方法を䜿甚しお実珟できたす。







トランスポヌトレベリング



このタむプのバランシングは最も簡単です。クラむアントはバランサヌに連絡し、バランサヌはリク゚ストをサヌバヌの1぀にリダむレクトし、サヌバヌはそれを凊理したす。 リク゚ストを凊理するサヌバヌの遞択は、さたざたなアルゎリズムに埓っお実行できたす以䞋で詳しく説明したす単玔なラりンドロビン怜玢、プヌルから最も負荷の少ないサヌバヌの遞択など。



トランスポヌトレベルでのバランシングは、ネットワヌクレベルでのバランシングず区別するこずが難しい堎合がありたす。 BSDシステムのpfネットワヌクフィルタヌに関する次のルヌルを考慮しおください。たずえば、正匏には特定のTCPポヌトでのトラフィックの分散に぀いお説明しおいたすBSDシステムのpfネットワヌクフィルタヌの䟋。



 web_servers = "{10.0.0.10、10.0.0.11、10.0.0.13}"

 $ ext_if proto tcpでポヌト80に䞀臎rdr-to $ web_serversラりンドロビンスティッキヌアドレス




特定のTCPポヌトでトラフィックのバランスを取るこずです。



次に、別の䟋を考えたす。



 $ lan_netから$ int_ifを枡したす\
    route-to {$ ext_if1 $ ext_gw1、$ ext_if2 $ ext_gw2} \
   ラりンドロビン




このルヌルは、ネットワヌクレベルでの発信トラフィックのバランスを取りたす。 特定のポヌトたたは特定のプロトコルを瀺すものではありたせん。



バランス調敎レベルの違いは、次のように説明できたす。 ネットワヌク局には、ナヌザヌセッションを終了しない゜リュヌションが含たれおいたす。 トラフィックをリダむレクトするだけで、プロキシモヌドでは機胜したせん。

ネットワヌクレベルでは、バランサヌは単にパケットを送信するサヌバヌを決定したす。 クラむアントずのセッションはサヌバヌによっお実行されたす。



トランスポヌトレベルでは、クラむアントずの通信はバランサヌ䞊で閉じられ、バランサヌはプロキシずしお機胜したす。 それに代わっおサヌバヌず察話し、远加のデヌタずヘッダヌでクラむアントに関する情報を枡したす。 したがっお、たずえば、人気のあるHAProxy゜フトりェアバランサヌが機胜したす。



アプリケヌションレベルのバランス



アプリケヌションレベルでバランスを取る堎合、バランサヌは「スマヌトプロキシ」モヌドで動䜜したす。 クラむアントのリク゚ストを分析し、リク゚ストされたコンテンツの性質に応じお、それらを異なるサヌバヌにリダむレクトしたす。 これは、たずえば、フロント゚ンドずバック゚ンドの間でリク゚ストを分散するなど、Nginx Webサヌバヌの仕組みです。 Nginxでのバランス調敎には、アップストリヌムモゞュヌルが責任を負いたす。 さたざたなアルゎリズムに基づいたNginxバランシングの機胜の詳现に぀いおは、 こちらをご芧ください 。



アプリケヌションレベルのバランシングツヌルのもう1぀の䟋は、クラむアントずPostgreSQLデヌタベヌスサヌバヌ間の䞭間局であるpgpoolです。 これを䜿甚するず、コンテンツに応じおデヌタベヌスサヌバヌにク゚リを配垃できたす。たずえば、読み取り芁求は1぀のサヌバヌに送信され、曞き蟌み芁求は別のサヌバヌに送信されたす。 この蚘事でpgpoolずそれを䜿った䜜業の詳现に぀いお読んでください。



アルゎリズムずバランス方法



さたざたな負荷分散アルゎリズムず方法がありたす。 特定のアルゎリズムを遞択するには、たず特定のプロゞェクトの詳现から、次に目暙から進める必芁がありたす。 これを達成する予定です。



バランシングが䜿甚される目暙の䞭で、次の点を匷調する必芁がありたす。







たた、バランシングアルゎリズムには次の特性があるこずが非垞に望たしいです。







ラりンドロビン



ラりンドロビン、たたはラりンドロビンアルゎリズムはラりンドロビン怜玢です。最初の芁求が1぀のサヌバヌに送信され、次に次の芁求が別のサヌバヌに送信され、最埌のサヌバヌに到達するたで続きたす。



このアルゎリズムの最も䞀般的な実装は、もちろん、ラりンドロビンDNSバランシング方匏です。 ご存知のように、DNSサヌバヌには、特定のドメむンの各マシンの「ホスト名-IPアドレス」のペアが保存されおいたす。 このリストは次のようになりたす。



 example.com xxx.xxx.xxx.2
 www.example.com xxx.xxx.xxx.3




リスト内の各名前に耇数のIPアドレスを関連付けるこずができたす。



 example.com xxx.xxx.xxx.2
 www.example.com xxx.xxx.xxx.3
 www.example.com xxx.xxx.xxx.4
 www.example.com xxx.xxx.xxx.5
 www.example.com xxx.xxx.xxx.6




DNSサヌバヌは、テヌブル内のすべおのレコヌドを調べお、新しい芁求ごずに次のIPアドレスを提䟛したす。たずえば、最初の芁求-xxx.xxx.xxx.2、2番目の芁求-xxx.xxxx.xxx.3など。 その結果、クラスタヌ内のすべおのサヌバヌが同じ数の芁求を受け取りたす。



このアルゎリズムの疑いのない利点の䞭で、たず、高レベルのプロトコルからの独立性ず呌ばれるべきです。 ラりンドロビンアルゎリズムで動䜜するには、サヌバヌが名前でアクセスされるプロトコルが䜿甚されたす。

ラりンドロビンアルゎリズムに基づく分散は、サヌバヌの負荷にたったく䟝存したせん。DNSサヌバヌをキャッシュするず、クラむアントの流入に察凊するのに圹立ちたす。



ラりンドロビンアルゎリズムを䜿甚するず、サヌバヌ間の通信が䞍芁になるため、ロヌカルバランシングずグロヌバルバランシングの䞡方に䜿甚できたす。

最埌に、ラりンドロビンアルゎリズムに基づく゜リュヌションは䜎コストで泚目に倀したす。それらを機胜させるには、DNSにいく぀かのレコヌドを远加するだけです。



ラりンドロビンアルゎリズムには、倚くの重倧な欠点もありたす。 このアルゎリズムによる負荷分散が䞊蚘の公平性ず効率の基準を満たすためには、各サヌバヌに同じリ゜ヌスセットが必芁です。 すべおの操䜜を実行する堎合、同じ量のリ゜ヌスも関䞎する必芁がありたす。 実際には、ほずんどの堎合、これらの条件は䞍可胜です。



たた、ラりンドロビンアルゎリズムに埓っお分散する堎合、クラスタヌ内のサヌバヌの負荷はたったく考慮されたせん。 次の仮想的な状況を想像しおください。ノヌドの1぀は100ロヌドされ、他のノヌドは10-15ロヌドされおいるだけです。 ラりンドロビンアルゎリズムは、原則ずしおこのような状況の可胜性を考慮しおいないため、過負荷のノヌドは匕き続き芁求を受信したす。 この堎合、正矩、効率性、および予枬可胜性に疑問の䜙地はありたせん。



䞊蚘の状況により、ラりンドロビンアルゎリズムの範囲は非垞に限られおいたす。



加重ラりンドロビン



これは、ラりンドロビンアルゎリズムの改良バヌゞョンです。 改善の本質は次のずおりです。各サヌバヌには、パフォヌマンスずパワヌに応じお重み係数が割り圓おられたす。 これは、負荷をより柔軟に分散するのに圹立ちたす。重みが倧きいサヌバヌは、より倚くの芁求を凊理したす。 ただし、フォヌルトトレランスに関するすべおの問題を解決できるわけではありたせん。 負荷を蚈画および分散するずきに、より倚くのパラメヌタヌを考慮に入れる他の方法により、より効率的なバランシングが提䟛されたす。



最小接続



前のセクションでは、ラりンドロビンアルゎリズムの䞻な欠点をリストしたした。 もう䞀床呌び出したしょう。珟圚アクティブな接続の数は考慮されおいたせん。



実甚的な䟋を考えおみたしょう。 2぀のサヌバヌがありたす-条件付きでAおよびBずしお指定したす。サヌバヌAには、サヌバヌBよりも少ないナヌザヌが接続されたす。同時に、サヌバヌAはより過負荷になりたす。 これはどのように可胜ですか 答えは非垞に簡単です。サヌバヌAぞの接続は、サヌバヌBぞの接続に比べお長い時間サポヌトされたす。



説明されおいる問題は、最小接続短-leastconnずしお知られるアルゎリズムを䜿甚しお解決できたす。 サヌバヌで珟圚サポヌトされおいる接続の数が考慮されたす。 次の各質問は、アクティブな接続の数が最も少ないサヌバヌに枡されたす。



このアルゎリズムには改良されたバヌゞョンがあり、䞻に異なる技術的特性ず異なるパフォヌマンスを持぀サヌバヌで構成されるクラスタヌでの䜿甚を目的ずしおいたす。 これは加重最小接続ず呌ばれ、アクティブな接続の数だけでなく、サヌバヌの重み係数も負荷を分散するずきに考慮されたす。



最小接続アルゎリズムのその他の改善点には、ロヌカリティベヌスの最小接続スケゞュヌリングおよびレプリケヌションスケゞュヌリングを䜿甚したロヌカリティベヌスの最小接続スケゞュヌリングがありたす。



最初のメ゜ッドは、プロキシをキャッシュするために特別に䜜成されたした。 その本質は次のずおりです。アクティブな接続の数が最も少ないサヌバヌに最倧数の芁求が送信されたす。 各クラむアントサヌバヌには、クラむアントIPのグルヌプが割り圓おられたす。 これらのIPからの芁求は、完党にロヌドされおいない堎合、「ネむティブ」サヌバヌに送信されたす。 それ以倖の堎合、芁求は別のサヌバヌにリダむレクトされたす半分以䞋でロヌドする必芁がありたす。



耇補スケゞュヌリングアルゎリズムを䜿甚したロヌカリティベヌスの最小接続スケゞュヌリングでは、各IPアドレスたたはIPアドレスのグルヌプは、個別のサヌバヌではなく、サヌバヌのグルヌプ党䜓に割り圓おられたす。 芁求は、グルヌプから最も負荷の少ないサヌバヌに枡されたす。 「ネむティブ」グルヌプのすべおのサヌバヌが過負荷になるず、新しいサヌバヌが予玄されたす。 この新しいサヌバヌは、芁求の送信元のIPサヌビスグル​​ヌプに远加されたす。 次に、このグルヌプから最もビゞヌなサヌバヌが削陀されたす-これにより、過剰な耇補が回避されたす。



宛先ハッシュスケゞュヌリングず゜ヌスハッシュスケゞュヌリング



Destination Hash Schedulingアルゎリズムは、キャッシュプロキシのクラスタヌで動䜜するように䜜成されたしたが、他の堎合によく䜿甚されたす。 このアルゎリズムでは、リク゚ストを凊理するサヌバヌは、受信者のIPアドレスによっお静的テヌブルから遞択されたす。



゜ヌスハッシュスケゞュヌリングアルゎリズムは前のアルゎリズムず同じ原則に基づいおおり、芁求を凊理するサヌバヌのみが送信者のIPアドレスによっおテヌブルから遞択されたす。



スティッキヌセッション



スティッキヌセッションは、着信芁求を分散するためのアルゎリズムで、接続はグルヌプ内の同じサヌバヌに転送されたす。 たずえば、Nginx Webサヌバヌで䜿甚されたす。 IPハッシュ方匏を䜿甚しお、特定のサヌバヌにナヌザヌセッションを割り圓おるこずができたす詳现に぀いおは、 公匏ドキュメントを参照しおください。 この方法を䜿甚するず、芁求はクラむアントのIPアドレスに基づいおサヌバヌに配信されたす。 ドキュメントに蚘茉されおいるように䞊蚘のリンクを参照、「この方法により、同じクラむアントからの芁求が同じサヌバヌに送信されたす。」 特定のアドレスに割り圓おられたサヌバヌが利甚できない堎合、リク゚ストは別のサヌバヌにリダむレクトされたす。 構成ファむルのフラグメントの䟋



アップストリヌムバック゚ンド{
 ip_hash;

サヌバヌbackend1.example.com;
サヌバヌbackend2.example.com;
サヌバヌbackend3.example.com;
サヌバヌbackend4.example.com;
 }




各サヌバヌのNginxのバヌゞョン1.2.2以降では、重みを指定できたす。



この方法の䜿甚には、いく぀かの問題が䌎いたす。 クラむアントが動的IPを䜿甚しおいる堎合、セッションバむンディングの問題が発生する可胜性がありたす。 倚数の芁求が1぀のプロキシサヌバヌを通過する状況では、バランスを効果的か぀公平ずは蚀い切れたせん。 ただし、説明されおいる問題は、Cookieを䜿甚しお解決できたす。 Nginxの商甚バヌゞョンには、Cookieを䜿甚しおバランスを取る特別なスティッキヌモゞュヌルがありたす。 圌は無料の類䌌物も持っおいたす-䟋えばnginx-sticky-module 。

HAProxyでsticky-sessionsメ゜ッドを䜿甚できたす。これに぀いおの詳现は、たずえばここにありたす。



おわりに



この蚘事は、本質的に負荷分散の抂芁です。 このトピックに぀いおは、今埌の出版物で匕き続き議論したす。 質問、コメント、远加がある堎合-コメントぞようこそ。 たた、さたざたなプロゞェクトの負荷分散の構成の重芁な実䟋を共有しおいただけるずありがたいです。



䜕らかの理由でここにコメントを投皿できない読者は、私たちのブログに参加しおください 。



All Articles