ウェブアプリケーションのための一般的な5つのサーバーセットアップ
以下は、「イントロダクション」という文の日本語の同意義の表現です。
1. 初めに
2. 導入
3. はじまり
4. イントロ
5. 始まり
環境にどのサーバーアーキテクチャを使用するかを決定する際には、パフォーマンス、スケーラビリティ、可用性、信頼性、コスト、および管理など、多くの要素を考慮する必要があります。
このチュートリアルでは、一般的に使用されるサーバーセットアップについて、それぞれの短い説明を含めて学びます。メリットとデメリットも説明します。ここでカバーされているすべての概念は、互いにさまざまな組み合わせで使用することができ、すべての環境には異なる要件があるため、正確な構成は一つだけではありませんので、ご留意ください。
すべてのものを1つのサーバーにセットアップする。
一つのサーバーのセットアップ方法は、環境全体が一つのサーバーに存在する場合です。典型的なウェブアプリケーションでは、ウェブサーバー、アプリケーションサーバー、およびデータベースサーバーが含まれます。このセットアップの一般的なバリエーションは、LAMPスタックと呼ばれるもので、Linux、Apache、MySQL、PHPが一つのサーバー上に配置されます。この方法の一つの利用ケースは、迅速にアプリケーションをセットアップしたい場合です。このような基本的なセットアップは、アイデアのテストや簡単なウェブページを作成するために使用できます。
残念ながら、これにはスケーラビリティやコンポーネントの分離についてはほとんど提供されていません。さらに、アプリケーションとデータベースはCPU、メモリ、I/Oなど、同じサーバーリソースを争うことになります。その結果、パフォーマンスが低下し、根本原因を特定するのが困難になる可能性があります。また、1つのサーバーを使用することは、水平方向のスケーラビリティには適していません。水平スケーリングについては、弊社の「データベースシャーディングの理解」チュートリアルで詳しく学ぶことができます。また、Ubuntu 22.04にLAMPスタックをインストールする方法についても、弊社のチュートリアル「LAMPのインストール方法」で詳しく学ぶことができます。以下は、1つのサーバーを使用した場合の視覚的な表現です。
独立したデータベースサーバーの設定
データベース管理システム(DBMS)は、アプリケーションとデータベース間のリソース競合を解消し、データベースをDMZや公開インターネットから取り除くことによりセキュリティを向上させるため、環境の他の部分から分離することができます。
以下は、日本語にネイティブな表現で言い換えたものです(一つのオプションのみ):
この機能を使用すると、アプリケーションの設定が迅速に行え、アプリケーションとデータベースが同じシステムリソースを争うことを防げます。また、各アプリケーションとデータベースのティアを個別に垂直スケールすることも可能です。必要な容量を増やすことで、いずれのサーバーにもリソースを追加できます。セットアップによっては、データベースをDMZから分離することにより、セキュリティも向上させることができる場合もあります。
この設定は、単一のサーバーよりも少し複雑です。2つのサーバー間のネットワーク接続が地理的に離れている場合、高いレイテンシなどのパフォーマンスの問題が発生する可能性があります。また、データの転送量に対して帯域幅が低すぎる場合にもパフォーマンスの問題が発生することがあります。このようにMySQLを使用してサイトのパフォーマンスを最適化するためのリモートデータベースの設定方法については、以下のリンクで詳細を読むことができます。次は、別のデータベースサーバーを使用した視覚的な表現です。
ロードバランサー(逆プロキシ)の設定
サーバー環境のパフォーマンスと信頼性を向上させるために、ロードバランサーを追加することができます。これにより、ワークロードが複数のサーバーに分散されます。ロードバランスされたサーバーのうちの1つが障害を起こした場合、他のサーバーがそのサーバーの回復までトラフィックを処理します。また、レイヤー7のアプリケーションレイヤーリバースプロキシを使用することで、同じドメインとポートを介して複数のアプリケーションを提供することもできます。リバースプロキシロードバランシングのいくつかのソフトウェアの例には、HAProxy、Nginx、およびVarnishがあります。
以下は、日本語での類似表現です:
追加のサーバーによるスケーリングが必要な環境、または水平スケーリングとも呼ばれる環境において、ロードバランサーの設定を行うことで、さらなるサーバーの追加による環境容量を拡張することが可能です。また、クライアント接続の数や頻度を適正な範囲に制限することで、DDOS攻撃からも保護することができます。
ロードバランサーの設定が十分なリソースを持っていない場合、または設定が不適切な場合、パフォーマンスのボトルネックを引き起こす可能性があります。また、SSLの終了をどこで行うかや、スティッキーセッションを必要とするアプリケーションの処理方法など、追加の考慮事項が発生する場合もあります。さらに、ロードバランサーは単一の障害点であり、それがダウンするとサービス全体が停止する可能性があります。ハイアベイラビリティ(HA)のセットアップは、障害点のないインフラストラクチャです。HAセットアップの実装方法については、Reserved IPsに関する当社のドキュメントをご覧いただけます。HAProxyとロードバランシングの概念に関するガイドもご覧いただけます。以下は、ロードバランサーの設定のビジュアル表現です。
HTTPアクセラレーター(キャッシュリバースプロキシ)の設定
HTTPアクセラレータ、またはキャッシュHTTPリバースプロキシは、さまざまなテクニックを使ってユーザーへのコンテンツ提供時間を短縮するために使用されます。HTTPアクセラレータで利用される主なテクニックは、ウェブまたはアプリケーションサーバーからのレスポンスをメモリ上にキャッシュし、同じコンテンツに対する将来のリクエストを迅速に応えることです。Varnish、Squid、NginxなどのHTTPアクセラレーションが可能なソフトウェアのいくつかの例があります。使用例としては、コンテンツの多い動的ウェブアプリケーションや頻繁にアクセスされるファイルが多い環境で利用されます。
HTTPアクセラレーションは、ウェブサーバー上のCPU負荷を軽減することで、サイトのパフォーマンスを向上させることができます。キャッシュと圧縮により、ユーザーキャパシティーも増加します。また、逆プロキシロードバランスとしても使用することができ、一部のキャッシュソフトウェアはDDOS攻撃から保護することもあります。ただし、キャッシュヒット率が低い場合にはパフォーマンスが低下することがあり、最適なパフォーマンスを引き出すために調整が必要です。以下はHTTPアクセラレータの設定のビジュアル表現です。
プライマリレプリカデータベースレプリケーションの設定
多くの読み取り操作を行うデータベースシステム(例えばCMS)のパフォーマンスを向上させる方法の一つは、プライマリ-レプリカデータベースのレプリケーションを使用することです。レプリケーションには、プライマリノードと1つ以上のレプリカノードが必要です。この設定では、すべての更新はプライマリノードに送信され、読み取り操作はすべてのノードに分散されます。アプリケーションのデータベース層の読み取りパフォーマンスを向上させるための使用例です。プライマリ-レプリカデータベースのレプリケーションを設定することで、読み取り操作をレプリカ間で分散させることができ、更新処理に専念するため読み取り要求に時間を費やすことなく、書き込みパフォーマンスを向上させることができます。
プライマリ-レプリカデータベースのレプリケーションのデメリットの一部は、データベースにアクセスするアプリケーションがどのデータベースノードに更新や読み取りのリクエストを送信するかを決定する仕組みを持っている必要があることです。また、プライマリが失敗した場合、データベースの更新は問題が修正されるまで行えません。また、プライマリノードの障害が発生した場合、組み込みのフェイルオーバー機能はありません。以下は、単一のレプリカノードを持つプライマリ-レプリカのレプリケーション設定の視覚的表現です。
コンセプトの結合
次のように日本語での同義表現を提供いたします:
応用サーバーだけでなく、キャッシュサーバーも負荷分散させ、データベースの複製を単一の環境で使用することが可能です。これらの技術を組み合わせる目的は、問題や複雑さを増やすことなく、それぞれの利点を得ることです。以下は、この種のサーバー環境の設定例の図です。
例えば、ロードバランサーが静的なリクエスト(画像やCSS、JavaScriptなど)を認識してキャッシュサーバーに直接送り、それ以外のリクエストはアプリケーションサーバーに送るように設定されているシナリオを想像してください。
ユーザーが動的コンテンツのリクエストを送信する際のプロセスの詳細を以下に示します。
-
- ユーザーはhttp://example.com/(ロードバランサー)から動的なコンテンツを要求します。
-
- ロードバランサーは要求をアプリバックエンドに送信します。
-
- アプリバックエンドはデータベースから読み取り、要求されたコンテンツをロードバランサーに返します。
- ロードバランサーは要求されたデータをユーザーに返します。
ユーザーが静的なコンテンツを要求する場合、次のプロセスが適用されます。
-
- ロードバランサーは、キャッシュバックエンドをチェックして、リクエストされたコンテンツがキャッシュされているか(キャッシュヒット)キャッシュされていないか(キャッシュミス)を確認します。
-
- コンテンツがキャッシュヒットの場合、それは要求されたコンテンツをロードバランサーに返し、プロセスの最後のステップに進み、データをユーザーに返します。コンテンツがキャッシュミスの場合、キャッシュサーバーはロードバランサーを介してアプリバックエンドにリクエストを転送します。
-
- ロードバランサーはリクエストをアプリバックエンドに転送します。
-
- アプリバックエンドはデータベースから読み取り、要求されたコンテンツをロードバランサーに返します。
-
- ロードバランサーは応答をキャッシュバックエンドに転送します。
-
- キャッシュバックエンドはコンテンツをキャッシュし、それをロードバランサーに返します。
- ロードバランサーは要求されたデータをユーザーに返します。
この環境には、ロードバランサーとプライマリデータベースサーバーの2つの単一障害点が残っていますが、前のセクションで説明された信頼性とパフォーマンスの利点を提供しています。
結論
あなたが基本的なサーバーのセットアップに慣れ親しんだ今、自分自身のアプリケーションにどのようなセットアップを使うかについて良いアイデアを持っているはずです。自分の環境を改善しようとしている場合は、多くの複雑さを急に導入しないようにするために反復的なプロセスが最適であることを覚えておいてください。