Amazon MemoryDB for Redisは耐久性があるけれどもEviction問題からは逃げられません
AWSが提供するデータストアにAmazon MemoryDB for Redisというサービスがあります。 製品ページを確認すると「耐久性に優れたデータベースです。MemoryDB は 99.99% の可用性を実現し、データを失うことなくほぼ瞬時に復元できます」と紹介されています。
インメモリデータベースが耐久性に優れているはどういうことでしょうか?
分散トランザクションログを利用した耐久性
MemoryDB for RedisはDBMSのようにトランザクションログを活用して耐久性(durable)を実現しています。
OSS版RedisやElastiCache Redisの場合、プライマリノードへの書き込みが成功したら、ノードはACKを返します。書き込み直後にノード・AZ障害が起こると、データロストが発生します。
MemoryDBの場合、プライマリノードに書き込み、さらに別AZにもトランザクションログを書き込んだあとでノードはACKを返します。 この一連の処理は同期的に行われるため、MemoryDB for Redisの書き込み速度は一般のRedisに比べて劣ります。
※ Ultra-low latency vector search for Amazon MemoryDB for Redis (DAT346) から
ここで注意が必要なのは、同期処理で行われるのは分散トランザクションログの書き込みまでであり、別AZにあるノード(レプリカ)へのログ反映は非同期に行われるため、結果整合に振る舞うことです。
※ Ultra-low latency vector search for Amazon MemoryDB for Redis (DAT346) から
フェイルオーバー時には、トランザクションログをすべて適用後にプライマリに昇格します。そのため、データロスはありません。
※ Ultra-low latency vector search for Amazon MemoryDB for Redis (DAT346) から
RedisへのAmazon Auroraのようなログストレージの導入はSIGMOND 2024で発表されています
メモリが溢れたらEvictionが発生
MemoryDB for Redisは名前の通りインメモリデータベースです。
データはメモリに乗っているため、読み取り速度はマイクロ秒です。
メモリーが溢れた時の振る舞いを定義する maxmemory-policy パラメーターを設定可能であり、CloudWatch Metricsには メモリ溢れで削除されたキーの数を表す Evictions が存在します。
MemoryDB for Redisでは、maxmemory-policy
のデフォルト値は noeviction
です。空きメモリがない状態では OOM(Out Of Memory)が発生し、既存のデータが守られる一方で新規書き込みは失敗します。
noeviction
以外の値も設定可能であり、そのようなケースでは maxmemory-policy
のポリシーに従ってキーが削除(Eviction)されます。
つまるところ、メモリが溢れた時の挙動はOSS版のRedisやElastiCache Redisと同じです。
なお、MemoryDB for RedisはElastiCacheと同じくメモリー層だけでなくSSD層にもデータを保存できます(Data Tiering)。Data Tiering利用時には、基本的にメモリー層とSSD層を使い切ったタイミングで maxmemory-policy
が発動します。
まとめ
Amazon MemoryDB for Redisは耐久性を備えたインメモリデータベースサービスです。分散トランザクションログのおかげでデータのロストはありません。同時に、インメモリデータベースでもあり続けているため、空きメモリがない状態では、通常のRedisと同じくOOMやEvictionが発生します。
Amazon MemoryDB for RedisはRedisインターフェースの永続的なデータベースではなく、メモリ不足時にはデータが消える可能性があります。
Amazon MemoryDB for Redisは製品特性をよく理解した上で導入しましょう。