Amazon MemoryDB for Redis で耐久性のあるインメモリデータベースを構築 - キャッシュとプライマリデータストアの統合

MemoryDB による Redis 互換インメモリデータベースの運用、耐久性の仕組み、ElastiCache との使い分けを解説します。

MemoryDB の概要

MemoryDB for Redis は Redis 7.x 互換の耐久性を備えたインメモリデータベースサービスで、最大 500 ノード、数百 TB のデータを格納できます。ElastiCache for Redis がキャッシュ (揮発性データ) に特化しているのに対し、MemoryDB は Multi-AZ トランザクションログで書き込みの耐久性を保証し、プライマリデータストアとして使用できます。読み取りレイテンシはマイクロ秒台、書き込みレイテンシは 1 桁ミリ秒台を実現します。クラスタモードでは最大 500 シャードまでスケールアウトでき、各シャードはプライマリと最大 5 つのレプリカで構成されます。Redis のコマンド体系と API に完全互換のため、既存の Redis クライアントライブラリをそのまま利用できます。

耐久性の仕組み

MemoryDB は書き込みを Multi-AZ のトランザクションログに同期的に記録し、ノード障害時にもデータを失いません。書き込み操作はトランザクションログへの永続化が完了してからクライアントに ACK を返すため、強い整合性 (strong consistency) を保証します。ノード再起動時はトランザクションログからデータを完全に復元し、スナップショットからの復元と比較してデータ損失がゼロです。レプリカノードへの複製は非同期で行われるため、レプリカからの読み取りは結果整合性 (eventual consistency) となります。日次の自動スナップショット (最大 35 日保持) に加え、手動スナップショットも取得でき、ポイントインタイムリカバリのベースとして活用できます。

ユースケースと ElastiCache との使い分け

MemoryDB はセッションストア、ユーザープロファイル、リーダーボード、リアルタイム分析など「インメモリの速度が必要かつデータを失いたくない」ユースケースに適しています。Redis のデータ構造 (Sorted Set、Hash、Stream) をフル活用し、DynamoDBRDS を補完するデータ層として配置できます。ElastiCache は RDS や DynamoDB の前段キャッシュとして、データ損失が許容されるユースケースに適しています。ElastiCache は非同期レプリケーションのため、フェイルオーバー時に直近の書き込みが失われる可能性があります。選択の判断基準として、データソース (RDS 等) から再取得可能なら ElastiCache、そのデータが唯一の正ならば MemoryDB を選択します。MemoryDB をキャッシュとして使うのはオーバースペックでコストも高いため避けるべきです。 データベース設計の知見を広げたい場合はAmazon の専門書も活用できます。

Redis データ構造とサーバーサイド処理

MemoryDB は Redis 7.x のコマンドセットに完全対応しており、Strings、Hashes、Lists、Sets、Sorted Sets、Streams、HyperLogLog、Geospatial インデックスをすべて利用できます。Sorted Sets は O(log N) でのランキング取得が可能なためリーダーボードやタイムラインの実装に効果的です。Streams はイベントログやメッセージキューに使え、コンシューマーグループで並列処理をサポートします。Lua スクリプトによるアトミックなサーバーサイド処理、Redis Functions による再利用可能なロジックの登録、Pub/Sub によるリアルタイム通知、トランザクション (MULTI/EXEC) によるアトミック操作にも対応しています。ACL v2 でユーザー単位・コマンド単位のきめ細かいアクセス制御が可能で、キーパターンごとに読み取り・書き込み権限を分離できます。クラスタモードでは Redis Cluster プロトコルに従いハッシュスロットベースでデータを分散し、クライアントは MOVED リダイレクトで正しいシャードに自動接続します。大きなキー (数 MB 以上) が 1 つのシャードに集中するとホットスポットが発生するため、キーサイズの均一性を意識したデータモデル設計が重要です。

設計のベストプラクティスと注意点

MemoryDB ではデータサイズがノードのメモリに収まる設計が重要です。メモリ使用率が高い状態ではスワップやエビクションが発生し性能が劣化するため、使用率 75% 以下を目安に容量計画を行います。シャード数の変更 (リシャーディング) はオンラインで実行できますが、データの再分配中は書き込みレイテンシが一時的に増加します。暗号化は保存時 (at-rest、KMS) と通信中 (in-transit、TLS) の両方をサポートし、ACL (アクセスコントロールリスト) で Redis コマンド単位の認可を制御できます。VPC 内に配置し、セキュリティグループで接続元を制限するのが基本構成です。マルチ AZ 構成はデフォルトで有効であり、追加設定なしで高可用性が得られます。

料金と制限の注意点

MemoryDB のノード料金は db.r7g.large で 1 時間あたり約 0.463 ドル (月額約 333 ドル) です。ElastiCache の同等ノードより約 20% 高価ですが、耐久性のためのトランザクションログストレージが含まれます。データ転送料金はリージョン内は無料、リージョン間は標準のデータ転送料金が適用されます。スナップショットのストレージは無料枠 (ノードのメモリサイズ分) を超えると 1 GB あたり月額約 0.085 ドルです。リザーブドノード (1 年/3 年) を利用すると最大約 55% のコスト削減が可能です。1 クラスタあたりのシャード上限は 500、1 シャードあたりのレプリカ上限は 5、パラメータグループで maxmemory-policy を設定しエビクション動作を制御します。

まとめ

MemoryDB は Redis 互換で耐久性を保証するインメモリデータベースです。Multi-AZ トランザクションログで書き込みの永続化を実現し、ElastiCache がキャッシュ用途であるのに対し、プライマリデータベースとして使用できます。マイクロ秒の読み取りレイテンシでセッションストア、リーダーボード、リアルタイム分析のデータ層に最適です。キャッシュ用途には ElastiCache、唯一のデータソースとして使う場合は MemoryDB という明確な使い分けが設計の要点です。