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