Amazon ElastiCache のキャッシュ設計 - Redis と Memcached の選定とキャッシュ戦略
Redis と Memcached の選定基準を整理し、Lazy Loading・Write-Through のキャッシュ戦略と Serverless モードの活用法を紹介します。
Redis と Memcached の選定基準
ElastiCache は Redis と Memcached の 2 つのエンジンを提供し、マイクロ秒単位のレイテンシで毎秒数百万リクエストを処理します。Redis はシングルスレッドのイベントループモデルで動作し、文字列、ハッシュ、リスト、セット、Sorted Set、Streams、HyperLogLog など豊富なデータ構造を提供します。AOF (Append Only File) と RDB スナップショットによるデータ永続化、リードレプリカ、自動フェイルオーバー、Pub/Sub メッセージングをサポートし、キャッシュだけでなくセッションストア、リーダーボード、リアルタイムランキング、メッセージブローカーとしても活用できます。Memcached はマルチスレッドアーキテクチャでシンプルなキー・バリューキャッシュに特化し、ノード追加による水平スケーリングが容易です。データ永続化やレプリケーションが不要で、純粋にデータベースクエリの結果をキャッシュしたい場合に適しています。新規プロジェクトでは、機能の豊富さと運用の柔軟性から Redis を選択するケースが大半です。
キャッシュ戦略の設計
Lazy Loading (Cache-Aside) はキャッシュミス時にデータベースから取得してキャッシュに書き込む戦略です。キャッシュには実際にリクエストされたデータのみが格納されるため、メモリ効率が高い反面、初回アクセス時にキャッシュミスが発生します。Write-Through はデータベースへの書き込みと同時にキャッシュも更新する戦略です。キャッシュのデータが常に最新に保たれますが、書き込みのレイテンシが増加し、読まれないデータもキャッシュに格納されます。実践的には両者を組み合わせ、Write-Through で書き込み時にキャッシュを更新しつつ、TTL を設定して古いデータを自動的に失効させるアプローチが有効です。TTL の設定値はデータの鮮度要件に応じて決定し、リアルタイム性が求められるデータは短く (数秒から数分)、マスターデータは長く (数時間から数日) 設定します。キャッシュヒット率を CloudWatch メトリクスで継続的に監視し、TTL やノードサイズの適正化を定期的に見直すことが運用の鍵です。
クラスタモードとシャーディング
Redis クラスタモードを有効にすると、データを 16384 個のハッシュスロットに分散し、複数シャードで水平スケールできます。各シャードにプライマリと最大 5 つのリードレプリカを配置し、読み取り負荷を分散します。クライアントはハッシュスロットのマッピングに従ってリクエストを正しいシャードに送信し、スロットが移動した場合は MOVED リダイレクトで自動接続します。ノードタイプの選択ではメモリ最適化の r 系インスタンス (cache.r7g 系) がキャッシュワークロードに適しており、データ量とスループット要件に応じてシャード数とレプリカ数を調整します。マルチ AZ 配置で可用性を確保し、自動フェイルオーバーにより数十秒でプライマリを切り替えます。
Valkey 互換エンジンと Global Datastore
Valkey は Redis のフォークとして誕生したオープンソースの互換エンジンで、ElastiCache の新しいデフォルトエンジンとして提供されています。既存の Redis クライアントライブラリやコマンドセットをそのまま使用でき、ライセンス上の懸念なく Redis 互換環境を利用できます。ElastiCache Serverless は Valkey エンジンと Memcached の両方に対応しています。Global Datastore を使用するとリージョン間でデータを非同期レプリケーションし、災害復旧 (DR) とグローバルな読み取りレイテンシの改善を実現します。プライマリリージョンの障害時はセカンダリリージョンを数分で昇格でき、RPO は通常 1 秒未満です。
ElastiCache Serverless と運用
ElastiCache Serverless は 2023 年に登場したモードで、ノードタイプやクラスタサイズの事前設計が不要です。ワークロードに応じてキャパシティが自動スケールし、最小構成から始めてトラフィック増加に自動対応します。料金はデータストレージ量と ElastiCache Processing Units (ECPU) の使用量に基づく従量課金です。トラフィックパターンが予測困難な新規アプリケーションや、開発・テスト環境に特に適しています。一方、トラフィックパターンが安定している本番環境では、リザーブドノードを使用したプロビジョンド構成の方がコスト効率が高い場合があります。 ElastiCache を深く理解するには、専門書籍 (Amazon)が役立ちます。
ElastiCache の料金
ElastiCache の料金はノードの時間課金で構成されます。Redis の cache.r7g.large は 1 時間あたり約 0.252 ドル (月額約 181 ドル) です。Serverless モードは ECPU (ElastiCache Processing Unit) とストレージの従量課金で、ECPU は 100 万あたり約 0.0034 ドル、ストレージは 1 GB あたり月額約 0.125 ドルです。トラフィックが断続的なワークロードでは Serverless が低コストで、常時高スループットのワークロードではプロビジョンドノードの方が有利です。リザーブドノードで最大 55% の割引が適用されます。
まとめ
ElastiCache はデータベースの負荷軽減とアプリケーションの応答速度改善に直結するキャッシュサービスです。Redis をデフォルトの選択肢とし、Lazy Loading と Write-Through の組み合わせでキャッシュ戦略を設計します。クラスタモードのシャーディングとリードレプリカでスケーラビリティを確保し、Valkey 互換エンジンや Global Datastore でグローバル展開にも対応できます。Serverless モードで手軽に始め、ワークロードが安定したらプロビジョンド構成への移行を検討するアプローチが有効です。