Blog ブログ

Redis データ永続化についてまとめてみた

皆さんお久しぶりです。
プログラマの吉村です。

最近昼間はようやく暖かくなってきましたが、まだ夜は寒いです。
夜寝る時に窓を開けっ放しにして風邪等引かないように気をつけましょう。

さて今回ですが、 Redis データ永続化についてまとめてみようと思います。

今更ですが、Redis とは インメモリ型の KVS です。
他にも Memcached 等が知られているかと思います。
本来 Redis は揮発性な為、サービスを停止させるとデータはなくなってしまいます。
ですが Redisではデータ永続化の機能によりデータを保持しておく事が可能です。
Redisデータ永続化の方法には2種類あります。
では、実際に2つを比較してみようと思います。

RDB(スナップショット)

この設定が有効な場合、Redis は定期的にデータベースの内容をディスクに出力します。
デフォルトでは dump.rdb というバイナリファイル内に保存されます。
再起動時にはこのデータを元にデータが復元されます。
設定は redis.conf というファイルで変更する事が出来ます。
またデフォルトでは下記のような設定になっているかと思います。

例えば save 900 1 では900秒以内に一回以上の更新があった場合に、保存されるという事になります。

逆に save “” にする事でバックアップを取らないようにする事も出来ます。

手動でバックアップを行う場合は、 SAVE コマンドを実行する事で可能です。
また BGSAVE ではバックグラウンドで実行する事が出来ます。

但し欠点として何からの障害などで Redis が停止した場合は
最後に取ったバックアップからの差分のデータを失う可能性があります。
その為、それが許容出来る場合に利用する事になります。

AOF(Append Only File)

AOF ではファイルへ Redis に実行されたコマンドが保存されていきます。
スナップショットでのデータ損失の可能性を許容出来ない場合はこちらの方法になります。
AOF を有効にする場合は同様に redis.conf を appendonly yes に変更します。
書き出す頻度の設定は次の3つから選択できます。
appendfsync を always を指定すれば AOF へ常に同期的に書き込まれる事になるので
データ損失の可能性はかなり低くなります。
しかし、同期的に書き込む場合とそうでない場合では、100倍ほどパフォーマンスが低下してしまうとの事です。
その為、everysec が落とし所となる場合が多くなるのではないでしょうか。 

注意点

redis.conf は Redis 起動時に読み込まれます。
その為、サービス起動中に redis.conf ファイルを変更しても反映されません。
起動中に設定を変更したい場合は CONFIG SET コマンドで行います。

またサービス起動中にスナップショットからAOFへ切り替える場合
AOFを有効にしただけでは、既に Redis へ登録されているデータがファイルへ書き込まれる訳ではありません。
またスナップショットとAOFが同時に有効になっている場合、データ復旧時にはAOFのファイルが優先されます。
(これは AOF の方が信頼性が高い事が保証されている為)

その為、スナップショットを有効にした状態で、運用を開始し、後にAOFを有効にした際にサービス再起動時にデータが読み込めない!といった事がありました。
そういった場合は、BGREWRITEAOF コマンドを実行する事で、その時点のDBを再構成し明示的に追記専用ファイルを作成する事が出来ます

まとめ

いかがでしたでしょうか。今回は簡単にですが Redis 永続化についてまとめてみました。
永続化しておく事でデータを残す事が出来るので、
残しておきたいデータがある場合は永続化の設定をおこなっておきましょう。
ただバックアップファイルを保存していても、
そのファイルが破損してしまったり、紛失してしまった場合は元も子もありません。
定期的にバックアップファイルを残す手段が課題となりそうです。
では今回はこの辺で。

採用情報

クラウドクリエイティブスタジオでは絶賛エンジニア募集中です。
一緒にゲームを作りましょう!

採用情報