オルトプラスエンジニアの日常をお伝えします!

Redisの特定のkeyのデータだけバックアップを取ってみた

この記事は「AltPlus Advent Calendar 2016」の7日目の記事です。

どうもこんにちわ、id:uratakuplusです。

普段はトレーナー件プロデューサー件サーバーサイドエンジニア件運用ゲームの上位ランカー?(最高58位)を務めております (半分以上ゲームでの職業です)

Tech Blog初投稿となります。本日はエンジニアとして参加します。

今回は、業務上で使ったRedisにある特定のkeyのデータのバックアップ方法をまとめたいと思います。

よく検索で出てくるRedisでのバックアップの方法

Redis内のデータを全て保存する方法として標準のコマンドで

$ redis-cli save

というsaveコマンドがあります。

しかし、saveの場合は処理が終了するまでロックが発生されるため、

$ redis-cli bgsave

というバックグラウンドで保存を行うbgsaveコマンドがあります。

この時できたdumpファイル(/var/lib/redis/dump.rdb)を保存することでバックアップが取れます。

この方法ではRedisのデータを全てバックアップを取るものであり、特定のkeyのデータを取得するものではありません。 一部のデータを修正する際や必要なデータのみを取得したい場合だと下記のような方法ができます。

今回やった方法

例として下記のようなzset型のデータ(某ゲームの素早さの値です、トレーナーの本能が出ました)を用意しました。

$ redis-cli zadd p_speed 75 60
(integer) 1
$ redis-cli zadd p_speed 100 80
(integer) 1
$ redis-cli zadd p_speed 167 100
(integer) 1
$ redis-cli zadd p_speed 169 102
(integer) 1
$ redis-cli zadd p_speed 200 130
(integer) 1

redisのdumpコマンドを用いてバックアップを取りました。

$ redis-cli --raw dump p_speed | head -c-1 > /tmp/backup.txt

$ cat /tmp/backup.txt

--(
?<?K?P?d?d???f???????n???K?S

何やらシリアライズ化されたテキストが出力されました。

dumpコマンドはRedis固有の形式でシリアライズ化された形式でkey内のvalueを取得することができます。 また、--rawを付けることでマルチバイト文字列で文字化けがおきないようになります。

この出力をheadコマンドにより保存することでバックアップを取ることが出来ます。

では、このデータを他の環境などに反映させる場合どのようにするか?

その場合、redisのrestore(https://redis.io/commands/restore)コマンドで実行します。

$ cat /tmp/backup.txt | redis-cli -x restore p_speed_sun 0
OK

軽いノリ?でOKと返ってきましたが本当にOKなんでしょうか?

$ redis-cli zrange p_speed_sun 0 -1 withscores
 1) "60"
 2) "75"
 3) "80"
 4) "100"
 5) "100"
 6) "167"
 7) "102"
 8) "169"
 9) "130"
10) "200"

こちらでredisのデータのバックアップが取れたことが確認できました。 restoreコマンドで第二引数の値を変更することでkeyの期限も設定可能です。

まとめ

redis内のデータを全てバックアップするならbgsaveコマンドで、 少量のデータのバックアップするならdumpコマンド、restoreコマンドでバックアップ可能です。