Redisはメモリベースのデータストレージであるため、基本的には揮発性です。Redisサーバーが再起動すると、すべてのデータが消える可能性があり、これを補うためにRedisは2つのデータ保存方式を提供します: RDB (Redis Database Snapshot)AOF (Append-Only File)。今回は、2つの方式の特徴と違いを見て、それぞれの設定方法と長所短所を整理します。

1. RDB (Redis Database Snapshot)

RDB方式は、Redisがメモリに保存されたデータを定期的にスナップショット(Snapshot)の形でディスクに保存する方式です。Redisは設定された周期に応じてRDBファイルを生成し、このファイルを介してサーバーの再起動時にデータを復元することができます。

RDBの主要特徴

  • 保存周期: redis.confファイルでsaveオプションを通じて、データをディスクに保存する周期を設定できます。例えば、save 60 100060秒ごとに1000個以上のキーが変更された場合にスナップショットを生成します。
save 60 1000
  • ファイル位置: RDBファイルは基本的にdirで指定したディレクトリに保存され、基本パスは/var/lib/redisで、ファイル名はdump.rdbです。
dir /var/lib/redis/
dbfilename dump.rdb

RDBの長所

  • 高性能: RDB方式はRedisの性能に大きな影響を与えず、スナップショット生成周期が長い場合はCPUリソースも大きく消費しません。
  • 小さいファイルサイズ: 定期的に全データをスナップショットとして記録するため、ファイルサイズが比較的小さく、バックアップ管理が容易です。

RDBの短所

  • データ喪失の可能性: RDB方式は定期的に保存するため、Redisが突然停止した場合最後のスナップショット以降のデータは失われる可能性があります。
  • 復元速度: RDBはすべてのデータを一度にスナップショットして保存するため、大量のデータを復元する場合、時間がかかることがあります。

RDBの適切な使用例

RDBは主にキャッシュデータのように、一定周期ごとにバックアップしても問題ない場合に適しています。リアルタイム作業キューよりも、定期的なデータバックアップが必要な場合に有利であり、Redisサーバーのパフォーマンスを維持しながら簡単にデータ保持性を確保できます。

2. AOF (Append-Only File)

AOFは、Redisのすべての書き込み作業をディスクに順次記録して持続的なデータ保持を提供します。AOFファイルはすべてのデータ変更を漏れなく記録するため、Redisサーバーが再起動してもAOFファイルを通じて完全に復元できます。

AOFの主要特徴

  • コマンド記録方式: AOFファイルはすべてのデータ変更コマンドを記録します。書き込みコマンドが発生するたびにディスクに保存するため、すべてのデータ変更履歴が保存されます。
  • ファイル位置と名前: AOFファイルは基本的にappendfilenameオプションで指定した名前で保存されます。デフォルト値はappendonly.aofで、dir設定で指定されたディレクトリに保存されます。
dir /var/lib/redis/
appendonly yes
appendfilename appendonly.aof
  • 同期周期: appendfsyncオプションでディスクにデータを記録する周期を設定できます。
appendfsync everysec  # 毎秒同期

AOFの長所

  • データ保持性: すべての書き込み作業をディスクに記録するため、サーバーが突然停止しても最後の記録状態までデータを復元できます。
  • 読み取りコマンドは記録しない: AOFはすべてのデータ変更コマンドのみを記録するため、不必要な読み取りコマンドはファイルに含まれず、保存スペースを節約します。
Redis data persistence options infographic

AOFの短所

  • パフォーマンス低下の可能性: すべての書き込み作業をディスクに記録するため、特にappendfsyncalwaysに設定した場合、パフォーマンスが低下することがあります。
  • ファイルサイズの増加: データ変更が頻繁な場合、AOFファイルサイズが非常に大きくなる可能性があります。これを解決するために、RedisはBGREWRITEAOFコマンドを通じてAOFファイルを圧縮できます。

AOFの適切な使用例

AOFは作業キューデータ保持が重要なアプリケーションに役立ちます。データ保持性が重要な場合、定期的な同期(everysec)設定とともに使用して、性能とデータ保持性をバランスよく調整できます。

3. RDBとAOFの同時使用

RedisではRDBとAOF方式を同時に使用してデータ保持性と性能をバランス良く維持できます。両方の方式が有効な場合、RedisはAOFファイルを優先して復元します。

  • RDB: 速く簡単にデータを保存し、スナップショット方式で基本的なバックアップを提供します。
  • AOF: すべての書き込み作業を記録してデータ保持性を高めるため、データ喪失の可能性を最小限に抑えることができます。

4. Redis設定例

以下はRDBとAOFを同時に使用し、適切な性能とデータ保持性を維持する設定の例です。

# Redis基本ディレクトリとファイル設定
dir /var/lib/redis/
dbfilename dump.rdb
appendfilename appendonly.aof

# RDBスナップショット設定 (毎60秒ごとに1000個以上のキーが変更された場合、スナップショット保存)
save 60 1000

# AOF設定
appendonly yes
appendfsync everysec  # 毎秒ディスク同期

# AOFファイルリライト設定 (ファイルサイズが64MB以上の場合100%増加時に自動リライト)
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

おわりに

今回のポストでは、Redisの2つのデータ保存方式であるRDBとAOFについて解説しました。各方式は保存性と性能に違いがあるため、アプリケーションの特性に応じて適切な方式を選択することが重要です。次回はRedisメモリ管理と性能最適化について扱い、Redisのメモリを効率的に活用する方法を紹介する予定です。