アルゴリズム ネットワーク

負荷分散装置(ロードバランサ)とアルゴリズムを学ぼう!

「負荷分散」。その名の通り、システムにおいて、Webサーバやデータベースに対しての負荷を分散することです。

負荷分散には色々なメリットがありますが、アルゴリズムによってメリットに違いが出てきます。

今回は、Webシステムにおけるクライアントからのアクセス時の負荷分散装置の役割と「振り分けアルゴリズム」に関して解説します!

負荷分散技術の必要性

現代のITシステムにおいて、ネットワークを介してクライアント(PCやスマホ)からサーバへ処理を連携する所謂「クライアントサーバ方式」の仕組みが多いです。

この方式はサーバがいくつものクライアントからの要求を処理できるので非常に効率的なのですが、クライアントからのアクセスが集中した際は通信経路のスループット(帯域)が不足したり、サーバの処理能力が不足したりして、サービスそのものの品質が低下してしまう恐れがあります。

これ解決するための「負荷分散技術」があります。

イメージは以下のようになりますね。

負荷分散のイメージ

負荷分散技術はその名の通り、クライアントからサーバへの負荷を軽減するので、クライアントとサーバの間に負荷分散装置(ロードバランサー)を挟んでサーバへの処理を分散させる技術です。

負荷分散装置のメリット

  • サーバやネットワークの負荷を分散し、処理能力不足の発生を抑える
  • 故障が発生してもサービスを停止しないようにできる
  • メンテナンス時のサービス停止を無くせる

負荷分散技術を使うことで多くのメリットがありますが、勿論デメリットもあります。それは。

負荷分散のデメリット

負荷分散装置を入れるためコストが掛かる

まあ、そりゃそうですよね。また、負荷分散装置の単一点障害によるサービス全体の停止のリスクもあるので、負荷分散装置そのものを冗長構成にすると更にコストはかかりますね。

では、続いて負荷分散の振り分けアルゴリズムをいくつか紹介します!

振分けアルゴリズム

負荷分散技術にはいくつかのアルゴリズムがあります。

なぜかというと、処理を分散するサーバの性能や状況によって、振分けアルゴリズムを変えることで、最適な振分けができるからです。

ラウンドロビン方式

シンプルですが、有名な負荷分散方式ですね。

このアルゴリズムはクライアントからのアクセスを負荷分散装置の先にある複数のサーバに「順番に振り分ける」方式です。

こちらのメリットはアルゴリズムが簡単ということですが、順番に振り分けるので、同一性能のサーバで処理を分散するときに適していますね。

ただし、クライアントから依頼される処理量の差が大きいと、サーバへの負荷に差が出てしまい、あるサーバがパンパンになってしまう可能性がありますね。

ラウンドロビン方式の例

最小接続方式

負荷分散装置がクライアントとサーバの接続状況を監視し、一番接続数が少ないサーバに新たな処理を渡す方式です。

こちらのメリットは、接続数をちゃんと見るので、ラウンドロビン方式より更に負荷を均等に分散できることですね。

ただし、こちらもサーバの処理能力に差があると、接続数が少ないからといって、重い処理を渡してしまい、処理ができなくなるリスクはありますので、サーバの処理能力に差異がなく、接続ごとの通信負荷や処理負荷にも差異が無い場合が適してますね。

最小接続方式の例

重み付け方式

それぞれのサーバに「重み」を設定して、その重み付けに従って接続を振り分けるアルゴリズムです。

さきほどのラウンドロビン方式、最小接続方式と違い、分散するサーバの処理能力に差異がある時に有効です。

つまり、処理能力が高いサーバには重みを多く付け、たくさんの処理を依頼するようにします。

サーバを増やしたりした際にスペックに違いが出てきた時に重み付けをするとメリットがでますね。

こちらは間違った重み付けをすると大変なことになるので、負荷テストをした上で適切な重みを付ける必要がありますね。

重み付け方式の例

優先度方式

こちらはサーバに「優先度」を付けることで負荷分散を行うアルゴリズムです。

通常は優先度の高いサーバへ振り分けを行い、それらが処理負荷の設定値を超えてしまった場合に、優先度の低いサーバに振り分けます。

重み付け方式と似ていますが、違いは優先度の低いサーバは「メインでは使わない」ということです。

たまにアクセスが集中した際に一時的に処理を優先度の低いサーバに助けてもらったり、アクセスが不能になった際の「sorryサーバ(ごめんなさいを通知するサーバ)」へ処理を振り分ける時に使います。

負荷分散というより、緊急時対策のイメージが近いですね。

優先度方式の例

ここまでの振り分けアルゴリズムを比較のためにまとめると以下のようになります。

振分け方式振分けアルゴリズム利用に適している状況
ラウンドロビン方式クライアントからのアクセスを負荷分散装置の先にある複数のサーバに「順番に振り分ける同一性能サーバで構成され、振分けを行う処理ごとの負荷に大きな違いが無い場合
最小接続方式負荷分散装置がクライアントとサーバの接続状況を監視し、一番接続数が少ないサーバに新たな処理を渡すサーバの処理性能に大きな差異がなく、接続ごとの通信負荷や処理負荷に大きな違いが無い場合
重み付け方式サーバに「重み」を設定して、その重み付けに従って接続を振り分ける処理性能の異なるサーバで構成されている場合
優先度方式通常は優先度の高いサーバへ振り分けを行い、それらが処理負荷の設定値を超えてしまった場合に、優先度の低いサーバに振り分けるサーバへのアクセスが集中した際に一時的に処理を優先度の低いサーバに助けてもらう場合
振分けアルゴリズムの比較

サーバ側の環境によって、振分けアルゴリズムを上手く使い分けることが重要ですね。

まとめ

今回は負荷分散技術と振分けアルゴリズムに関して解説しました。

負荷分散技術のまとめ

  • 負荷分散技術を使うとサーバやネットワークの処理能力不足やサービス停止を無くすことができる
  • 振分けアルゴリズムを使い分けることで最適な負荷分散ができる
  • 負荷分散技術を導入するとコストは増える

因みに「システムにおける負荷分散」という意味では、CPUの負荷分散は「マルチプロセッサ」、ディスクの負荷分散は「ストライピング」、サーバの負荷分散は「クラスタリング」と言った感じで、色々な負荷分散技術がありますね。

人間もよく考えると重み付けや優先度など色々なアルゴリズムを使って、自分のやるべきことを負荷分散してますよね。優先度間違えて、奥さんから怒られる時もありますが(汗)

以上です!

-アルゴリズム, ネットワーク