WEBサイトのマルチAZ構成例

マルチAZイメージ

マルチAZ構成例

マルチAZ構成では、同等の機能を持ったサーバーを複数リージョンへ分散配置させることになります。サーバーが複数あることで、1台構成のときには問題にならなかったことが課題になってきます。

マルチAZ構成を組む時の最も大きな課題は「データの整合性」です。システムの特性にもよりますが、WEBサーバーなど同等の機能を持ったサービス間では同じデータを保持する必要があります。

データの整合性を確保しつつ、最適なコストで環境構築するためには、次のようなデータの整合性について考慮する必要があります。

・データベース
・セッション情報
・画像等の静的ファイル
・プログラムファイル
・ログ

以降で、各データの整合性についての考慮点を説明していきます。

データベース

データベースは「アクティブ/スタンバイ」の構成でマルチAZの環境を構築します。データの整合性はトランザクション単位で確保する必要があり、アクティブ側に障害が発生した場合に、素早くスタンバイ側へ切り替える必要があります。

Amazon RDSのマルチAZ機能を使うことで、AWS側でデータ同期と切り替えを自動で行ってくれます。このような構成を自社で構築しようとすると、かなりの工数と技術力が必要になるため、RDSの利用がおすすめです。

セッション情報

セッション情報の保存場所

ユーザーのログイン情報など、一時的な情報をセッション情報といいます。セッション情報は、読み書き頻度が高いため、WEBサーバー内のメモリに保存されることが多くあります。

セッション情報をメモリ上に保存している場合、WEBサーバーが1台の時は問題無く動作しますが、複数台になると都合が悪い自体が発生します。ログイン時に作成されたセッション情報はログアウトまで参照され続けなければなりません。しかしながら、ログイン時と次の遷移で別のサーバー上で処理が行われた場合、セッション情報が存在せずにログイン状態が維持されない事態が発生します。

それを回避するためには大きく分けて二つの方法があります。

・ELBで振り分けサーバーの固定を行う(StickySession)
・ElastiCacheなどインメモリのデータベースを使う

ELBで振り分けサーバーの固定を行う(STICKYSESSION)

ELBの「StickySession」という機能を利用し、ユーザー毎に処理するWEBサーバーを固定する方法があります。この機能を利用することで、特定のユーザーが必ず同じWEBサーバー上で処理されることができるので、サーバー上でセッション情報を保持していても問題の発生を回避することができます。

デメリットととしては、アクセスの偏りが発生する可能性があることです。ユーザーごとにアクセス先を決めていくので、ユーザーのアクセス傾向に偏りがある場合は、EC2の負荷状態が大きく変わる可能性があります。

また、各要素の関連性を限りなく少なくする疎結合を推奨しており、密結合になる「StickySession」の利用はおススメされていません。

ELASTICACHEなどインメモリのデータベースを使う

おススメの方法は、セッション情報をWEBサーバーではなく、インメモリデータベースのRedisなどに保存するやり方です。AWSであれば、ElastiCacheの利用が該当します。セッション情報をElastiCacheへ集約できるので、どのWEBサーバーからも同じ内容のセッション情報を参照・更新することが可能です。

同様の考えで、データベース上に保存する方法もありますが、パフォーマンスで問題が発生する可能性が高いのでおすすめできません。

画像等の静的ファイル

EFSで静的コンテンツを共有

画像などの静的コンテンツの共有方法も検討する必要があります。静的コンテンツが増えるタイミングは2つ考えられます。

・WEBサービスの利用者がアップロード
・管理者がアップロード

複数のWEBサーバー間で同じコンテンツを参照する必要があります。しかも、サービス利用者がアップロードする可能性があるので、参照だけでなく更新も同時に行えることが重要です。

AWSでは、ファイル共有サービスとして「Amazon Elastic File System(EFS)」が用意されています。EFSはEC2とNFSマウントが可能です。EFSを利用することで、WEBサーバー間で同一ファイルの参照・更新を行うことが可能です。

ただし、NFSマウントは、あまり性能が良くない。という課題があります。そのため、頻繁に読み書きが発生するファイルを保存する場合は注意が必要です。特に、プログラムファイルやログファイルはトラブルになることが多くあります。

プログラムファイル

lsyncdでプログラムを同期

プログラムをEFS上に置いた場合、アクセスが増えてくると性能の問題を引き起こすケースがあります。そのため、EFS以外の方法でファイル共有を検討する必要があります。

通常、プログラムを更新するのは管理者のみです。プログラムを更新する場合はマスタとなるサーバーを更新し、他のサーバーには自動同期させる。という運用ルールを決めることで、対応が可能です。マスタとなるサーバーで更新されたプログラムは、「lsyncd」等のミドルウェアを使い、自動的に他のWEBサーバーに反映させます。

他にも手動ですべてのWEBサーバーのコンテンツを更新する方法や、git等を使ってデプロイする方法も考えられるので、自社に合ったやり方を選択しましょう。

プログラムファイル

ログファイルの保存も検討が必要です。通常は、WEBサーバー自体に保存しておいても問題はありません。しかしながら、AutoScaling等を利用する場合は、サーバーの縮退とともにログも削除されてしまいます。それでは都合が悪い場合は、ログの保存場所も検討しましょう。

ログファイルにもよりますが、アクセスログなどは高頻度の読み書きが発生します。EFSなどに出力してしまうと、性能の問題を引き起こします。そのため、CloudWatchLogsやAmazon S3へ保存する方法がおススメです。

マルチAZにすることで、シングルAZと比較すると当然コストも上がってきます。ELB等要素が増えていきますが、おおむねシングルAZの2倍程度の費用感と考えておけば問題ありません。

アベイラビリティゾーン (Availability Zone) とは、「1つの AWSリージョン内でそれぞれ切り離され、冗長的な電力源、ネットワーク、そして接続機能を備えている 1つ以上のデータセンター」のことです。マルチAZ環境をAWS登場以前に実現しようと思うと、複数のデータセンターを借り、データセンター間の専用線接続を行うなど、非常に手間とコストがかかるものでした。AWSの登場により、劇的に導入しやすくなり、次のようなメリットを享受することができます。

サービス停止の可能性を減らせる

各アベイラビリティゾーンは、独立したデータセンターで構成されています。そのため、アベイラビリティゾーン自体に大規模な障害があった場合でも、もう一方のアベイラビリティゾーンは影響を受けずにサービスを継続して提供できる可能性が高まります。

AWSでは、「サーバーなどのハードウェアはいつか必ず壊れる」という前提で設計(Design for Failure)されています。日本国内では、「可能な限り壊れる確率を減らす」設計がされるのとは対照的な考え方です。

サービス構成SLA年間想定停止時間
EC2シングルAZ99.5%2,628分(43.8時間)/年
EC2マルチAZ99.99%52分/年

スケールアウトしやすい構成になる

複数台構成(マルチAZ)にすることで、スケールアウトしやすい構成にすることができます。

キャパシティを拡大するためには、サーバースペックを上げて対応する「スケールアップ」と、サーバーを増やして対応する「スケールアウト」があります。サーバースペックは上限がありますが、サーバー台数であれば上限を気にせず増やすことが可能です。一般的にはデータベースは「スケールアップ」、WEBサーバーやデータベースの参照系は「スケールアウト」でキャパシティの確保を行います。

各サーバーが1台の構成から複数台の構成に拡張するためには、この記事で紹介したような様々な考慮が必要になります。そのため、大きな工数と費用が必要です。その点マルチAZになっていれば、既に複数台で動作させるためのベースの考慮がされているため、容易に「スケールアウト」させることが可能です。

ただし、性能を最優先で考える場合は、マルチAZ間のレイテンシが性能劣化を引き起こす場合があります。目的次第では、シングルAZのほうが優れている場合があるので注意しましょう。