RedisはRDB方式でデータのバックアップと復元を行う方法です。


Intro
Redisのデータを移行する必要がある場合がありますが、今日はRDBファイルでRedisデータのバックアップと復元を紹介します。
Redisの持続化
Redisのデータ耐久化には、RDB(Redis Database)とAOF(Apend Only File)の2つの機構があります。
Redisは異なるレベルの持続化方式を提供する。
  • RDB耐久化方式は指定された時間間隔であなたのデータをスナップショットで保存することができます。
  • AOF持続的な方法では、サーバに書いた操作毎に、サーバが再起動すると、これらのコマンドを実行して元のデータを復元します。AOFコマンドは、Redisプロトコルでファイルの最後まで追加保存します。RedisはAOFファイルをバックグラウンドで書き換えます。AOFファイルの体積が大きすぎないようにします。
  • もしあなたのデータがサーバーで動作する時だけ存在することを望むならば、あなたもいかなる持久化の方式を使わないことができます。
  • あなたも同時に二つの持続化方式を開けてもいいです。この場合、redisが再開されると、AOFファイルを優先的にロードして元のデータを復元します。通常の場合、AOFファイルに保存されているデータセットはRDBファイルに保存されているデータセットより完全です。
  • RDBのメリット
  • RDBは非常にコンパクトなファイルです。ある時点でデータセットを保存しています。データセットのバックアップにとても適しています。例えば、一時間ごとに過去24時間以内のデータを保存して、毎日30日間のデータを保存してください。問題があっても、必要に応じて異なるバージョンのデータセットに戻ります。
  • RDBはコンパクトな単一ファイルで、他のリモートデータセンターやアマゾンのS 3(暗号化可能)に転送しやすく、非常に災難回復に適しています。
  • RDBファイルを保存する時、父プロセスが唯一しなければならないのはforkである。次の仕事は全部子プロセスでやります。父プロセスは他のIO操作をする必要がないので、RDB耐久化方式はredisの性能を最大化することができます。
  • は、AOFと比べて、大きなデータセットを復元するとき、RDDB方式がより速くなります。
  • DBの欠点
  • レディが不意に停止した場合(例えば電源が切れた場合)、最も少ないデータが失われた場合、RDBはあなたに適していません。異なるセーブポイントを設定できますが、例えば5分ごとにデータセットに100個の操作があります。Redisがデータセット全体を完全に保存するのは比較的に重い仕事です。あなたは通常5分ごとにあるいはもっと長い間一回の完全な保存をして、もしRedis意外なあたまで、あなたは何分間のデータを失うかもしれません。
  • RDBは常にforkサブルーチンをハードディスクに保存する必要があります。データセットが大きい場合、forkのプロセスは非常に時間がかかります。Redisはいくつかのミリ秒レベルでクライアントの要求に応答できなくなる可能性があります。データセットが巨大で、CPUの性能があまり良くない場合、このような状況が1秒続きます。AOFもforkが必要です。しかし、ログファイルを書き換える頻度を調節して、データセットの耐久度を高めることができます。
    AOFメリット
  • AOFを使用するとあなたのRedisがより長くなります。異なるfsyncポリシーを使用できます。fsyncなし、毎秒fsync、書き込みのたびにfsync。デフォルトの毎秒fsyncポリシーを使用して、Redisの性能は依然として優れています。
  • AOFファイルは一つの追加のログファイルですので、seekに書き込む必要はありません。いくつかの理由で(ディスクの空き領域がいっぱいになりました。書いている間に、あたごなど)完全な書き込みコマンドが実行されていません。また、redis-check-aofツールを使ってこれらの問題を修復することもできます。
  • Redisは、AOFファイルの体積が大きすぎると、自動的にバックグラウンドでAOFを書き換えることができる。書き換えた新しいAOFファイルは、現在のデータセットを復元するために必要な最小コマンドセットを含む。書き込み全体は絶対安全です。Redisは新しいAOFファイルを作成する過程で、既存のAOFファイルにコマンドを追加し続けます。書き換え中に停止が発生しても、既存のAOFファイルは失われません。新しいAOFファイルの作成が完了すると、Redisは古いAOFファイルから新しいAOFファイルに切り替わり、新しいAOFファイルの追加操作を開始します。
  • AOFファイルはデータベースに対して実行されたすべての書き込み操作を規則的に保存しています。これらの書き込み操作はRedisプロトコルの形式で保存されていますので、AOFファイルの内容は非常に読みやすく、ファイルを分析するのも楽です。エクスポート(export)AOFファイルも非常に簡単です。例を挙げると、FLUSHALLコマンドを不用意に実行しましたが、AOFファイルが書き換えられていない限り、サーバーを停止し、AOFファイルの末尾にあるFLUSHALLコマンドを削除し、Redisを再開することで、FLUSHALL実行前の状態に戻すことができます。
  • AOF欠点
  • は、同じデータセットに対して、AOFファイルの体積は、通常、RDBファイルの体積より大きい。
  • 使用するfsyncポリシーにより、AOFの速度がRDBより遅くなる可能性があります。一般的には、毎秒fsyncの性能は非常に高く、fsyncをオフにすることで、AOFの速度をRDBと同じように速くすることができ、高負荷下でもこのようにすることができる。ただし、巨大な書き込みを処理してロードする場合、RDBはより保証された最大遅延時間を提供することができる。
  • 余計な話はしないで、直接に次の例を見てください。dockerを通してredisのインスタンスを実行して、いくつかのデータを設定して、RDBファイルをエクスポートして、もう一つのredisのインスタンスを実行して、RDBファイルでデータを復元します。
    バックアップdocker run -d --name redis-test-1 redis:alpineコマンドによってredisのインスタンスを作成し、次いでSETのkeyが私たちのredisに保存され、コマンドSET hello worldを使用してテストデータを書き込み、他の自分が書きたいデータも書き込むことができ、次にkeys *を使用してデータの書き込みが成功したかどうかを検証することができます。

    テストデータの書き込みが成功したらSAVEコマンドでRDBファイルを作成します。コマンド実行が成功したら/dataディレクトリの下にdump.rdbファイルがあります。これは私達が欲しいRDBファイルです。docker cpコマンドでこのファイルをホームディレクトリにコピーすることができます。

    元に戻す
    上記のRDBファイルを通じて、redis起動時にRDBファイルのデータを復元することができます。Redis起動前にRDBファイルをredisのdataディレクトリの下に置くだけでいいです。
    実行docker run --rm --name redis-test-2 -v ${pwd}/data:/data redis:alpineこのコマンドはパワーシェルで実行します。もしLinuxで実行するなら、${pwd}$(pwd)に変えて現在のディレクトリを表します。

    上記のログにはLoading RDB ...があります。RDBファイルをロードしているデータです。
    また、RDBファイルのデータが本当に新しいredisのインスタンスにロードされているかを確認します。dataディレクトリが正常にマウントされているかどうか確認します。docker exec -it redis-test-2 shを実行して、redisのインスタンスコンテナに入ります。lsは、dataディレクトリのファイルが私達が期待するRDBファイルがあるかどうかを確認し、redis-cliに進みます。keys *を使って、すべてのkey情報を並べます。前のredisに書き込んだテストデータがあります。またGET helloを使って、データが正しいかどうかを検証します。これで私達のデータは新しいredisのインスタンスに戻ります。

    More
    Redisがdump.rdbファイルを保存する必要がある場合、サーバは以下のような動作を実行する。
  • Redisはforksを呼び出し、親プロセスと子プロセスを同時に持つ。
  • サブルーチンは、データセットを一時的なRDBファイルに書き込む。
  • サブプロセスが新しいRDBファイルに対する書き込みを完了すると、Redisは新しいRDBファイルで元のRDBファイルを置換し、古いRDBファイルを削除する。
  • このような働き方はRedisが書き込み時にコピーする仕組みから利益を得ることができる。
    redisが頻繁にアクセスされる場合、BGSAVEの代わりにSAVEを使用して、非同期的にRDBバックアップを作成することができる。
    redisがdockerを使用していない場合、/dataディレクトリは、redis-cliでCONFIG GET dirを使用して、rdbファイルを保存するディレクトリを取得することができ、デフォルトで保存されているRDBファイル名はdump.rdbであり、修正があれば、CONFIG GET dbfilenameを介して現在使用されているファイル名を取得することができる。
    References
    https://redis.io/topics/persistence
    http://redis.cn/topics/persistence.html
    ここでは、RedisについてRDB方式でデータのバックアップと復元を行っています。これについて紹介します。Redisに関するデータのバックアップと復元については、以前の記事を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。