Amazon MemoryDB for Redis - 耐久性を備えたインメモリデータベースの設計と活用

Multi-AZ の耐久性を備えたインメモリデータベースとして、ElastiCache との使い分けとプライマリデータベースとしての活用パターンを紹介します。

MemoryDB と ElastiCache の違い

MemoryDB for Redis は Redis 互換のインメモリデータベースで、ElastiCache との最大の違いはデータの耐久性です。ElastiCache はキャッシュとして設計されており、ノード障害時にデータが失われる可能性があります。MemoryDB はトランザクションログを複数の AZ に同期的に複製するため、ノード障害やプロセス再起動後もデータが保持されます。この耐久性により、MemoryDB はキャッシュではなくプライマリデータベースとして使用できます。セッションストア、ユーザープロファイル、リーダーボード、ショッピングカートなど、データの永続性が必要でかつ低レイテンシが求められるワークロードに最適です。

アーキテクチャとパフォーマンス

MemoryDB のクラスタはシャードで構成され、各シャードにプライマリノードとリードレプリカが配置されます。書き込みはプライマリノードが処理し、トランザクションログが Multi-AZ で同期複製された後にクライアントに応答を返します。読み取りはリードレプリカ (シャードあたり最大 5 台) に分散でき、マイクロ秒のレイテンシを実現します。書き込みレイテンシはトランザクションログの同期複製のため ElastiCache より若干高く、1 桁ミリ秒程度です。シャード数を増やすことで書き込みスループットを水平にスケールでき、最大 500 ノードのクラスタで数百テラバイトのデータを格納できます。

プライマリデータベースとしての活用

MemoryDB をプライマリデータベースとして使用すると、従来の RDB + ElastiCache の 2 層構成を MemoryDB の 1 層に統合できます。キャッシュの無効化ロジック、キャッシュとデータベースの整合性管理、 2 つのサービスの運用管理が不要になります。ただし、 MemoryDB はリレーショナルクエリ (JOIN 、集計) をサポートしないため、データモデルが Redis のデータ構造で表現可能なワークロードに限定されます。複雑なクエリが必要な場合は、 MemoryDB をリアルタイムアクセス層として使用し、分析用途には RedshiftAthena にデータを同期する構成が有効です。 MemoryDB に関する実践的なノウハウはAmazon の関連書籍でも確認できます。

MemoryDB の料金

MemoryDB の料金はノードの時間課金とデータ転送で構成されます。db.r7g.large ノードは 1 時間あたり約 0.337 ドル (月額約 243 ドル) です。ElastiCache の同等ノード (cache.r7g.large、約 0.252 ドル/時) と比較すると約 34% 高価ですが、Multi-AZ の耐久性が標準で含まれています。リザーブドノードで最大 55% の割引が適用されます。プライマリデータベースとして使用する場合は MemoryDB、キャッシュ専用なら ElastiCache を選択し、コストと耐久性のバランスを取ります。

まとめ

MemoryDB は Redis の低レイテンシとデータの耐久性を両立するインメモリデータベースです。キャッシュではなくプライマリデータベースとして使用でき、RDB + キャッシュの 2 層構成を簡素化できます。データモデルが Redis のデータ構造に適合するワークロードで、低レイテンシと耐久性の両方が求められる場合に最適な選択肢です。