典型的なシステムアーキテクチャ
この記事ではWeb3層モデルなど具体的なシステム例を用いて高可用性やスケーラビリティを確保するためのシステム構成パターンについてのパターンを解説していきます。(LinuCレベル2 主題:2.13.4)
このセクションでは高可用性やスケーラビリティを確保するためのシステム構成パターンについて学びます。
目次
LAPP, LAMP構成
オープンソースのApache/Nginx WebサーバーとPHPモジュール、PostgreSQLまたはMySQLなどのリレーショナルデータベースから、構成されるWebアプリケーションは世界中で広く使用されています。
PHP言語は、
- HTMLファイルにPHP言語で記述したプログラムを埋め込むことができる
- シンプルな文法で比較的短時間に習得することができる
- 安価なホスティングサービスがPHPプログラムの動作に対応している
などの特徴から、Webアプリケーション開発に広く採用されています。
また、WordPress、Moodleなどのコンテントマネジメントシステム(CMS、Webサイトやブログをプログラミング知識なしに構築・運用できるソフトウェア)やオンライン学習支援システムが動作することもあり、Ruby, Python, Javaなどで書かれたソフトウェアよりもより多くのサイト運用に使用されています。
LAPPは、Linux + Apache + PHP + PostgreSQL、LAMPはLinux + Apache + PHP + MySQL から構成されたWebアプリケーションの動作環境です。PostgreSQLはトランザクション制御などに優れ、安定性が注目されています。MySQLはPostgreSQLや他のデータベースソフトウェアに比較すると、より高速に動作することを優先していて、開発者の間で人気があります。ただし、Oracle社がMySQLの知的財産を取得してから、元の開発者たちはコードをフォーク(分岐)し、MariaDBというプロジェクトで開発を進めています。
LAMP, LAPPによるシステムは1台でも動作しますが、先に解説したように複数台で構成することも可能です。
- Webサーバー(PHPモジュール)とデータベースサーバーを分離して2台構成にする
- ロードバランサ―を入れてWebサーバーを複数台構成に冗長化する
- データベースサーバーをクラスタリングして複数台構成にする
などシステムの負荷に応じて、冗長構成を取り、より大きな負荷に耐えられるようシステム構成を柔軟に変更することができます。
また近年ではリソース消費を節約できるため、Apacheの代わりにNginx(エンジンエックス)というWebサーバーソフトが使用されるケースも増加しています。
ApacheやNginxはPHPを別のプロセスで動作させるPHP-FPMモジュール[1]を用いて、FastCGIという仕組みでPHPプログラムを処理できます。Webサーバーとは別のプロセスでサーバーサイドのPHPプログラムを動作させる仕組みです。
これにより
- Webサーバーの負荷を軽減できる
- CGIだとプログラムの実行のたびにプロセスを起動・停止するが、FastCGIは常駐するためプロセスの起動・停止のリソース消費を節約できる
などの利点があります。
Web3層モデル
前節のPHPはWebサーバーのプロセス上で動作しましたが、アプリケーションの処理をWebサーバーと切り離すことでそれぞれの負荷を軽減したり、冗長構成にしたりして負荷分散を図ることが可能です。その場合は、
Webサーバー + アプリケーションサーバー + データベースサーバー
という3階層の構成を取ります。
またそれぞれのレイヤーで冗長化構成を取ることも可能です。
アプリケーションサーバーとしては、Javaに対応したTomcat, JBossなどが有名です。TomcatはJavaで書かれたWebアプリケーション(JavaサーブレットやJSP[Java Server pages])を動作させることができ、Javaを使用したWebアプリケーション開発で人気があります。また、簡易なWebサーバーとして機能することが可能です。
ただし、TomcatなどJavaベースのアプリケーションサーバーはJava VM(Javaの実行環境、JVMとも呼ばれる。OpenJDKやOracle JDKなどに含まれる)やJRE(Java Runtime Engine)の上で動作するため、メモリ消費量が増大したり、Java実行環境へのメモリ割当て量を増加させたりして実行環境がクラッシュしないようにするなどの工夫が必要で、一定のチューニング知識を要します。
冗長構成のWeb3層モデル
Web3層モデルのそれぞれの層は多重化したり、冗長構成を取ることが可能です。
- 多重化はロードバランサ―を入れて処理を複数台に分散する仕組み
- 冗長化は、HAクラスタリングソフトウェアでサービスの死活監視を行い、アクティブなサーバーをスタンバイ系のサーバーと切り替えて、システム停止を回避する仕組み
です。
LB/DNSラウンドロビン + 複数Webサーバー(スケールアウト)によるスケーラブルなシステム
前節で取り上げたフロントエンドのWebサーバーの多重化、スケールアウトによるロードバランシング(負荷分散)は、バックエンドのデータベースやアプリケーションサーバーがない環境でも機能します。
例えば、WordPressサイトを以下の様に構成して大規模アクセスに耐えるように構成できます。
プロキシサーバー(キャッシュサーバー)やCDN(Content Delivery Network)を活用したWebシステム
プロキシサーバー
ApacheやNginxなどのプロキシサーバー(リバースプロキシ機能)を用いると、クライアントからのリクエストのうち、
- 静的なコンテンツはキャッシュから配信する
- 動的なコンテンツ(例えばデータベースを参照して結果を動的に返す)については、アプリケーションサーバーで処理してレスポンスを返す
というように、アプリケーションサーバーの負荷やテナントネットワーク内のトラフィックを軽減することが可能になります。
CDN(Content Delivery Network)を活用したシステム
大規模の動画コンテンツ配信などを行う際に、一拠点にあるサーバーからコンテンツ配信を行うと、サーバーだけでなく、インターネット回線がいっぱいになってしまったり、動画の再生が途切れたり、再生までの時間が長くなってしまう、などの問題が発生します。 そこで、コンテンツを複数拠点のサーバーに分散させておき、地理的に最も近いサーバーからコンテンツ配信を行うための仕組みが用いられます。Content Delivery Network、コンテントデリバリーネットワーク、または略してCDNと呼ばれます。
例えば、Akamai社のサービスなどが有名です。また動画配信に限れば、YouTube, Vimeo, Brightcoveなどの動画配信および配信用の変換サービスを提供する事業者もいます。
CDNを使う場合には、オリジナルのコンテンツをCDNサービスの管理画面などからオリジンサーバーと呼ばれるサーバーにアップロードします。
オリジンサーバーは配信用のデータ変換(動画の場合にはトランスコード、複数の回線速度で切り替えて配信できるように、複数のビットレートに変換する)を行った後、各拠点にあるキャッシュサーバー(エッジノード)にデータを複製していきます。
こうした仕組みを用いることで、できるだけ配信サーバーの負荷や回線消費量を抑え、配信サービスの遅延や再生できないトラブルを減らすことが可能になります。
メッセージングキューを活用した非同期データ処理システム
メッセージングシステムは、異なるサーバー間で処理を連携するための仕組みです。サーバー間のメッセージは所定のフォーマットのXMLファイルなどで記述され、アプリケーションにできるだけ依存しない形でデータの受け渡しを行い、柔軟に連携を図ることができます。こうしたアプリケーションやシステムに依存しない連携は「疎結合」と呼ばれています。
メッセージングシステムを構成する要素としては、以下のようなものがあります。
- メッセージプロデュ―サー: メッセージを送信するアプリケーション
- メッセージキュー: メッセージを格納するところ。キューは列という意味。
- メッセージブローカー: メッセージを中継するノード
- メッセージコンシューマー: メッセージを受け取るシステム
メッセージングブローカーには、オープンソース(Apacheライセンス)で開発されているActiveMQなどがあります。
執筆者紹介
・太田 俊哉
・井上 博樹
このドキュメントは、LinuCレベル2の学習用の教材から抜粋して作成されたものです。教材全体は以下のPDFファイルをご覧ください。
LinuCレベル2学習教材
[1] PHP-FPM、FastCGI Process ManagerはApacheにもNginxにも対応しています。