Amazon Web Services ブログ
Amazon DocumentDB と Amazon ElastiCache を使用したパフォーマンスのためのキャッシング
技術の世界で、キャッシュはどこにでもあるものです。CPU は L1、L2、および L3 キャッシュを使用し、携帯電話はアプリのデータをローカルにキャッシュします。ストリーミングサービスはエッジでコンテンツをキャッシュし、ブラウザーは画像をキャッシュするなどです。
同じことは、データベースにも言えます。
もし、ゲームのサイトで、毎回リーダーボードが表示され、そのたびに、クエリが合計を行い、ゲームのすべてのプレーヤーをソートする必要があったらどうでしょうか。または、eコマースのサイトに行くたびに、特定の製品の価格をそれぞれの顧客のディスクから読み取らなければならないとしたらどうでしょうか。パフォーマンスは受け入れがたいものであり、コンピューティングの量でコストはかなり高額になります。
データベースで、キャッシングの主な動機として、パフォーマンスとコスト節約の 2 つが挙げられます。ミリ秒のパフォーマンスでは十分ではないときにマイクロ秒のパフォーマンスを求める場いいでも、一般的に使用されるデータをキャッシングすることにより、データベースから費用のかかる運用を外したい場合などです。
ソリューションの概要
この記事では、Amazon DocumentDB (MongoDB 互換性を使用) および Amazon ElastiCache を統合して、マイクロ秒の応答時間を達成し、コスト全体を減らす方法を示します。次の図では、この記事のソリューションに対するアーキテクチャを示しています。
この例の運用データベースは、Amazon DocumentDB です。これは高速で信頼性があり、容易にクラウドでの Mongo DB互換のデータベースをセットアップ、運用、およびスケールすることができる完全管理型のデータベースです。Amazon DocumentDB で、MongoDB で使用しているものと同じアプリケーションコードを実行し、同じドライバ、およびツールを使うことができます。
Amazon DocumentDB の柔軟性のあるドキュメントモデル、データタイプ、インデックス作成機能を使用して、コンテンツを素早く、直感的に保管し、クエリすることができます。たとえば、ショッピングサイトやカタログのユーザーレビューやでもビデオ、POS 端末の在庫リスト、トレーディングプラットフォームの財務取引などです。
キャッシングレイヤーの場合、Amazon ElastiCache を使用します。これは、AWS の分散型メモリ内キャッシュ環境を容易にセットアップ、管理、スケールできるようにします。ElastiCache は高いパフォーマンス、サイズ変更可能で、コスト効率の良いメモリ内キャッシュを提供する一方で、分散型キャッシュ環境のデプロイと管理に関連付けられた複雑性を排除します。ElastiCache は、Redis と Memcached エンジンの両方と互換性があります。
気に入った歌を見つけることができるようにするアプリケーションを構築することにより、これらの 2 つのサービスを統合する方法を示します。REST API クライアントを使用して、アプリケーションのエンジンに歌のタイトルを送信します。
アプリケーションエンジンは、要求された歌の歌手の名前と可視を含むドキュメントを ElastiCache レイヤーから取得することにより、API 要求を処理します。その歌の要求がすでに前もってあった場合、ElastiCache による読み取りが行われます。そうではない場合、アプリケーションエンジンは Amazon DocumentDB にクエリし、要求されたドキュメントを JSON ドキュメントとしてアプリケーションに返します。
アプリケーションは ElastiCache のコピーをキャッシュして、同じ歌のその後の要求の応答時間をスピードアップします。この例の場合、私は、キャッシングレイヤーとして Amazon ElastiCache for Redis。REST API クライアントとして Postman を使用します。Postman アプリは、REST API のテストのためのオープンソースツールです。
Amazon DocumentDB クラスターを作成する
クラスターの作成に関する詳細については、クラスターの使用開始を参照してください。
- Amazon DocumentDB コンソールを開きます。
- 新しいクラスターを作成します。
- クラスターの ID wo入力します。
- 適切なインスタンスを選択します。
- インスタンス数のデフォルト値をそのままにします。
- マスターユーザー名とパスワードを定義します。
- 以下のスクリーンショットで示されているように、[クラスターの作成] を選択します。
Redis クラスター用 ElastiCache を作成する
次のスクリーンショットに示されているように、以下のステップを使用して、Amazon ElastiCache for Redis クラスターを作成します。
- AWS マネジメントコンソールから、[サービス] の下の ElastiCache を検索します。
- ElastiCache ダッシュボードから、[Redis] を選択し、[作成] を選びます。
- Redis 設定を記入します。この例では、デフォルトポート 6379 を使用します。
EC2 インスタンスを作成する
Amazon EC2 インスタンスで歌のアプリケーションをホストします。
- EC2 Linux インスタンスを作成します。それには、パブリック IP アドレスがあることを確認します。
- キーペアでインスタンスを開始します。
キーペアファイル (.pem) をダウンロードします。これは、新しく作成したインスタンスと関連付けられたプライベートキーを保存し、以下のコマンドを使用するようにそれに接続します。たとえば、キーペアファイルに my-key-pair.pem という名前を付け、EC2 インスタンス DNS が ec2-198-51-100-1.compute-1.amazonaws.com の場合、コマンドは次のようになります。
クラスターに接続する
Amazon DocumentDB と ElastiCache クラスターに接続するためには、2 つのクラスターのセキュリティグループを更新して、それぞれ TCP ポート 27017 と 6379 にインバウンドトラフィックを許可します。
また、デモアプリケーションが次のスクリーンショットで示されているように、リスンしている TCP ポート 8082 の EC2 インスタンスのセキュリティグループでインバウンド接続を有効にします。
MongoDB シェルをインストールする
次に、EC2 インスタンスに MongoDB シェルをインストールします。MongoDB シェルのインストールの手順は、YouTube または 入門 ガイドで見つかる場合があります。
接続を検証する
次の問題を使用して、EC2 インスタンせから Amazon DocumentDB クラスターに接続できることを確認してください。
ここで、次の keys * コマンドを使用して、キャッシュに現在あるものを確認します。
出力はキャッシュが空であることを確認します。
アプリエンジンの構築
これで、Amazon DocumentDB データベースと ElastiCache の両方に接続され、別の EC2 インスタンスで Node.js アプリエンジンを構築することを開始できます。
EC2インスタンスで実行されている同じNode.jsアプリケーションを使用して、歌手、タイトル、テキスト歌詞の詳細を含むデータをAmazon DocumentDBクラスタに入力します。
最初に、Node.js が EC2 インスタンスにインストールされていることを確認します。
Node.js が EC2 インスタンスにインストールされた後で、次のコマンドを実行することで、Node Package Manager (npm) がインストールされます。
アプリケーションディレクトリを作成する
次に、アプリケーションのディレクトリを作成し、以下のコマンドを使用してそのディレクトリを変更します。
次のコマンドは、パッケージ .json ファイルを生成します。
デフォルトの index.js 値を選択し、index.js の代わりに cdstore.js を入力します。
Install dependencies
次に、アプリケーションを機能させるために必要なすべての依存関係をインストールします。これらは、アプリケーションを Amazon DocumentDB に接続することを許可する MongoDB、Node.js ウェブアプリケーションフレームワーク、Node.js Redis クライアント、および Node.js 本体の解析ミドルウェアである本体パーサーを含みます。これを行うには、次のコマンドを実行します。
パッケージ .package.json ファイルの内容は次のとおりです。
関数を作成します
2 つの関数を作成します
SaveSong ()
関数は、Amazon DocumentDB インスタンスにデータを挿入するために、/POST 要求を送信するために使用されました。コマンド db.<collection_name>.insert()
を使用して、一括でデータを挿入するためのスクリプトを書くこともできました。
SearchSongByTitle()
は /GET
メソッドにより使用されて、実際の検索を実行します。
cache.js と呼ばれるファイルに 2 つの関数を保存します。そのファイルを作成します。
お気に入りのエディター (vim、vi など) を使用して、以下のコードを cache.js ファイルにコピーします。
エンドポイントを作成する
ここで、次のように、エンドポイント cdstore.js を作成します。
以下のコードをkぴ―し、それを cdstore.js ファイルに貼り付けます。
アプリケーションを開始する
次に、アプリケーションを開始し、この例では、これが EC2 インスタンスのポート 8082 で実行するように設定します。これを行うためには、次のコマンドを使用します。
すべてを正しく実行すると、コンソールで次のメッセージが表示されるはずです。
アプリケーションをテストする
アプリケーションをテストするためには、Postman (REST API クライアント) を使用して、POST
と GET
要求を作成します。GET
要求の場合、最初の要求 (データが Amazon DocumentDB から取り込まれたとき) とその後の要求 (Redis ElastiCache からサービスを受けたとき) の間の応答時間を比較します。
- Amazon DocumentDB に
POST
を使用して、歌のデータセットを入力します GET
で検索します
簡単にするために、この例では単一の歌を入力するためのプロセスのみを表示します。ただし、それはその後のステップで数回、繰り返されてきました。
Postman を平¥いて、POST
メソッドを選択して、アプリケーション URL を入力します (この例では、http://<ec2-dns-or-IP>:8082/)。
x-www-form-urlencoded が Body の下で選択されていることを確認します。
- キー値ペアとして、歌の詳細を入力します。
タイトル: Everything is everything
歌手: Lauryn Hill
テキスト: After winter must come spring
- [送信] を選択します。
次のスクリーンショットで示されるように、Postman 画面で、Saved と Status 201 created が表示されるはずです。
次のスクリーンショットで示されるように、Postman コンソールから POST
要求の詳細をチェックし、同じ結果であることを確認してください。
Amazon DocumentDB クラスターを確認する
前のステップから同じコマンドを使用して、Amazon DocumentDB に接続し、そのデータがデータベースに保存されたことを確認してください。
- show db—Amazon DocumentDB で使用可能なデータベースインスタンスをリストする。
- use cd—cd と呼ばれるインスタンスを使用するようにインタープリターに指示する。
- show collections—使用可能なコレクションを表示する (リレーショナル DB と同様のテーブルと考えることができます)
- db.text.find()—テキストコレクションの内側にすべてのドキュメントをリストする
一括挿入データ
コマンド db.text.find() からの出力はまた、Amazon DocumentDB インスタンスですでにいくつかの歌のエントリがあったことも示しています。それらは、アプリケーションのテスト中に Postman から POST
コマンドを送信することにより追加されます。
また、次のコマンドを使用して、Amazon DocumentDB に一括で歌を挿入することもできます。
例:
タイトルのみを使用してエントリを取得する
GET
要求を Postman から実行します。
Postman 画面に戻り、以下の URL で GET
メソッドを選択します。
http://<ec2-dns-or-IP>:8082/cd/:title
パス変巣キー値を入力して、歌のタイトル (Everything is everything) のみを使用して、Amazon DocumentDB にあらかじめ保存されている歌を取得しようとします。
[送信] を選択します。
次のスクリーンショットで示されるように、JSON 形式で Lauryn Hill の歌の詳細を受け取ります。
Postman コンソールから、次のスクリーンショットで示されるように、実際の GET
要求の詳細を確認します。
全体として、要求には 13 ミリ秒かかりました。
データが ElastiCache に保存されていることを確認する
Node.js アプリケーションは、(次のコード抽出で示されるように) 各クライアント要求を Redis に送信して、要求されたドキュメントがすでにキャッシュされているかどうかを確認するように設計されています。そうではない場合、要求は Amazon DocumentDB に送信され、要求されたドキュメントを取得します。それは、Amazon ElastiCache で保存されたコピーをクライアントに送り返します。
データが Amazon ElastiCache に保存されていることを確認する
keys * コマンドを実行して、すべてのキーをリストし、歌手 Lauryn Hill から歌のタイトル Everything is everything のキーを確認します。それを前のステップで POST
要求として送信します。リストの 9 番目のエントリとして、Amazon ElastiCache インスタンスでキャッシュされています。
get <key>
コマンドを実行して、特別なキーの詳細を確認できます。たとえば、歌 Everything is everything の詳細を確認するために、次のコード例に示されるように、コマンド get Everything is everything を実行します。
データが Amazon ElastiCache で保存されていることを確認して、別の GET
要求を実行して、キャッシュされたデータを取り込みます。それは大幅にはやく配信されるはずです。
次のスクリーンショットでご覧いただけるように、GET
要求の応答時間は 6 ミリ秒に短縮され、Redis ElastiCache によりパフォーマンスの改善が明確に示されています。
まとめ
この記事で、私はユーザーが示されたタイトルに基づいてお気に入りの歌を見つけることができるアプリケーションを使用して、Amazon DocumentDB と Amazon ElastiCache の間の統合を示しました。また、Amazon DocumentDB の前に Amazon ElastiCache for Redis のようなレイヤを使用して、Amazon DocumentDB に保存されるデータの要求応答時間を改善することを示しました。また、これはキャッシュからサービスされるデータの提供を減らすことで、より大きなデータベースクラスターを実行することに比べて、潜在的にコストも削減できます。
著者について
Georges Leschener は、.アマゾン ウェブ サービスのグローバルシステムインテグレーター (GSI) チームのシニアパートナーソリューションアーキテクトです。Georges は AWS の GSI パートナーと連携して、お客様のワークロードの AWS クラウドへの移行を助け、AWS のベストプラクティスを適用することによって AWS 上で革新的なソリューションをデザインし、設計しています。