負荷分散とは
負荷分散とは、並列に運用されている機器間で、負荷がなるべく均等になるように処理を分散して割り当てることである。負荷分散は、専用の機器を使用する、DNSサーバの設定をする、またはサーバに負荷分散ソフトウェアを導入することにより実現でき、性能改善、冗長化の用途で使用することができる。
負荷分散の手法
負荷分散を行うための手法は複数あり、用途に応じて適切な手法を選択する必要がある。手法には次のようなものがある。
- DNSラウンドロビン型
- プロキシ型
- アドレス変換(NAT)型
- ダイレクトルーティング型
- トンネル型
DNSラウンドロビン型
利用するサーバをDNSの仕組みを使って動的に切り替えることで、リクエストを複数のサーバに転送し、負荷分散を実現する方法である。クライアントはサービスを利用する前に、利用するサービスの名称(FQDN)からIPアドレスを調べるため、DNSサーバに問い合わせを行う。DNSサーバは複数のサーバのIPアドレスの中から1つを選んで応答する。この方法は、DNSサーバのゾーンファイルの設定だけで、簡単に導入することができる。
具体的には、DNSサーバの一つのホスト名に、サービスを提供するサーバのIPアドレスを複数記載する。しかし、サーバがダウンしている場合、アクセスが失敗してしまう問題がある。この問題を避けるために、サービスの停止やサーバのロード・アベレージなどを検知する仕組みを別に用意し、Dynamic DNSと組み合せて、DNSサーバに登録されているDNSレコードを動的に更新する仕組み(DNSバランス)が使われる場合もある。
なお、DNSラウンドロビン型の負荷分散では、サーバの負荷状態とは関係なく均等に割り振るため、サーバの処理能力に差がある場合には、システム全体の性能向上にはつながらない場合がある。
DNSラウンドロビンが使用できるDNSサーバとしては、BINDやPowerDNSがある。
プロキシ型
クライアントからのアクセスを一旦プロキシサーバで受信し、複数のサーバから適切なサーバを選択して振り分けることで、システム全体で負荷を分散し、処理能力を向上させる方法である。この方法は、プロキシサーバで接続を中継するため、どのサーバでどの程度の処理が行われているか管理でき、最も接続数が少ないサーバを選択することが可能である。サーバへの接続が失敗した場合にも、プロキシサーバが別のサーバへリトライすることで、サーバの冗長化と同様の機能を提供することも可能である。
プロキシサーバは、一般的にすべてのプロトコルに汎用に対応するものではなく、プロトコル毎に実装する必要がある。サーバのアクセスは全てプロキシサーバからのアクセスとなるため、アクセス解析や、クライアントからの接続ログの取得がサーバでは行えない。また、プロキシサーバそのものに処理が集中し、性能のボトルネックになってしまう可能性がある。オープンソースのWeb負荷分散プロキシとしては、HAProxyが知られている。Webプロキシサーバとしてよく利用されるsquidにも負荷分散の機能がある。
「無料で使えるプロキシサーバ/ロードバランサおすすめ20選」へ
アドレス変換(NAT)型
サーバに対するリクエストの宛先アドレスを適切に変換して、複数のサーバへ処理を分散させる方法である。この方法を使って、さまざまなプロトコルで負荷分散を実現することができる。
後述するサーバ負荷連動型の分散ポリシーを使用することで、サーバの負荷に応じて適切なサーバに処理を割り振ることができ、個別の処理時間を短縮することができる。しかし、プロトコル独自の処理に基づいて負荷分散をすることはできない。Linuxの実装であるLVS(Linux Virtual Server)や一般的なロードバランサで、この方法を採用している。
ダイレクトルーティング型
サーバに対するリクエストの宛先物理アドレス(MACアドレス)を変更して別の機器に転送することで、複数のサーバへ処理を分散させる方法である。この方法は、プロキシ型やアドレス変換型とくらべて負荷分散の処理負荷が低く、ボトルネックとなりにくい。
しかし、宛先IPアドレスを変更せず物理アドレス(MACアドレス)のみを変更するため、リクエストを処理するサーバ側でこのIPアドレスを受け取れるような特殊な仕組みが必要である。また、負荷分散を行う機器とサービスを提供するサーバは、同一のネットワーク上に置かなければならないという制限がある。
応答パケットが該当のサーバからクライアントに直接送信できるように、ネットワークを構築する必要がある。サーバ側に特別な仕組みが必要なため、構築するためのハードルは高い。Linuxの実装であるLVS(Linux Virtual Server)で、この方法を採用している。ロードバランサでも対応している製品がある。
トンネル型
IPトンネルを利用して負荷分散を行う方法である。サーバに対するリクエストを実サーバのIPヘッダでカプセル化して別の機器に転送することで、複数のサーバへ処理を分散させる方法である。
この方法は、サービスを提供するサーバが、違うネットワークセグメントにあっても構築することが可能である。そのため、ネットワーク上に広くサーバを配置することができ、クライアントの近くにサーバを配置すれば、ネットワークのボトルネックを回避することができる。パフォーマンスはダイレクトルーティング型とほぼ同じとなる。
ネットワークを越えて特殊なパケットをサーバに届けるため、サービスを提供するサーバは、カプセル化されたパケットを受信できるように設定をする。また、ダイレクトルーティング型と同じように、応答パケットは該当のサーバからクライアントに直接送信できるようにネットワークを構築する必要がある。Linuxの実装であるLVS(Linux Virtual Server)で、この方法を採用している。
分散ポリシー
サーバへリクエストを分散させるポリシーとしては、次のようなものがある。
- ラウンドロビン型
- ランダム型
- 送信元IPアドレス型
- サーバ負荷連動型
- 重み付け
ラウンドロビン型
各サーバに順番にリクエストを割り振る方式。分散対象サーバのそれぞれの処理能力が同じで、リクエストの処理時間が一定の場合有効である。また、順番にリクエストを割り振るため、サーバが提供するコンテンツの内容は同一である必要がある。しかし、アクセス毎にサーバが切り替わるため、動的コンテンツへの適応は推奨されない。また、リクエストに対する処理時間のばらつきが大きい場合、サーバの負荷の偏りが大きくなる。
ランダム型
乱数を使用し、完全にランダムにリクエストを割り振る方式。分散対象サーバのそれぞれの処理能力が同じで、リクエストの処理時間が一定の場合有効である。また、リクエストをランダムに割り振るため、サーバが提供するコンテンツの内容は同一である必要がある。
ラウンドロビン型と同様に、アクセス毎にサーバが切り替わるため、動的コンテンツへの適応は推奨されない。また、リクエストに対する処理時間のばらつきが大きい場合、サーバの負荷の偏りが大きくなる。
送信元IPアドレス型
送信元のIPアドレスに従ってリクエストを割り振る方式。同じクライアントは同じサーバに割り振られるため、セッションの維持が必要な動的コンテンツへの適応が行える。しかし、送信元IPアドレスに従ってサーバが決まるため、サーバの負荷にばらつきが発生する。
また、逆にセッションの概念がないUDPの通信の負荷分散では、同じサーバにパケットが届かないと、上手く通信を行うことができない。そのため、UDPの負荷分散では、送信元IPアドレス型を使う必要がある。
サーバ負荷連動型
処理能力に余裕のあるサーバへ割り振る方式。サーバの負荷計測基準としては、「処理中のリクエスト数」「CPU利用率」「ロードアベレージ」などが使われる。分散対象サーバのそれぞれの処理能力が異なっている場合や、リクエスト毎に処理時間が異なっている場合有効である。
負荷の低いサーバへ割り振られることにより、アクセス毎にサーバが切り替わることがあるため、サーバが提供するコンテンツの内容は同一である必要がある。ラウンドロビン型と同様に、動的コンテンツへの適応は推奨されない。
この方式で、CPU利用率やロードアベレージなど、サーバの情報を利用するためには、サーバの負荷を計測するための仕組みが必要である。例えば、Linuxの負荷分散実装であるLVS(Linux Virtual Server)では、実サーバ上の情報を収集しLVSへ振り分けの設定を行うためにfeedbackdが用意されている。
重み付け
サーバの性能に応じてリクエストを割り振る頻度を調整する方式。全てのサーバの性能が同じでない場合に使われる。ラウンドロビン型、ランダム型、送信元IPアドレス型などと組み合わせて使う。
負荷分散を実現するソフトウェア
一般的に負荷分散を実現するには、ロードバランサーと呼ばれる専用の機器を利用する場合が多い。しかし、ロードバランサーは比較的高価で導入のハードルも高い。そのため、ソフトウェアで実現することも多い。
MariaDB Maxscale
MariaDB Maxscaleは、MariaDB、MySQL用の負荷分散のソフトウェアである。単純に負荷を分散するだけではなく、データベースの一貫性を保証するための機能がある。MariaDB Maxscaleでは、リクエストの内容をパースして、更新処理、ロック処理、トランザクションをマスターサーバに転送する。それ以外の処理は、複数のスレーブサーバに分散して転送することができる。また、データベースの動作をモニタし、問題のあるデータベースを自動的に切り離す処理もサポートしている。
バックエンドとなるMariaDB/MySQLを、MariaDB Galera Clusterなどのマルチマスタ構成で構成することで、スケーラブルなシステムを構築することができる。また、この構成で構築した場合、クライアントの処理にはほとんど制約がないのも特長である。
Squid
Webサーバの負荷分散を行う際に、Squidを利用する場合がある。Squidのリバースプロキシ機能では、インターネットからのウェブアクセスを代表して受信し、内部にあるWebサーバ群との通信を中継することができる。この機能で複数のWebサーバへアクセスを振り分けることができる。実際に負荷分散を行う場合には、Squidサーバの冗長化も検討する必要がある。
HAProxy
HAProxyは、様々なプロトコルを扱うことのできるオープンソースのプロキシソフトウェアである。オープンソースの仮想基盤であるOpenStackなどでも、負荷分散を実現するための基盤ソフトウェアとして採用されている。HAProxyは、HTTPの他、SMTPやIMAPなどのTCPプロトコルの負荷分散にも使用することができる。HAProxyは、バックエンドのサービスの稼働状況をチェックするヘルスチェック機能を持っており、アラートを送信したり、サービスから切り離すなどの処理を行える。SSL/TLS通信のオフロードの機能も持っているので、暗号通信にも利用できる。
また、HAProxyのようなプロキシでは、一般的にクライアントからの接続ログの取得がサーバでは行えないという問題がある。HAProxyは、プロキシプロトコルに対応していて、これに対応したサーバを利用すれば、この問題にも対処可能である。
なお、実際に利用する場合には、HAProxyサーバの冗長化も検討する必要がある。
HAProxyの詳細な情報は、「無料資料ダウンロード: HAProxy 調査報告書」で公開されている。
LVS
LVS(Linux Virtual Server)は、Linux上でLayer4負荷分散を実現するソフトウェアである。アドレス変換型、ダイレクトルーティング型、トンネル型の3つの方法をサポートしている。UDPの負荷分散もサポートしている。また、冗長化ソフトウェアであるKeepalivedと連携することで、バックエンドのサービスの稼働状況をチェックするヘルスチェック機能と冗長化を実現することができる。
また、オープンソースソフトウェアのILUKAを利用すれば、設定をWebから行うこともできる。
デージーネットのサービス
デージーネットは、インターネットサービスプロバイダやネットサービス事業者などのシステム構築を多く手がけている。インターネットサービスプロバイダは利用者が多く、サービスにも高い品質が求められる。そのため、負荷分散と冗長化について多数の実績を持っている。
ILUKAは、このような環境で利用するためのソフトウェアとして、デージーネットが開発してオープンソースソフトウェアとして公開したソフトウェアである。最近では、クラウド上での利用も多い。
デージーネットでは、ILUKAやHAProxyを使った負荷分散サーバの構築を行っている。構築後も、導入後支援サービスOpen Smart Assistanceにより、保守・サポートを提供している。
【カテゴリ】:システム管理  
【Webセミナー】Rocket.Chatだけじゃない!OSSビジネスチャットの最新情報
日程: | 12月19日(木)Webセミナー「BigBlueButton」を使用します。 |
内容: | Rocket.Chatの機能制限でお困りの方も必見!ライセンスフリーで利用できるOSSのビジネスチャットを紹介します。 |
ご興味のあるかたはぜひご参加ください。 |