Amazon Web Services ブログ
Amazon ElastiCache を使用して、ハイブリッド型アーキテクチャのレイテンシーを削減する
クラウドに移行する際、組織が直面する課題の 1 つに挙げられるのは、限られたライセンスを持つ古いレガシーインフラストラクチャを、幅広い機能と従量課金制を提供できる環境に移行する、あるいはそのような環境に統合するための最善の方法があります。AWS には、分析や計画に役立つ多くのオプションが用意されています。それらに共通する 1 つのアプローチは、既存のデータセンターと AWS の間にハイブリッド環境を確立することです。
ハイブリッド環境では、データベース、アプライアンス機器、内部システムなどのオンプレミスリソースに関連するレイテンシーを軽減することが課題の 1 つです。これに対処できるソリューションは、数多くあります。このブログ記事ではそのうちの 1 つ、キャッシングを使用してレイテンシーを短縮し、パフォーマンスを向上させ、同時に耐障害性を向上させる方法について説明します。
シナリオ : 顧客が主に使用しているアプリケーションで、高いレイテンシーがある
今回検討するシナリオでは、顧客が使用する主なアプリケーションで高いレイテンシーを経験しており、日々の操作に影響していました。このアプリケーションとは、データベースによって駆動する検索機能を備えたオンラインのメディカルライブラリーです。次の図は、元のアーキテクチャを示しています。確認の結果、検索エンジンからのクエリの数が多いことが原因の、過負荷データベースの問題であることが分かりました。さらに、クエリの結果が非常に大きいため、顧客の低速なネットワークリンクが飽和状態になり、応答時間に影響を与えたのでした。
この問題を解決するソリューションの 1 つは、この記事では説明していませんが、データベースを Amazon RDS に移行し、読み取り専用インスタンスを有効にすることです。しかし、顧客のデータベースのライセンス条件により、AWS への移行ができませんでした。データベースを移行する際の別の課題は、アプリケーションとデータベースの統合です。システムが稼働中であったため、アプリケーション全体をライセンス制限のない別のデータベースエンジンに書き換えることはできませんでした。
提案するソリューション : Amazon ElastiCache によるインメモリキャッシュ
この問題にはバックエンドデータベースのレイテンシーが関係するため、Amazon ElastiCache でのインメモリキャッシュを使用して、ネットワークのレイテンシーを軽減し、データベースの負荷を軽減します。このソリューションでは、データ取得レイテンシーを劇的に短縮できます。また、Amazon ElastiCache は 1 秒あたり 2000 万を超える非常に高い要求速度を実現できるため、要求量も大幅に増加します。次の図は、提案するアーキテクチャを示しています。VPC 内のキャッシュをウェブサーバーおよびアプリケーションサーバーと共に使用すると、アプリケーションは AWS からローカルデータセンターに常に移動する必要がなくなります。この変更により、サーバー間の物理的な距離は関係なくなります。
このソリューションの別の利点は、ワークロードの追加的可用性と規模です。このアーキテクチャーを使用すると、ソースデータベースに障害が発生しても、アプリケーションに対してクエリを継続して実行できます。これは、結果がキャッシュに格納され、キャッシュから検索されるためです。
この新しいアーキテクチャだと、顧客エクスペリエンスが大幅に改善するはずです。
ElastiCache の背景
Amazon ElastiCache は、Redis および Memcached と互換性のある、完全管理型で低レイテンシーのインメモリデータストアです。ElastiCache は Redis と Memcached の管理に関連する管理タスクがほとんどなくなるため、ビジネスとデータに集中することが可能となります。このサービスは、低速ディスクを使ったデータベースに完全に依存する代わりに、高速でかつ管理されたインメモリデータストアから情報を取得できるようにすることで、ウェブアプリケーションのパフォーマンスを向上させます。ElastiCache では、障害の発生したノードを自動的に検出し置き換えるため、セルフ管理型のインフラストラクチャに伴うオーバーヘッドが減少します。したがって、ElastiCache は、ウェブサイトとアプリケーションのロード時間を遅らせる過負荷データベースのリスクを緩和する回復力のあるシステムを実現できます。
始める前に知っておくこと
提案するソリューションの一環として、このブログ記事では、ElastiCache クラスターを作成するプロセスを解説しています。これを行うには、以下のリソースが必要です。
- AWS マネジメントコンソールにアクセスします。
- AWS 上で動作する 1 つ以上のウェブサーバーとアプリケーションサーバー
- クラスターへのアクセスを許可するウェブサーバーとアプリケーションサーバーの IP アドレス
- オンプレミスで実行するアクセス認証情報がある 1 つのデータベース
- このデータベースのサーバーアドレスとログイン認証情報
- デモをダウンロードしてデプロイするための Git。デモのソースコードは GitHub でホストされています。
投稿とデモに使用するソフトウェアスタックは、次のとおりです。
- ウェブサーバーとしての Apache
- アプリケーションサーバーとしての PHP
- データベースサーバーとしての MySQL
このような環境がない場合に、完全な環境をデプロイするためのデモが含まれており、これでソリューションをテストします。このデモには、Amazon EC2 ウェブインスタンス、ElastiCache クラスター、および RDS MySQL データベースが含まれています。
デモでは、MySQL をデータベースエンジンとして使用します。ですが、ソースコードをダウンロードした後は、お好みのデータベースを使ってコードをカスタマイズすることができます。
Amazon EC2 セキュリティグループの設定
ElastiCache クラスターを作成する前に、クラスターへのアクセスを制御するセキュリティグループが必要です。セキュリティグループは、クラスターのトラフィックを制御する仮想ファイアウォールとして機能します。
セキュリティグループを作成するには、AWS コンソールにサインインし、EC2 サービスページに移動します。そこのナビゲーションペインで [Security Groups] を選択し、次の図に示すように [Create Security Group] を選択します。
複数の VPC がある場合は、ウェブおよびアプリケーションインスタンスを含む VPC を選択する必要があります。[Source] の場合は、キャッシュクラスターにアクセスするウェブサーバーまたはアプリケーションサーバーのプライベート IP アドレスを指定します。
ポート番号は、選択した ElastiCache エンジンによって異なります。この記事では、次の図に示すように、Redis のデフォルトポート (6379) を使用しています。
ElastiCache クラスターの設定
ElastiCache クラスターを有効にするには、次の手順に従います。
AWS コンソールにサインインし、ElastiCache サービスページに移動します。初めてこのページに行った場合、「Get Started」画面が表示されます。次のスクリーンショットに示すように、[Get Started Now] を選択して最初のクラスタを作成します。
アカウントに既にキャッシュクラスターがある場合は、ElastiCache ダッシュボードで [Create] ボタンを選択してください。
初めてクラスターを作成する際に、お好みのエンジンを選択するオプションがあります。
- Redis は、高速データベース、キャッシュ、メッセージブローカー、およびキューとして使用するためのインメモリデータストアです。Redis の ElastiCache は、自動フェイルオーバー機能を備えた Multi-AZ を装備しています。また、強化した Redis をベースとして使用することで、堅牢性と安定性が向上しています。このエンジンは広く普及しており、ウェブアプリケーション、ゲーム、モバイル、e コマース、IoT などのたくさんのユースケースに使用されています。
- Memcached は、動的ウェブアプリケーションを高速化するために設計された高性能メモリオブジェクトキャッシングシステムです。統合の例としては、Drupal、WordPress、Joomla などがあります。
この記事では、複雑なデータ型のサポート、キーストアの永続性、転送中および保存中の暗号化、バックアップと復元の機能に関して、Memcached ではなく Redis を使用しています。最適なエンジンの選択の詳細については、「Choosing an Engine」を参照してください。これは「ElastiCache ユーザーガイド」の中にあります。
Redis エンジンには、次の 2 つのオプションがあります。
- Redis (非クラスター化モード): Redis 2.8.x および Redis 3.2.x。このモードは、複雑なデータ型、インメモリデータセット、キーストアの永続性、レプリケーション、自動フェイルオーバー、およびバックアップと復元の機能が必要な場合に使用します。このモードでは、数多くのデータベースをサポートできます。
- Redis (クラスター化モード): このモードは Redis 2.8.x のすべての機能を備えていますが、データパーティショニングをサポートする単一のデータベースとして構成されています。
分かりやすくするため、この記事では Redis (クラスター化) の代わりにRedis (非クラスター化) を使用しています。これだと、ネットワークレイテンシーの削減とパフォーマンスの最適化という本筋に集中できるからです。大量のデータを使用するアプリケーションの実稼働では、データパーティションを有効にするために Redis (クラスタ化モード) を使用することをお勧めします。
ここでのソリューションでは、Redis 3.2.6 を使用しています。Redis のこのバージョンが、現在のところ、転送中および保存中での暗号化をサポートする唯一のバージョンだからです。
次のステップでは、いくつかのオプションを選択します。これには、ストレージに必要なメモリ量に直接関連するノードのタイプが含まれます。ここでのオプションには、Redis のバージョン (古いクライアントバージョンの場合) と、ElastiCache クラスター内のレプリカの数も含まれます。ElastiCache インスタンスの各グループは、単一ノードであってもクラスターと呼ばれます。
レプリカの数は、リードレプリカの集まりの中の、項目数を示します。アプリケーションはこれらのリードレプリカを使用して読み取りを行い、読み取りスループットを向上させ、ノード障害時のデータ消失を防止します。
次のスクリーンショットは、この手順で選択した Redis 設定を示しています。次のスクリーンショットに示す [Advanced Redis settings] セクションで、Multi-AZ フェイルオーバーを有効にできます。この機能は、プライマリノードに障害が発生した場合に、リードレプリカへの自動フェイルオーバーによる高可用性を実現します。
初めてクラスターを作成するときは、サブネットグループを作成する必要があります。サブネットグループとは、ElastiCache クラスターが稼働中の VPC 内のサブネット (通常はプライベート) の集合のことです。耐障害性を実現するには、少なくとも 2 つのサブネットを使用することをお勧めします。この 2 つのサブネットはそれぞれ異なるアベイラビリティーゾーンにあります。
ElastiCache は、Redis クラスターのノードを複数のアベイラビリティーゾーンに分散させるため、[Preferred availability zone (s)] を [No preference] としておきます。次のスクリーンショットに示す [Security] セクションでは、ウェブサーバーおよびアプリケーションサーバーのクラスターへのアクセスを許可するため以前作成したセキュリティグループを選択します。また、アプリケーションが医療情報と連携するため、データの保護のために、送信中および保存中の暗号化を有効にします。送信中および保存中の暗号化の詳細については、AWS Security Blog の「Now You Can Use Amazon ElastiCache for Redis with In-Transit and At-Rest Encryption to Help Protect Sensitive Information」を参照してください。
Redis AUTH オプションを有効にする際、Redis AUTH トークンが必要です。このオプションを使用すると、Redis コマンドを実行する権限を与える前に、ユーザーがパスワードを入力する必要があるため、データのセキュリティが向上します。「Redis AUTH によるユーザーの認証」 の詳細を参照してください。これは「ElastiCache ユーザーガイド」の中にあります。次のステップでは、クラスターのバックアップウィンドウの値を選択します。バックアップウィンドウは、ElastiCache に永続性をもたせるため、毎日のスナップショットを取り込む期間のことです。ここでは、バックアップの保存期間を選択することもできます。次のスクリーンショットで、利用できるオプションが示してあります。他のパラメータはどれも変更せずに、[Create] を選択してクラスターを作成します。次のスクリーンショットで、クラスターの作成状況が示されます。数分後には、クラスターを使用できるようになります。次のスクリーンショットでは、クラスターの使用準備ができていることが分かります。その他の詳細とともに、エンドポイント (クラスターを使用するために接続するアドレス) も見ることができます。
アプリケーションの統合
実装を完了するには、次に Redis サポートを追加するようにアプリケーションを設定します。このプロセスはアプリケーションによって異なるため、この記事では取り上げません。
次に、Amazon ElastiCache for Redis を使用してパフォーマンスの向上をテストできるように、サンプル PHP アプリケーションを用いて完全な環境をデプロイします。
サンプルの PHP アプリケーションを使用して、完全な環境をデプロイする
ソリューションをテストするために、環境とその依存関係をデプロイする AWS CloudFormation テンプレートを用意しました。AWS CloudFormation の機能により、開発者やシステム管理者は、予測可能かつ秩序立った方法でプロビジョニングと更新が可能となったため、関連する AWS リソースのコレクションを簡単に作成できるようになりました。
テンプレートは次のリソースを作成します。
- PHP と phpredis の拡張子を持つ Amazon EC2 インスタンスと Apache ウェブサーバー
- Redis クラスター用 Amazon ElastiCache
- Amazon RDS MySQL データベース
- TLS/SSL のサポートを含んだ Redis クライアントライブラリーの Predis
- クエリのパフォーマンスをテストするサンプル PHP アプリケーション
Java、PHP、Ruby、Python などの多くの言語で、数多くの Redis クライアントと拡張機能があります。このデモでは、phpredis の拡張機能を使用しています。ソースコードは GitHub でホストされているので、ソースコードをダウンロードするには Git が必要です。
ソースコードをダウンロードするには、EC2 インスタンスまたは自身のワークステーションで git clone コマンドを実行します。
ウェブサーバー (EC2 インスタンス) をデプロイするには、EC2 キーペアが必要です。まだキーペアがない場合は、EC2 コンソールで [Key Pairs] を選択し、新しいキーペアを作成します。このプロセスでは、プライベートキーの保存を求めるプロンプトが表示されます。プライベートキーファイルは、ウェブインスタンスにログインしてサンプル PHP ファイルをカスタマイズするのに使用するため、プライベートキーファイルを安全に保ちましょう。
注 : Amazon はライベートキーのコピーを保持しません。プライベートキーを失っても、それを復元する方法はありません。
テンプレートをデプロイするには、CloudFormation コンソールで次のスクリーンショットのように新しいスタックを作成してください。[Upload a template to Amazon S3] を選択し、GitHub からダウンロードした elasticache-hybrid-architecture-demo ディレクトリを検索するため、[Browse] を選択します。次に cloudform-template.yaml というファイルを選択します。次のスクリーンショットに示すように、[Next] を選択します。
スタックに名前を付け、必要に応じてパラメータを置き換えます。簡単にするため、パラメータはセクションにグループ化されています。[Main Configuration] セクションのパラメータを置き換えるだけです。
- IP アドレス : EC2 インスタンスセキュリティグループは、この IP アドレスにのみ HTTP ポートを開きます。IP アドレスの末尾に /32 を含めることを忘れないでください。
- キー名 : これは、テンプレートが作成した Amazon EC2 インスタンスにログインするために使用するキーペアです。必ず自身のキーペアを選択してください。
- DB パスワード : このパスワードは、テンプレートが作成した新しい RDS データベースにログインするためのパスワードで、サンプル PHP アプリケーションでも必要です。
- キャッシュトークン : EC2 インスタンスと ElastiCache クラスター間の通信を保護するために使用するトークン。
- VPC : EC2、ElastiCache クラスター、および RDS インスタンスをデプロイしている VPC。
- サブネット : ウェブインスタンスをデプロイしているサブネット
データベースのパスワードを除き、すべてのパラメータは demo.php スクリプトを前もって設定するのに使用します。
注 : 現在の時点では、CloudFormation テンプレートでは、保存中および転送中の暗号化はサポートされていません。
テンプレートには、タグ、インスタンスサイズ、エンジン、エンジンのバージョンなどを変更できるパラメータが含まれています。ただし、次のスクリーンショットに示すように、現時点のデフォルト値を受け入れ、[Next] を選択し、続行できます。
次のスクリーンショットに示すように、[Next] を選択します。これは [Options] スクリーンにあります。テンプレートは、EC2 インスタンス用の IAM リソースを作成します。したがって、次のスクリーンショットに示すように、[I acknowledge that AWS CloudFormation might create IAM resources] チェックボックスをオンにすることを忘れないでください。そうしないと、デプロイメントが失敗します。
[Create] を選択してスタックを作成します。スタックのステータスが CREATE_IN_PROGRESS から CREATE_COMPLETE に変わるまで待ちます。
次のスクリーンショットに示す [Outputs] タブには、テンプレートが作成したリソースのアドレスがあります。DemoScript が、サンプル PHP アプリケーションにアクセスするためにウェブブラウザで開く必要のある URL を示します。
サンプル PHP アプリケーションを使用する
ウェブブラウザで DemoScript の URL を開き、サンプル PHP アプリケーションにアクセスします。フォームには、テンプレートのデプロイ時に使用するデータベースの認証情報があらかじめ入力してあります。アドレスにアクセスするたびに、データベースのパスワードが必要です。次のスクリーンショットは、サンプルアプリケーションインターフェイスを表示しています。
このアプリケーションでは、クエリを実行してデータベースからの応答時間 (キャッシュなし) とキャッシュからの応答時間を比較できます。
デフォルトでは、データはデータベースにロードされていません。[Load Sample] ボタンを使って、crimes というサンプルテーブルを作成し、サンプルデータをそこにロードします。このデータセットは、2012 年から 2015 年までのロサンゼルスでの犯罪に関する公開データです。ロードプロセスが終了したら、SHOW、SELECT、DESCRIBE などのクエリを PHP アプリケーションから直接実行できます。
[Test Query] を選択すると、AJAX リクエストがスクリプト run.php に送信されます。このスクリプトはクエリを受け取り、キャッシュを参照するキーとして使用するハッシュを生成し、キーがキャッシュに既に存在するかどうかを確認します。キーがキャッシュに存在する場合、スクリプトはデータベースに接続せずにキャッシュから結果を返します。キーがキャッシュ内に見つからない場合、スクリプトはデータベースに接続し、クエリを実行し、結果をキャッシュに保存し、データベースから結果を返します。
初めてクエリを実行するとき、PHP アプリケーションはキーがキャッシュにまだ存在しないため、結果をデータベースから直接返します。次のスクリーンショットでは、この初めての実行を示しています。クエリを 2 回実行すると、結果がデータベースではなくキャッシュから返されるため、2 回目の実行はかなり速くなります。次のスクリーンショットは、キャッシュからの結果を示しています。[Clear] ボタンを使って Redis キャッシュを消去し、データベースに対して直接クエリを実行できます。
セキュリティに関するアドバイス
この記事では、ハイブリッドアーキテクチャに焦点を当てています。したがって、ご使用の環境ですべてのスクリプトを (カスタマイズして) 使用できます。ただし、適切なセキュリティ対策を講じてデータを保護する必要があります。本番環境では、暗号化を有効にし、セキュリティグループに対して必要最小限のアクセスを使用し、その他の標準的なセキュリティプラクティスを実行した方がよいでしょう。ElastiCache および AWS セキュリティの詳細については、次のページを参照してください。
- 「データセキュリティ」および「Redis 用 ElastiCache コンプライアンス」。これは「Amazon ElastiCache ユーザーガイド」の中にあります。
- AWS ウェブサイトの「AWS クラウドセキュリティ」
結論
Amazon ElastiCache は、AWS 上にワークロードを持つハイブリッドアーキテクチャのレイテンシーを短縮する効果的なソリューションです。同時に、ElastiCache を使用すると、パフォーマンスを向上させ、データベースに障害が発生した場合に備えて耐障害性を追加することができます。現在の Amazon ElastiCache のユースケースの詳細については、McDonald’s、Airbnb、Duolingo、Expedia、Hudl などの顧客による導入事例を参照してください。
次のステップ : 試してみて、高性能なインメモリキャッシュを使用したご感想をぜひ教えてください!
著者について
Angel Leon は、公共部門のエンタープライズアカウントを担当するアマゾン ウェブ サービスのシニアソリューションアーキテクトです。 政府機関で 8 年間働いたことがあり、過去 5 年間はクラウドソリューションでクラウドの世界に打ち込んできました。ラテンアメリカおよびカリブ海地域での公共および商用部門の顧客に向けたクラウド導入ソリューションのパイオニアです。