Amazon MemoryDB for Redis で耐久性のあるインメモリデータベースを構築 - キャッシュとプライマリデータストアの統合
MemoryDB による Redis 互換インメモリデータベースの運用、耐久性の仕組み、ElastiCache との使い分けを解説します。
MemoryDB の概要
MemoryDB for Redis は Redis 7.x 互換の耐久性を備えたインメモリデータベースサービスで、最大 500 ノードにデータを格納できます。ElastiCache for Redis がキャッシュ (揮発性データ) に特化しているのに対し、MemoryDB は Multi-AZ トランザクションログに書き込みを永続化するため、プライマリデータストアとして使用できます。読み取りレイテンシはマイクロ秒台、書き込みレイテンシは 1 桁ミリ秒台を実現します。クラスタモードではシャードを増やしてスケールアウトでき、各シャードはプライマリとレプリカで構成されます。Redis のコマンドと API に互換性があるため、既存の Redis クライアントライブラリを利用できます。
耐久性の仕組み
MemoryDB は書き込みを Multi-AZ のトランザクションログに同期的に記録するため、ノード障害が起きても書き込み済みのデータを復元できます。書き込み操作はトランザクションログへの永続化が完了してからクライアントに ACK を返すため、強い整合性 (strong consistency) が得られます。ノードの再起動時はトランザクションログからデータを復元します。レプリカノードへの複製は非同期で行われるため、レプリカからの読み取りは結果整合性 (eventual consistency) となります。日次の自動スナップショットに加えて手動のスナップショットも取得でき、復元に使えます。
ユースケースと ElastiCache との使い分け
MemoryDB はセッションストア、ユーザープロファイル、リーダーボード、リアルタイム分析など「インメモリの速度が必要かつデータを失いたくない」ユースケースに適しています。Redis のデータ構造 (Sorted Set、Hash、Stream) をフル活用し、DynamoDB や RDS を補完するデータ層として配置できます。ElastiCache は RDS や DynamoDB の前段キャッシュとして、データ損失が許容されるユースケースに適しています。ElastiCache は非同期レプリケーションのため、フェイルオーバー時に直近の書き込みが失われる可能性があります。選択の判断基準として、データソース (RDS 等) から再取得可能なら ElastiCache、そのデータが唯一の正ならば MemoryDB を選択します。キャッシュだけが目的なら、ElastiCache を選びます。
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 ではデータサイズがノードのメモリに収まるように設計します。メモリ使用率が高い状態ではスワップやエビクションが発生し性能が劣化するため、メモリの使用率に余裕を持たせて容量計画を行います。シャード数の変更 (リシャーディング) はオンラインで実行できますが、データの再分配中は書き込みレイテンシが一時的に増加します。暗号化は保存時 (at-rest、KMS) と通信中 (in-transit、TLS) の両方をサポートし、ACL (アクセスコントロールリスト) で Redis コマンド単位の認可を制御できます。VPC 内に配置し、セキュリティグループで接続元を制限するのが基本構成です。マルチ AZ 構成で高可用性を確保します。
料金と制限の注意点
MemoryDB のノードの料金は時間課金で、ノードタイプによって異なります。ElastiCache の同等ノードより料金は高めですが、耐久性のためのトランザクションログストレージが含まれます。データ転送料金はリージョン内は無料、リージョン間は標準のデータ転送料金が適用されます。スナップショットのストレージは、無料の範囲を超えた分が保存量に応じて課金されます。リザーブドノード (1 年/3 年) を利用すると、料金を抑えられます。パラメータグループで maxmemory-policy を設定し、エビクションの動作を制御します。
まとめ
MemoryDB は Redis 互換で、耐久性を備えたインメモリデータベースです。Multi-AZ トランザクションログで書き込みの永続化を実現し、ElastiCache がキャッシュ用途であるのに対し、プライマリデータベースとして使用できます。マイクロ秒の読み取りレイテンシでセッションストア、リーダーボード、リアルタイム分析のデータ層に向きます。キャッシュ用途には ElastiCache、唯一のデータソースとして使う場合は MemoryDB という使い分けが設計の要点です。
参考資料 (AWS 公式)
本ページの一次情報は AWS 公式サイトと公式ドキュメントです。最新の仕様と料金は次の公式ページで確認できます。
本ページと公式ドキュメントの記述が食い違う場合は、公式ドキュメントを正としてください。