樫山友一2002/8/27今回は、Webサイトの規模と信頼性による構成を解説します。第2回「Webサイト設計時の考慮点を知ろう」で、簡単に解説したものの詳細版です。Webサイトの性質によってどの部分を強化するべきか、あるいはどの部分の信頼性を上げるかなどでサイト全体の構成が決まってきます。Webサイトにおいて、信頼性とパフォーマンスは密接な関係にあります。クラスタは、パフォーマンスの向上に利用可能ですが、信頼性の向上にも利用することができます。そのため設計前に、Webサイトのパフォーマンスを強化すべきか、あるいは信頼性を高めるべきか、をあらかじめ明確にしておく必要があります。同時にWebサイトの性質も把握しておく必要があります。以下、Webサイトの設計において、事前に明らかにしておくべきことを列挙します。(静止画像など)静的コンテンツが多い(JSPやサーブレットで生成するHTMLなど)動的コンテンツが多いデータベースへのアクセスが多いダウンロードが多い上記の性質によって、Webサイト内のサーバの配置を検討します。Webサイトの性質がサイト全体の構成にどのような影響を与えるかを順次解説していきましょう。小規模なWebサイト小規模なWebサイトでは、基本的に図1のような構成をとります。Zone)を構成して1つのファイアウォールで実現します。実際にはDMZを構成して1つのファイアウォールで実現するただし、このような構成では、アプリケーションサーバやデータベースサーバの障害だけでサービスが停止してしまいます。この構成のままでパフォーマンスを上げようとすると、アプリケーションサーバとデータベースサーバのハードウェアの仕様をハイレベルなものにするしかありません。具体的には、CPUの数やメモリを増強するといったことです。このような構成は24時間連続稼働を強いられるサービスでは利用できないことになります。逆に、サービス停止がビジネスに大きなインパクトを与えることがない場合などにはこのような構成を利用してもいいでしょう。静的なコンテンツが多いWebサイトJ2EEのアプリケーションサーバは、HTTPサーバの機能を持っているものがほとんどなので、HTMLや画像をWebブラウザに送ることが可能です。アプリケーションサーバの本来の仕事は、データベースへアクセスをして、WebブラウザのリクエストごとにHTMLを生成することです。そのためには、アプリケーションサーバが動作するハードウェアのリソースを使うことが理想です。Webブラウザへの画像の送信は、ハードウェアのリソースを多く必要とするため、図3のように、静的なHTMLや画像をアプリケーションサーバの前段でWebブラウザに送り返す構成をとると、アプリケーションサーバが動作するハードウェアを理想的に利用することができるのです。図3の構成にDMZを適用すると、図4のようになります。DMZにはHTTPサーバのみが配置されます。HTTPサーバは、Webブラウザからの処理をアプリケーションサーバに中継します。その結果、WebブラウザはHTTPサーバと通信を行うだけになります。DMZからは直接データベースにアクセスすることがなくなるため、図2の構成と比較して強固なセキュリティを築くことができます。動的なコンテンツが多いWebサイト動的なコンテンツが多いということは、アプリケーションサーバの仕事量が多いということです。アプリケーションサーバのCPU数やメモリを増強しても対応ができない場合は、アプリケーションサーバをクラスタ化して対応します。アプリケーションサーバのクラスタ方式は基本的に図5のような構成をとります。アプリケーションサーバの基本的なクラスタ構成Webブラウザからの要求はHTTPサーバが受け、設定されているアルゴリズムにのっとってJ2EEアプリケーションサーバにフォワードされます。2つのアプリケーションサーバはすべての要求を均等に処理します。単純に考えると処理能力は2倍になりますが、リクエストごとに同じデータを参照・更新するケースが多い場合は、データベース側で排他制御がかかり、思ったよりも処理能力が上がらない可能性があります。これを回避するには、複数のアプリケーションサーバでデータベースを共有しても、処理が遅延しないように設計する必要があります。データベースへのアクセスが多いWebサイトデータベースへのアクセスが多い場合は、アプリケーションサーバでデータをキャッシュする構成をお勧めします(図6)。そのためには、設計時にどの技術を利用してキャッシュをするか決めなければなりません。J2EEでは、データベースへのアクセスは、EJBを用いて行うとトランザクションの制御が簡単に行えます。EJBを用いてキャッシュを行えれば、プログラムの作成はシンプルになります。効率的にデータをキャッシュするには、データベースとアプリケーションサーバを1対1で配置する構成にします。図5のようにクラスタ構成を採用すると、データが更新されたことをほかのアプリケーションサーバに通知する必要が出てきてしまい、その結果、このような通信が頻繁に発生すると処理能力を落とすことになってしまいます。クラスタ構成にするとデータをキャッシュすることが難しくなってしまうのです。このような場合は、設計時に参照が多いデータと更新が多いデータを明確に区分けしておきます。参照が多いデータはキャッシュするように設計します。この際、更新が多いデータとうまく分離してデータベースへのアクセスを少なくする必要があります。基本的には図7のような構成です。効率的にキャッシュを利用するためにはアプリケーションサーバ独自の機能を利用することができます。いくつかのアプリケーションサーバは、クラスタで共有してキャッシュしているデータを、書き込みのタイミングでフラッシュ(キャッシュを廃棄する)する機能を持っています。信頼性を重視するWebサイト24時間サービスを続けなければならないWebサイトは数多くあります。この場合、HTTPサーバ、アプリケーションサーバ、データベース、ネットワークのすべてを二重化して、どこかで障害が起きても動作し続けるような構成をとることが必要です。このようなサイトは、アクセス量も多いので処理能力も確保しなければいけません。すべてを二重化したシステム図8を例に考えてみましょう。Webブラウザからのアクセスは、まずロードバランサに渡されます。ロードバランサとは、受け付けたアクセスをHTTPサーバに振り分けるもので、ハードウェアとして提供されています。ロードバランサについても、障害発生後に動作を続けるよう構成しなければなりません。ロードバランサへの処理の振り分けはDNSラウンドロビンで行います。DNSラウンドロビンとは、1つのDNS名に複数のIPアドレスを割り当てる機能です。Webブラウザでは、あるURLをDNSから引こうとすると、複数のIPアドレスが順番に返ってきます。1つのロードバランサが障害で動作しない場合でも、もう1度アクセスを試みれば、動作している側のロードバランサに接続できるのです。次にHTTPサーバの障害を考えます。ロードバランサは一定周期でHTTPサーバの動作を監視する機能を持っていますが、もし、HTTPサーバが動作しない場合、ロードバランサは動作している方のHTTPサーバにのみ処理をフォワードします。アプリケーションサーバの障害は、前述のとおり、障害時にHTTPサーバが処理をアプリケーションサーバにフォワードしないようにすることで対応します。データベースについては、ベンダや製品により二重化の方法が異なります。単純にレプリケーションを取っておくものから、コールドスタンバイ、ホットスタンバイなどの構成を選択することもできます。規模やセキュリティ、処理能力などによってサーバの構成を決めることは、簡単なことではありません。実際には、経験豊かなエンジニアや企業から情報を得て、構成を決めることをお勧めします。ハードウェアの納入には時間がかかり、1度決めてしまった構成を変更することはなかなかできませんから。ゆういち)大手電機メーカー研究所でオブジェクト指向によるシステム開発に従事する。1996年よりJavaへの取り組みをはじめ、J2EEアプリケーションサーバを活用したWebシステム構築のコンサルタントとして多数のプロジェクトを手掛ける。2001年3月にイーズ・コミュニケーションズ株式会社の設立に参加し、最高技術責任者に就任。著書に「わかりやすいUML入門」、「Webサイトがわかる本」(いずれもオーム社)がある。(2017/5/9)ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。(2017/4/6)ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。(2017/4/3)初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。