Amazon DynamoDB Accelerator (DAX) でマイクロ秒レイテンシを実現 - インメモリキャッシュの設計
DAX による DynamoDB の読み取り高速化、キャッシュ戦略、クラスタ設計を解説します。
DAX の概要
DAX は DynamoDB のインメモリキャッシュで、読み取りレイテンシをミリ秒からマイクロ秒に短縮します。ElastiCache (Redis/Memcached) と異なり、DynamoDB 互換の API を提供しますが、接続には DAX クライアントを使う必要があり、エンドポイントを差し替えるだけでは切り替わりません。DAX クラスターは VPC 内に配置され、クラスター内の各ノードが同じキャッシュデータのレプリカを保持します。プライマリノードが書き込みを処理し、レプリカノードが読み取りを分散する構成で、プライマリ障害時にはレプリカが自動昇格します。
キャッシュ戦略とクラスタ設計
アイテムキャッシュは GetItem と BatchGetItem の結果をキャッシュし、TTL (デフォルト 5 分) で自動失効します。クエリキャッシュは Query と Scan の結果セットをキャッシュします。書き込みスルーにより、PutItem や UpdateItem の実行時にアイテムキャッシュも更新されます (クエリキャッシュには反映されません)。クラスターは最低 3 ノード (マルチ AZ) を推奨し、ノードタイプはキャッシュするデータ量に応じて選択します。dax.r5.large は中規模ワークロード向け、dax.r5.xlarge は大規模なホットデータセットを持つ場合に適しています。
キャッシュ戦略と整合性
DAX はアイテムキャッシュとクエリキャッシュの 2 層でキャッシュを管理します。アイテムキャッシュは GetItem と BatchGetItem の結果を TTL (デフォルト 5 分) で保持します。クエリキャッシュは Query と Scan の結果を保持します。書き込み操作 (PutItem 、 UpdateItem 、 DeleteItem) はライトスルーで DAX と DynamoDB の両方に反映されます。結果整合性の読み取りはキャッシュから返され、強い整合性の読み取りは DynamoDB に直接アクセスします。 TTL を短く設定するとキャッシュヒット率が下がり、長く設定するとデータの鮮度が低下するトレードオフがあります。
DAX と ElastiCache の比較
DAX は DynamoDB 専用のキャッシュで、アプリケーションの SDK を DAX クライアントに置き換えて導入します。アイテムキャッシュの無効化は DAX が扱うため、アプリケーション側に無効化のロジックを実装する必要はありません。一方 ElastiCache (Redis) は DynamoDB 以外のデータソース (RDS、外部 API レスポンス) もキャッシュ可能で、Pub/Sub やソート済みセットなどのデータ構造を活用できます。DAX のクエリキャッシュはパラメーターの完全一致でヒット判定するため、Query のフィルター条件が頻繁に変わるワークロードではヒット率が低下します。この場合は ElastiCache でアプリケーション側のキャッシュキーを設計する方法もあります。TransactGetItems は DynamoDB にそのまま渡されて結果がキャッシュされないため、トランザクションの読み取りが中心のワークロードでは効果が限定的です。
設計の落とし穴と運用上の注意点
DAX クラスターは VPC 内に配置する必要があり、Lambda から接続する場合は、Lambda を同じ VPC に配置します。DAX のノード障害時、クライアント SDK は自動的にリトライしますが、フェイルオーバーの間は読み取りのレイテンシが増えます。アプリケーションはこの一時的なレイテンシ増加を許容する設計にします。アイテムキャッシュとクエリキャッシュの TTL は独立して設定でき、書き込み頻度の高いテーブルではアイテムキャッシュの TTL を短くし、クエリキャッシュの TTL も合わせて見直すことでデータの鮮度を保ちます。ノードの追加と削除はクラスターの稼働中に実行でき、追加したノードはほかのノードからキャッシュのデータを同期するため、想定されるピークの前に済ませておきます。
DAX の料金
DAX の料金はノードの時間課金で、ノードタイプによって異なります。3 ノード以上 (マルチ AZ) の構成が推奨されるため、その分のノードの料金がかかります。DynamoDB の読み取りキャパシティユニット (RCU) のコスト削減効果と DAX のノードコストを比較し、読み取りが多いワークロードで DAX の導入が有利かを判断します。キャッシュヒット率が高いほど、DynamoDB の RCU を減らせます。
まとめ
DAX は DynamoDB のインメモリキャッシュで、マイクロ秒単位の読み取りレイテンシを実現するサービスです。ライトスルーキャッシュで書き込みの整合性を維持しながら、アイテムキャッシュとクエリキャッシュの 2 層で読み取りの負荷を減らします。キャッシュヒット率が高い読み取り集中型のワークロードで、DynamoDB の RCU のコストを減らす効果が出やすくなります。
参考資料 (AWS 公式)
本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。
本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。