

# DAX: 仕組み
<a name="DAX.concepts"></a>

Amazon DynamoDB Accelerator (DAX) は、Amazon Virtual Private Cloud (Amazon VPC) 環境内で実行するように設計されています。Amazon VPC サービスは、従来のデータセンターに非常によく似た仮想ネットワークを定義します。VPC を使用すると、IP アドレス範囲、サブネット、ルーティングテーブル、ネットワークゲートウェイ、セキュリティ設定を適切に制御できます。仮想ネットワーク内で DAX クラスターを起動し、Amazon VPC のセキュリティグループを使用して、クラスターへのアクセスを制御できます。

**注記**  
2013 年 12 月 4 日以降に AWS アカウントを作成した場合は、各 AWS リージョンにデフォルトで VPC が用意されています。VPC はすぐに使用できます。追加のステップは必要ありません。  
詳細については、「Amazon VPC ユーザーガイド」の「[デフォルト VPC とデフォルトサブネット](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html)」を参照してください。

次の図は、DAX の高レベルの概要を示しています。

![\[VPC でのアプリケーション、DAX クライアント、および DAX クラスターの相互作用を示すワークフロー図。\]](http://docs.aws.amazon.com/ja_jp/amazondynamodb/latest/developerguide/images/dax_high_level.png)


DAX クラスターを作成するには、AWS マネジメントコンソール を使用します。特に指定しない限り、DAX クラスターはデフォルト VPC 内で実行されます。アプリケーションを実行するには、Amazon VPC 内に Amazon EC2 インスタンスを起動します。次に、アプリケーションを (DAX クライアントとともに) EC2 インスタンスにデプロイします。

実行時に、DAX クライアントはアプリケーションのすべての DynamoDB API リクエストを DAX クラスターに送信します。DAX がこれらの API リクエストのいずれかを直接処理できる場合は、処理します。それ以外の場合は、リクエストは DynamoDB に渡されます。

最終的に、DAX クラスターはアプリケーションに結果を返します。

**Topics**
+ [DAX でのリクエスト処理方法](#DAX.concepts.request-processing)
+ [項目キャッシュ](#DAX.concepts.item-cache)
+ [クエリキャッシュ](#DAX.concepts.query-cache)

## DAX でのリクエスト処理方法
<a name="DAX.concepts.request-processing"></a>

DAX クラスターは 1 つ以上のノードで構成されています。各ノードはそれぞれ、自身の DAX キャッシングソフトウェアのインスタンスを実行します。ノードのうち 1 つがクラスターのプライマリノードとして機能します。他のノード (存在する場合) はリードレプリカとして動作します。詳細については、「[ノード](DAX.concepts.cluster.md#DAX.concepts.nodes)」を参照してください。

アプリケーションは、DAX クラスターのエンドポイントを指定することで DAX にアクセスできます。DAX クライアントソフトウェアはクラスターエンドポイントと連携して、インテリジェントなロードバランシングとルーティングを実行します。

### 読み込み操作
<a name="DAX.concepts.request-processing-read"></a>

DAX は次の API コールに対応できます。
+ `GetItem`
+ `BatchGetItem`
+ `Query`
+ `Scan`

リクエストが結果的に整合性のある読み込み (デフォルトの動作) を指定する場合は、その項目を DAX から読み込もうとします。
+ DAX に項目がある場合 (キャッシュヒット)、DAX は DynamoDB にアクセスせずにアプリケーションに項目を返します。
+ DAX に項目がない場合 (キャッシュミス)、DAX はリクエストを DynamoDB に渡します。DynamoDB からの応答を受信すると、DAX は結果をアプリケーションに返します。ただし、プライマリノードのキャッシュにも結果を書き込みます。

**注記**  
クラスターにリードレプリカがある場合、DAX は自動的にレプリカをプライマリノードと同期した状態に保ちます。詳細については、「」を参照してください[クラスター](DAX.concepts.cluster.md#DAX.concepts.clusters)

リクエストが強力な整合性のある読み込みを指定する場合、DAX はリクエストを DynamoDB に渡します。DynamoDB からの結果は DAX にキャッシュされません。代わりに、それらは単にアプリケーションに返されます。

### 書き込み操作
<a name="DAX.concepts.request-processing-write"></a>

次の DAX API オペレーションは「書き込みスルー」と見なされます。
+ `BatchWriteItem`
+ `UpdateItem`
+ `DeleteItem`
+ `PutItem`

これらのオペレーションでは、データはまず DynamoDB テーブルに書き込まれ、その後 DAX クラスターに書き込まれます。オペレーションは、データがテーブルと DAX の*両方*に正常に書き込まれた場合にのみ成功します。

### その他のオペレーション
<a name="DAX.concepts.request-processing-other"></a>

DAX では、テーブルを管理する DynamoDB のオペレーション (`CreateTable` や `UpdateTable` など) を認識しません。アプリケーションがこのようなオペレーションを行う必要がある場合は、DAX を使用するのではなく、直接 DynamoDB にアクセスする必要があります。

DAX および DynamoDB の整合性の詳細については、「[DAX および DynamoDB の整合性モデル](DAX.consistency.md)」を参照してください。

DAX でのトランザクションの動作の詳細については、「[DynamoDB アクセラレーター (DAX) でのトランザクション API の使用](transaction-apis.md#transaction-apis-dax)」を参照してください。

### リクエストレート制限
<a name="DAX.concepts.request-processing-throttling"></a>

DAX に送信された要求の数がノードの容量を超える場合、DAX は [ThrottlingException](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/CommonErrors.html#CommonErrors-ThrottlingException) を返して追加の要求を受け入れるレートを制限します。DAX は CPU 使用率を継続的に評価し、正常なクラスター状態を維持しながら処理できるリクエスト量を判断します。

DAX が Amazon CloudWatch に公開する [ThrottledRequestCount](dax-metrics-dimensions-dax.md) メトリクスをモニタリングできます。これらの例外が定期的に発生する場合は、[クラスターをスケールアップ](DAX.cluster-management.md#DAX.cluster-management.scaling)することを検討してください。

## 項目キャッシュ
<a name="DAX.concepts.item-cache"></a>

DAX は項目キャッシュを維持して、`GetItem` および `BatchGetItem` オペレーションからの結果を保存します。キャッシュ内の項目は DynamoDB からの結果整合性データを表し、プライマリキー値別に保存されています。

アプリケーションが `GetItem` または `BatchGetItem` リクエストを送信すると、DAX は指定されたキー値を使用して項目キャッシュから直接項目の読み込みを試みます。項目が見つかった場合 (キャッシュヒット)、DAX はすぐにアプリケーションに項目を返します。項目が見つからない (キャッシュミス) 場合、DAX は DynamoDB にリクエストを送信します。DynamoDB は、結果整合性のある読み取りを使用してリクエストを処理し、項目を DAX に返します。DAX は、それらを項目キャッシュに格納し、アプリケーションに返します。

項目キャッシュには有効期限 (TTL) があります。デフォルトでは 5 分です。DAX は項目キャッシュに書き込むすべての項目にタイムスタンプを割り当てます。TTL 設定より長期間キャッシュに残り続けている項目は、期限切れになります。期限切れの項目について `GetItem` リクエストを発行すると、キャッシュミスとみなされ、DAX は `GetItem` リクエストを DynamoDB に送信します。

**注記**  
項目キャッシュの TTL 設定は、新しい DAX クラスターを作成する際に指定できます。詳細については、「」を参照してください[DAX クラスターの管理](DAX.cluster-management.md)

DAX は項目キャッシュの LRU (least recently used) リストも保持します。LRU リストは、項目が最初にキャッシュに書き込まれた時とその項目が最後にキャッシュから読み込まれた時を記録して保存します。項目キャッシュがいっぱいになると、DAX は古い項目を (期限切れでない場合であっても) 削除し、新しい項目のためのスペースを空けます。LRU アルゴリズムは項目キャッシュでは常に有効であり、ユーザーが設定することはできません。

*項目キャッシュ* TTL 設定としてゼロを指定した場合、項目キャッシュ内の項目は、LRU 削除または[「書き込みスルー」](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DAX.concepts.html#DAX.concepts.request-processing-write)オペレーションによってのみ更新されます。

DAX での項目キャッシュの整合性の詳細については、「[DAX 項目キャッシュの動作](DAX.consistency.md#DAX.consistency.item-cache)」を参照してください。

## クエリキャッシュ
<a name="DAX.concepts.query-cache"></a>

DAX は、クエリキャッシュを維持して、`Query` および `Scan` オペレーションからの結果を保存します。このキャッシュの項目は、DynamoDB テーブルに対するクエリおよびスキャンの結果セットを表します。これらの結果セットはパラメータ値別に保存されています。

アプリケーションが `Query` または `Scan` リクエストを送信すると、DAX は指定されたパラメータ値を使用してクエリキャッシュから一致する結果セットの読み込みを試みます。結果セットが見つかった場合 (キャッシュヒット)、DAX はすぐにアプリケーションに結果セットを返します。結果セットが見つからない場合 (キャッシュミス)、DAX は DynamoDB にリクエストを送信します。DynamoDB は、結果整合性のある読み取りを使用してリクエストを処理し、結果セットを DAX に返します。DAX は結果セットをクエリキャッシュに保存し、アプリケーションに返します。

**注記**  
クエリキャッシュの TTL 設定は、新しい DAX クラスターを作成する際に指定できます。詳細については、「」を参照してください[DAX クラスターの管理](DAX.cluster-management.md)

DAX は、クエリキャッシュの LRU リストも保持します。リストは、結果セットが最初にキャッシュに書き込まれた時とその結果が最後にキャッシュから読み込まれた時を記録して保存します。クエリキャッシュがいっぱいになると、DAX は古い結果セットを (期限切れでなくても) 削除して新しい結果セットのためのスペースを解放します。LRU アルゴリズムはクエリキャッシュでは常に有効であり、ユーザーが設定することはできません。

クエリキャッシュ TTL 設定としてゼロを指定した場合、クエリ応答はキャッシュされません。

DAX でのクエリキャッシュの整合性の詳細については、「[DAX クエリキャッシュの動作](DAX.consistency.md#DAX.consistency.query-cache)」を参照してください。