Redis Persistence

Redisはデータをメモリに保存します。永続化はそのデータをディスクに保存します。このレッスンでは、RDBとAOFの永続化方法について解説します。

なぜ永続化が必要か

Redisはインメモリデータベースです:

メモリデータ → 永続化 → ディスクファイル
ディスクファイル → 復旧 → メモリデータ

Redisは2つの永続化方法を提供します:

RDB永続化

RDBとは

RDB(Redis Database)は、特定の時点のデータをバイナリスナップショットファイルとして保存します。

特徴:

RDBの設定

redis.conf で設定:

CONF
# スナップショットのトリガー条件
# save <秒数> <変更数>
save 900 1     # 900秒以内に少なくとも1つの変更 → スナップショットをトリガー
save 300 10    # 300秒以内に少なくとも10の変更 → スナップショットをトリガー
save 60 10000  # 60秒以内に少なくとも10000の変更 → スナップショットをトリガー

# RDBを無効にする(saveをコメントアウトするか、空に設定)
# save ""

# RDBファイル名
dbfilename dump.rdb

# RDBファイルの保存ディレクトリ
dir /var/lib/redis

# RDB圧縮(オンを推奨)
rdbcompression yes

# RDBチェックサム(オンを推奨)
rdbchecksum yes

手動RDBトリガー

REDIS
# SAVE:ブロッキングスナップショット(本番環境では注意して使用)
SAVE
OK  # スナップショット完了、この間Redisはブロックされていた

# BGSAVE:バックグラウンドスナップショット(推奨)
BGSAVE
Background saving started  # すぐに返り、バックグラウンドで実行
⚠️ 補足: SAVEはスナップショットが完了するまでRedisをブロックします。BGSAVEはバックグラウンドで実行され、ブロックしません。

RDBファイルの場所

BASH
# デフォルトの場所
/var/lib/redis/dump.rdb

# または設定で指定されたディレクトリ
dir /data/redis
dbfilename dump.rdb

RDBの復旧

Redisは起動時に自動的にRDBファイルをロードします:

BASH
# 1. RDBファイルを設定されたディレクトリに配置
cp dump.rdb /var/lib/redis/

# 2. Redisを起動
redis-server

# Redisは自動的にdump.rdbをロードしてデータを復旧

RDBのメリットとデメリット

メリット:

デメリット:

AOF永続化

AOFとは

AOF(Append Only File)はすべての書き込みコマンドを記録します。復旧時には、Redisがこれらのコマンドを再実行します。

特徴:

AOFの設定

CONF
# AOFを有効化
appendonly yes

# AOFファイル名
appendfilename "appendonly.aof"

# AOF同期戦略
appendfsync everysec

# AOF書き換え中にfsyncを無効化
no-appendfsync-on-rewrite no

# AOFファイルサイズが書き換えをトリガー
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

AOF同期戦略

戦略 説明 パフォーマンス 安全性
always 書き込みごとに同期 最も遅い 最も安全
everysec 1秒ごとに同期 中程度 適度に安全(最大1秒のデータ損失)
no OSに任せる 最も速い 最も安全でない
💡 推奨: appendfsync everysec — パフォーマンスと安全性のバランスが取れています。

AOFの書き換え

AOFファイルは継続的に大きくなります。書き換えにより圧縮します:

REDIS
# 手動でAOF書き換えをトリガー
BGREWRITEAOF
Background append only file rewriting started

書き換えの原則:

書き換えのトリガー条件:

CONF
# 前回の書き換えからAOFファイルサイズが100%増加
auto-aof-rewrite-percentage 100

# AOFファイルが少なくとも64MB以上で書き換えをトリガー
auto-aof-rewrite-min-size 64mb

AOFの復旧

Redisは起動時に自動的にAOFファイルをロードします:

BASH
# 1. AOFファイルを設定されたディレクトリに配置
cp appendonly.aof /var/lib/redis/

# 2. Redisを起動
redis-server

# Redisは自動的にappendonly.aofをロードしてデータを復旧

AOFファイルの修復

BASH
# AOFファイルをチェック
redis-check-aof appendonly.aof

# AOFファイルを修復
redis-check-aof --fix appendonly.aof

AOFのメリットとデメリット

メリット:

デメリット:

RDB vs AOFの比較

項目 RDB AOF
ファイルサイズ 小さい(コンパクトなバイナリ) 大きい(テキストコマンド)
復旧速度 速い 遅い
データ安全性 数分のデータ損失の可能性 最大1秒の損失
パフォーマンス影響 低い(バックグラウンドスナップショット) 中程度(頻繁なfsync)
ファイル可読性 読めない 読める
使用例 バックアップ、レプリケーション 高いデータ安全性要件

ハイブリッド永続化

Redis 4.0+はハイブリッド永続化をサポートしており、RDBとAOFの両方の利点を組み合わせます。

ハイブリッド永続化の設定

CONF
# AOFを有効化
appendonly yes

# ハイブリッド永続化を有効化
aof-use-rdb-preamble yes

ハイブリッド永続化の原則

AOF書き換え中:

  1. 最初に現在のデータをRDB形式で書き込む(高速、コンパクト)
  2. 次に新しい書き込み操作をAOF形式で追加する
AOFファイル構造:
[RDB形式のスナップショットデータ] + [AOF形式の増分コマンド]

ハイブリッド永続化の利点

💡 推奨: Redis 4.0+では、パフォーマンスと安全性の両方を考慮してハイブリッド永続化を使用すべきです。

永続化のベストプラクティス

シナリオ1:キャッシュのみ

CONF
# キャッシュには永続化は不要、またはRDBのみ
save 900 1
appendonly no

シナリオ2:データストレージ

CONF
# データストレージにはAOFまたはハイブリッド永続化
save 900 1
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

シナリオ3:高可用性

CONF
# RDBとAOFの両方を有効化
save 900 1
save 300 10
appendonly yes
appendfsync everysec
aof-use-rdb-preamble yes

バックアップ戦略

BASH
# 定期的にRDBとAOFファイルをバックアップ
# 1. cronを使用してファイルをコピー
0 2 * * * cp /var/lib/redis/dump.rdb /backup/dump-$(date +\%Y\%m\%d).rdb
0 2 * * * cp /var/lib/redis/appendonly.aof /backup/aof-$(date +\%Y\%m\%d).aof

# 2. BGSAVEでスナップショットを作成してからバックアップ
redis-cli BGSAVE
sleep 10  # スナップショット完了を待つ
cp /var/lib/redis/dump.rdb /backup/

復旧戦略

BASH
# RDBとAOFの両方が存在する場合、RedisはAOFを優先
# 1. Redisを停止
redis-cli SHUTDOWN NOSAVE

# 2. ファイルを復元
cp /backup/appendonly.aof /var/lib/redis/

# 3. Redisを起動
redis-server

永続化の監視

永続化状態の確認

REDIS
# RDBの状態を表示
INFO persistence

# 主要なメトリクス:
# rdb_last_save_time:最後のスナップショット時刻
# rdb_changes_since_last_save:最後のスナップショットからの変更数
# aof_enabled:AOFが有効かどうか
# aof_rewrite_in_progress:AOF書き換えが進行中かどうか

永続化パフォーマンスの監視

BASH
# RDBスナップショットの実行時間を監視
redis-cli INFO persistence | grep rdb_last_bgsave_time_sec

# AOF書き換えの実行時間を監視
redis-cli INFO persistence | grep aof_last_rewrite_time_sec

❓ よくある質問

Q RDBとAOFを同時に有効にできますか?
A はい。Redisは両方の方法を使用し、復旧時にはAOFを優先します。
Q 永続化方法の選び方は?
A キャッシュの場合はRDBまたは永続化なし。データストレージの場合はAOFまたはハイブリッド永続化。
Q AOFファイルが大きくなりすぎた場合は?
A BGREWRITEAOFを使用するか、自動書き換え条件を設定します。
Q 永続化はパフォーマンスに影響しますか?
A ある程度の影響があります。RDBの影響は小さく(バックグラウンドスナップショット)、AOFの影響は中程度です(頻繁なfsync)。
Q データ損失を最小限にするにはどうすればよいですか?
A appendfsync everysecのAOFを使用します。最大1秒のデータ損失です。

📖 まとめ

📝 練習問題

  1. RDB設定: 自動RDBスナップショット条件を設定し、手動でBGSAVEをトリガーしましょう
  2. AOF設定: AOFを有効にし、同期戦略間のパフォーマンスの違いをテストしましょう
  3. AOF書き換え: AOF書き換えをトリガーし、ファイルサイズの変化を観察しましょう
  4. データ復旧: RDB/AOFファイルをバックアップし、データ復旧をシミュレートしましょう

次のレッスン

次のレッスンでは、Redis Securityについて学びます。セキュリティ設定とアクセス制御を解説します。

100%