ホーム ブログ UX/UI

Nginxによるロードバランサ...

Nginxによるロードバランサーでサーバーの負荷分散をする

Rabiloo

サーバーのロードバランシング(負荷分散)は、大量のリクエストを受け付ける大規模なサーバーシステムにとって非常に重要で不可欠な技術です。ロードバランシングはWebサイトのパフォーマンスや品質、ユーザーエクスペリエンスに非常に大きな影響を与えます。

サーバーのロードバランシングはどのようにシステムの安定運用と、負荷に耐えるのにどのように役立つのでしょうか。

ロードバランシング(負荷分散)が必要になる背景

負荷分散を行わない従来のシステムでは、ユーザーからのすべてのリクエストを1台のサーバーで負担しなければなりません。多くのリクエストを同時に、かつ長時間負担することになると、サーバーに過大な負荷がかかってしまいます。

これは、Webサイトのパフォーマンスに影響を与え、レスポンスの遅れを引き起こし、ユーザーエクスペリエンスに影響を与えます。

さらに、過負荷により、サーバーが負荷に耐え切れず、すべてのユーザーリクエストを処理できなくなると、サーバーのシャットダウンにつながることもあります。

サーバーの負荷容量を増やす方法

サーバーの負荷容量を増やすには、2つの一般的な方法があります。

  • RAMやCPUなどのハードウェア構成の改善やアップグレード(垂直方向の拡張)
  • 負荷がかかるサーバーの数を増やす(水平方向の拡張)

それぞれの方法には独自の効果と目的があり、最高の効率を達成するには両方の方法を組み合わせることもできます。

とりわけサーバーの増設は必須です。

負荷容量を満たすだけでなく、システムの継続的な稼働を確保することができます。1台のサーバーがダウンしても、他のサーバーが稼働し引き継ぐことができます。

しかし、サーバーを増やすと、サーバーのリソースの効率的な調整と管理に問題が生じます。

この問題を解決するのが、サーバーのロードバランシングです。

ロードバランサーとは?

ロードバランサー(負荷分散システム)とは

例えば、1台のサーバーでWebを管理している場合、同時にアクセスするユーザーが多すぎると、サーバーは非常に多くのリクエストに対応しなければなりません。

そのため、サーバーの過負荷、処理の困難、Webサイトのパフォーマンス低下、レスポンスの遅れ、さらにはサーバーのダウンが発生します。

この問題に対処するためには、サーバーに手を加える必要があります。

ただし、Webサイトが同じ管理下にある複数のサーバーを持つ場合、ロードバランシングと呼ばれる効果的な方法で解決することができます。

ロードバランシングとは、サーバープールやサーバーファームとも呼ばれる、サーバー群に対するトラフィック(リクエスト)を効率的かつ論理的に調整することです。

ロードバランシングの目的は、サーバーリソースの効率的な使用です。

リクエストの負荷が高いサーバーへの負担を減らし、アイドル状態のサーバーへのリクエストを調整することによって負荷を分散します。

このように、外部からのトラフィック(負荷)を複数のサーバーに平等に分散する装置のことを、ロードバランサーといいます。

ロードバランサーはリクエストの負荷が高いサーバーへの負担を減らし、アイドル状態のサーバーへのリクエストを調整することによってバランスを取ります。

ロードバランサーの役割

ロードバランサーは、サーバーとクライアントのルーティングの前で「交通警察」の役割を果たします。

  • 「トラフィック渋滞」を起こすことなく、最適なスピードとパフォーマンスで各サーバーにストリームする

  • 大量のリクエストがある場合に、過負荷のサーバーやアイドル状態のサーバーがないようにする。1台のサーバーがダウンした場合、ロードバランサーは他のサーバーにリダイレクトする

まとめると、ロードバランサーは主に以下のような機能を果たすことになります。

  • オンライン中のサーバーにのみリクエストを送ることにより、可用性と信頼性を確保する

  • クライアントのリクエストを複数のサーバーに効率よく分散させる

  • 複数のサーバーを簡単かつ柔軟に縮小・拡張できる

ロードバランサーがネットワークに不可欠な理由

サーバーの数が多すぎると、サーバーのリソースを効率的に管理することが難しくなり、各サーバーの運用に関わる問題が発生します。

そのためには、高い技術力、時間とコストが必要です。

そこで上記のようなサーバー管理の問題を解決するために、サーバーのパフォーマンスを最適化するロードバランサーが誕生しました。

ロードバランサがネットワークに不可欠であるもうひとつの理由は、安定かつ継続的な運用ができ、信頼性を満たし、ビジネスの能力を発揮できるという点です。

ビジネスにおいてサーバーのダウンは許されない

従来のように、1台のサーバーだけでシステムを運用していた場合、そのサーバーがダウンすると、システムがエンドユーザーのニーズに応えられなくなります。

その結果、顧客のサービスが中断され、カスタマーエクスペリエンスを損ない、クレームを受けることになります。同時に、ユーザーからの信頼を大きく失い、電子商取引サイトや銀行システム、電子決済システムなどに甚大な影響を及ぼす可能性があります 

そのため、企業は複数のサーバーを同時に使用する必要があり、ロードバランサーによって最高のパフォーマンスとスムーズな運用を実現します。

サーバーが100%落ちずに稼働することは保証されません。緊急時は、他のサーバーを利用して引き継ぎを行い、サーバーにかかる圧力を即座に分散させることを考えなければなりません。

このように、ロードバランサーを備えた複数のサーバーを利用することで、中断せずにビジネスを継続することができます。さらに、サーバーの過負荷状況を最小化し、エンドユーザーの顧客体験を向上させることができます。

Nginxを使用したロードバランサーとは?

前述の通り、トラフックが多いシステムでは、多くのサーバによる負荷能力の高いシステムが必要です。

Nginx(エンジンエックス)はこの問題を解決するための有効なソリューションの一つです。

Nginxは、ベテランプログラマーIgor Sysoevが2004年に立ち上げたシステムで、多くの役割を担うオープンソースソフトウェアです。

もともとは2002年代にC10k問題を解決するために研究されました。C10kとは、1万件の接続を同時に処理する限界のことで、当時の古いWebサイトのシステムで発生していた問題です。

Nginxの代表的な導入例をいくつか紹介します。

  • Wordpressなど、WebアプリケーションのWebサーバ

  • HTTP、UDP 、TCPのロードバランシング

  • コンテンツキャッシュリソースの管理によるサーバーの効率化

  • Websocketのサポート

  • セキュリティコントロールのサポート(例:1つのIPアドレスからの接続数の上限設定、リクエストを積極的に呼び出すことによる攻撃の防止)

Nginxのアーキテクチャ

Nginxのアーキテクチャ

NGINXは、非同期アーキテクチャモデル(Asynchronous)とイベント駆動アーキテクチャ(Event-Driven)を採用し、拡張性をもたせています。Nginxは高速であるという利点を活かし、静的コンテンツ(画像、CSS、JS)の利用だけでなく、大規模な同時クエリのナビゲーションを処理するために使用されます。

Nginxの負荷分散アルゴリズム 

ロードバランサーがリクエストをアプリケーションサーバーにリダイレクトすることを決定するために使用する、4つの基本的な負荷分散アルゴリズムがあります。

  • ラウンドロビン (デフォルト)

  • 最小の接続数

  • 最短時間

  • IP ハッシュ(HTTPのみ)

以下は、上記のアルゴリズムの基本的な説明です。

ラウンドロビン

これは最もシンプルなデフォルトのアルゴリズムです。このアルゴリズムでは、Nginxは円周上にあるマシンにのみ、リクエストを1つ1つ送ります。

このアルゴリズムでは、サーバが過負荷であるかどうか、多くのリクエストを受け取っているかは問題ではありません。毎ターン、サーバーはクライアントからのリクエストを処理しなければなりません。

最小の接続数

このアルゴリズムでは、Nginxは最も少ないリクエストを処理しているサーバにリクエストを送ります。これによりシステム内のサーバに偏りがなく、各サーバが同じ数のリクエストに対応できるようになります。

最短時間

このアルゴリズムは、上記の2つのアルゴリズムよりも高度なものになります。つまり、サーバーが処理しているリクエスト数を考慮することに加え、過去に処理されたリクエストの平均処理速度を考慮し、将来どのサーバーがリクエストを受信し処理するかを効果的に調整します。多くのサーバーが存在するシステムでは、すべてのサーバーが同じ構成や同じ処理速度を持つとは限らないからです。

IP ハッシュ

このハッシュアルゴリズムは、クライアントのIPの最初の3オクテットをもとに、どのクライアントをどのサーバに(固定)マップするかを決定するものです。ユーザーのセッションを保持する必要があるアプリケーションに適しています。プール内のサーバーを追加・削除すると、ハッシュ値は再分配されます。追加パラメータのconsistentを使用することで、ハッシュ値の再分配による影響を最小限に抑えることができます。

まとめ

実際、大企業の大規模プロジェクトではサーバーを増設するケースがほとんどで、ロードバランシングアルゴリズムによる効率的なサーバーの運用・調整方法が伴っています。システムの規模が大きくなったり、パフォーマンスの問題やダウンタイムが発生した場合は、Nginxを使用したロードバランサ利用を検討してみてはいかがでしょうか。

今回の記事でロードバランサの仕組み、またユーザーからの何百万ものリクエストに応えるための大規模なサーバーシステムを構築する際の重要性やメリットをご紹介しました。少しでもお役に立てていただければ幸いです。

Rabilooのブログでは他にもテクノロジーに関する情報を提供しております。併せてご覧ください。