Ubuntu14.04でRedisデータをバックアップおよび復元する方法
序章
Redisは、メモリ内のKey-Valueキャッシュおよびストア(つまり、データベース)であり、ディスクに永続化(永続的に保存)することもできます。 この記事では、Ubuntu14.04サーバーでRedisデータベースをバックアップする方法を説明します。
デフォルトでは、Redisデータは.rdb
ファイルでディスクに保存されます。これは、Redisデータセットの特定の時点のスナップショットです。 スナップショットは指定された間隔で作成されるため、バックアップに最適です。
前提条件
このチュートリアルの手順を完了するには、次のものが必要です。
- Ubuntu14.04サーバー
- Redisをインストールします。 このRedisセットアップチュートリアルからマスターセットアップに従うことができます(ただし、マスタースレーブクラスターでも同様に機能します)
- Redisサーバーが実行されていることを確認してください
- 強く推奨されるRedisパスワードが設定されている場合は、それを手元に用意してください。 パスワードはRedis構成ファイルにあります-
/etc/redis/redis.conf
ステップ1—Redisデータディレクトリを見つける
Redisは、そのデータをサーバー上のディレクトリに保存します。これは、バックアップしたいものです。 まず、それがどこにあるかを知る必要があります。
Ubuntuおよびその他のLinuxディストリビューションでは、Redisデータベースディレクトリは/var/lib/redis
です。 ただし、継承したサーバーを管理していて、Redisデータの場所が変更された場合は、次のように入力してサーバーを見つけることができます。
- sudo locate *rdb
または、redis-cli
プロンプトからも見つけることができます。 これを行うには、次のように入力します。
- redis-cli
Redisサーバーが実行されていない場合、応答は次のようになります。
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>
その場合は、Redisを起動し、次のコマンドを使用して再接続します。
- sudo service redis-server start
-
- redis-cli
シェルプロンプトは次のように変更されます。
127.0.0.1:6379>
Redisに接続している間、次の2つのコマンドはRedisに認証され、データディレクトリを取得します。
- auth insert-redis-password-here
-
- config get dir
最後のコマンドの出力は、Redisデータディレクトリになります。
1) "dir"
2) "/var/lib/redis"
Redisディレクトリをメモします。 表示されているディレクトリと異なる場合は、チュートリアル全体でこのディレクトリを使用してください。
ここでデータベースコマンドラインインターフェイスを終了できます。
- exit
これが正しいディレクトリであることを確認してください。
- ls /var/lib/redis
dump.rdb
ファイルが表示されます。 これがRedisデータです。 appendonly
も有効になっている場合は、appendonly.aof
または別の.aof
ファイルも表示されます。このファイルには、サーバーが受信したすべての書き込み操作のログが含まれています。
これら2つのファイルの違いについては、Redisの永続性に関するこの投稿を参照してください。 基本的に、.rdb
ファイルは現在のスナップショットであり、.aof
ファイルはRedisの履歴を保持します。 どちらもバックアップする価値があります。
.rdb
ファイルだけで開始し、両方のファイルの自動バックアップで終了します。
(オプション)ステップ2 —サンプルデータの追加
このセクションでは、Redisデータベースに保存するサンプルデータを作成できます。 サーバーにすでにデータがある場合は、既存のコンテンツをバックアップするだけです。
データベースのコマンドラインインターフェイスにログインします。
- redis-cli
認証する:
- auth insert-redis-password-here
サンプルデータを追加してみましょう。 各ステップの後にOK
の応答が返されるはずです。
- SET shapes:triangles "3 sides"
-
- SET shapes:squares "4 sides"
データが追加されたことを確認してください。
- GET shapes:triangles
-
- GET shapes:squares
出力は以下に含まれています:
"3 sides"
"4 sides"
これらの変更を/var/lib/redis/dump.rdb
ファイルにコミットするには、次のように保存します。
- save
終了できます:
- exit
必要に応じて、ここでダンプファイルの内容を確認できます。 マシンフレンドリーな形式ではありますが、データが含まれている必要があります。
- sudo cat /var/lib/redis/dump.rdb
REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C
ステップ3—Redisデータのバックアップ
Redisデータの場所がわかったので、次にバックアップを作成します。 公式のRedisWebサイトから、次の引用があります。
Redisは、データベースの実行中にRDBファイルをコピーできるため、データのバックアップに非常に適しています。RDBは、作成後に変更されることはなく、作成中は一時的な名前を使用し、rename(2)のみを使用してアトミックに最終的な宛先に名前が変更されます。新しいスナップショットが完了したとき。
そのため、Redisサーバーの実行中にデータベースファイルをバックアップまたはコピーできます。 ホームフォルダの下のディレクトリにバックアップしていると仮定すると、そのバックアップの実行は次のように入力するのと同じくらい簡単です。
- sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001
Redisはここにコンテンツを定期的に保存します。つまり、上記のコマンドを実行するだけでは、最新のバックアップが保証されません。最初にデータを保存する必要があります。
ただし、潜在的に少量のデータ損失が許容できる場合は、この1つのファイルをバックアップするだけで機能します。
データベースの状態を保存する
Redisデータのより新しいコピーを取得するには、Redisコマンドラインであるredis-cli
にアクセスすることをお勧めします。
手順1で説明したように認証します。
次に、次のようにsave
コマンドを発行します。
- save
出力は次のようになります。
OK
(1.08s)
データベースを終了します。
これで、上記のcp
コマンドを実行して、バックアップが完全に最新であることを確認できます。
cp
コマンドはデータベースの1回限りのバックアップを提供しますが、最善の解決策は、プロセスを自動化するcronジョブを設定し、増分更新を実行できるツールを使用することです。 、データを復元します。
ステップ4—rdiff-backupとCronを使用した自動更新の構成
このセクションでは、両方のデータファイルを含むRedisデータディレクトリ全体をバックアップする自動バックアップを構成します。
利用可能な自動バックアップツールがいくつかあります。 このチュートリアルでは、rdiff-backup
と呼ばれる新しいユーザーフレンドリーなツールを使用します。
rdiff-backup
コマンドラインバックアップツール。 rdiff-backup
がサーバーにインストールされていない可能性があるため、最初にインストールする必要があります。
- sudo apt-get install -y rdiff-backup
インストールされたので、Redisデータをホームディレクトリのフォルダにバックアップしてテストできます。 この例では、ホームディレクトリが/home/sammy
であると想定しています。
ターゲットディレクトリが存在しない場合は、スクリプトによって作成されることに注意してください。 つまり、自分で作成する必要はありません。
–preserve-numerical-ids を使用すると、ソースフォルダーと宛先フォルダーの所有権は同じになります。
- sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis
以前のcp
コマンドと同様に、これは1回限りのバックアップです。 変更されたのは、/var/lib/redis
ディレクトリ全体をバックアップし、rdiff-backup
を使用していることです。
次に、cronを使用してバックアップを自動化し、設定された時間にバックアップが実行されるようにします。 これを行うには、システムのcrontabを開きます。
- sudo crontab -e
(このサーバーで以前にcrontabを使用したことがない場合は、プロンプトでお気に入りのテキストエディタを選択してください。)
filekの下部に、以下に示すエントリを追加します。
0 0 * * * rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
このCronエントリは、毎日深夜にRedisバックアップを実行します。 –no-file-statistics スイッチは、rdiff-backup-data
ディレクトリ内のfile_statistics
ファイルへの書き込みを無効にします。これにより、rdiff-backup
がより高速に実行されて使用されます。ディスク容量を少し減らします。
または、このエントリを使用して、毎日のバックアップを作成することもできます。
- @daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis
一般的なCronの詳細については、Cronに関するこのの記事をお読みください。
現状では、バックアップは1日1回行われるため、明日戻って最終テストを行うことができます。 または、バックアップの頻度を一時的に増やして、機能していることを確認することもできます。
ファイルはredisシステムユーザーが所有しているため、このコマンドを使用してファイルが配置されていることを確認できます。 (バックアップが実際にトリガーされるまで待つようにしてください):
- ls -l /home/sammy/redis
出力は次のようになります。
total 20
-rw-rw---- 1 redis redis 70 Sep 14 13:13 dump.rdb
drwx------ 3 root root 12288 Sep 14 13:49 rdiff-backup-data
-rw-r----- 1 redis redis 119 Sep 14 13:09 redis-staging-ao.aof
これで、Redisデータの毎日のバックアップが作成され、同じサーバーのホームディレクトリに保存されます。
ステップ5—バックアップからのRedisデータベースの復元
Redisデータベースをバックアップする方法を確認したので、この手順では、dump.rdb
バックアップファイルからデータベースを復元する方法を示します。
バックアップを復元するには、アクティブなRedisデータベースファイルを復元ファイルに置き換える必要があります。 これは潜在的に破壊的であるため、可能であれば新しいRedisサーバーに復元することをお勧めします。
より問題のある復元でライブデータベースを上書きしたくないでしょう。 ただし、現在のファイルを削除するのではなく名前を変更すると、同じサーバーに復元する場合でもリスクが最小限に抑えられます。これが、このチュートリアルで示す戦術です。
復元ファイルの内容を確認する
まず、dump.rdb
ファイルの内容を確認してください。 必要なデータが含まれていることを確認してください。
ダンプファイルの内容を直接確認できますが、人間にわかりやすいフォーマットではなく、Redisに適したフォーマットを使用していることに注意してください。
- sudo cat /home/gilly/redis/dump.rdb
これは小さなデータベース用です。 出力は次のようになります。
REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,?
最新のバックアップにデータがない場合は、復元を続行しないでください。 コンテンツがそこにある場合は、続行します。
オプション:データ損失のシミュレーション
バックアップから復元する理由となるデータ損失をシミュレートしてみましょう。
Redisにログインします。
- redis-cli
この一連のコマンドでは、Redisで認証し、shapes:triangles
エントリを削除します。
- auth insert-redis-password-here
-
- DEL shapes:triangles
次に、エントリが削除されたことを確認しましょう。
- GET shapes:triangles
出力は次のようになります。
(nil)
保存して終了:
- save
-
- exit
オプション:新しいRedisサーバーのセットアップ
ここで、新しいRedisサーバーに復元する場合は、新しいRedisサーバーが稼働していることを確認してください。
このチュートリアルでは、この RedisClusterチュートリアルのステップ1のみを実行しますが、より高度なセットアップが必要な場合は、記事全体を実行できます。
パスワードを追加してAOFを有効にするステップ2に従う場合は、復元プロセスでそのことを考慮してください。
redis-benchmark -q -n 1000 -c 10 -P 5
を実行して、Redisが新しいサーバーで稼働していることを確認したら、次に進むことができます。
Redisの停止
Redisダンプファイルを置き換える前に、現在実行中のRedisのインスタンスを停止する必要があります。 Redisを停止すると、データベースはオフラインになります。
sudo service redis-server stop
出力は次のようになります。
Stopping redis-server: redis-server
実際に停止していることを確認してください。
sudo service redis-server status
redis-server is not running
次に、現在のデータベースファイルの名前を変更します。
現在のdump.rdbの名前を変更
Redisは、dump.rdb
ファイルからその内容を読み取ります。 復元ファイルに道を譲るために、現在の名前を変更しましょう。
sudo mv /var/lib/redis/dump.rdb /var/lib/redis/dump.rdb.old
現在のバージョンがバックアップファイルよりも優れていると判断した場合は、dump.rdb.old
を復元できることに注意してください。
AOFが有効になっている場合は、オフにします
AOFは、Redisデータベースへのすべての書き込み操作を追跡します。 ただし、ポイントインタイムバックアップから復元しようとしているため、RedisにAOFファイルに保存されている操作を再作成させたくありません。
Redis Clusterチュートリアルの手順からRedisサーバーをセットアップすると、AOFが有効になります。
/var/lib/redis/
ディレクトリの内容を一覧表示することもできます。 そこに.aof
ファイルが表示されている場合は、AOFが有効になっています。
.aof
ファイルの名前を変更して、一時的に邪魔にならないようにしましょう。 これにより、.aof
で終わるすべてのファイルの名前が変更されるため、複数のAOFファイルがある場合は、ファイルの名前を個別に変更し、次のコマンドを実行しないでください。
- sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old
Redis構成ファイルを編集して、AOFを一時的にオフにします。
- sudo nano /etc/redis/redis.conf
AOF
セクションで、appendonly
ディレクティブを探し、yes
からno
に変更します。 それはそれを無効にします:
appendonly no
dump.rdbファイルの復元
次に、復元ファイルを使用します。このチュートリアルの前の手順に従った場合は、/home/sammy/redis/dump.rdb
に保存する必要があります。
新しいサーバーに復元する場合は、今度はバックアップサーバーから新しいサーバーにファイルをアップロードします。
- scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb
これで、元のRedisサーバーまたは新しいサーバーである復元サーバーので、cp
を使用してファイルを/var/lib/redis
フォルダーにコピーできます。
- sudo cp -p /home/sammy/redis/dump.rdb /var/lib/redis
(ファイルを/home/sammy/dump.rdb
にアップロードした場合は、代わりにコマンドsudo cp -p /home/sammy/dump.rdb /var/lib/redis
を使用してファイルをコピーしてください。)
または、rdiff-backup
を使用する場合は、以下のコマンドを実行してください。 これは、最初にrdiff-backup
で設定したフォルダから復元する場合にのみ機能することに注意してください。 rdiff-backup
では、宛先フォルダー内のファイルの名前を指定する必要があります。
- sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb
-r
オプションの詳細は、この記事の最後にあるプロジェクトのWebサイトで入手できます。
dump.rdbファイルの権限の設定
バックアップを作成したのと同じサーバーに復元する場合は、おそらくすでに正しいアクセス許可を持っています。
バックアップファイルを新しいサーバーにコピーした場合は、ファイルのアクセス許可を更新する必要があります。
/var/lib/redis/
ディレクトリにあるdump.rdb
ファイルの権限を見てみましょう。
- ls -la /var/lib/redis/
このようなものが表示された場合:
-rw-r----- 1 sammy sammy 70 Feb 25 15:38 dump.rdb
-rw-rw---- 1 redis redis 4137 Feb 25 15:36 dump.rdb.old
ファイルがredisユーザーとグループによって所有されるように、アクセス許可を更新する必要があります。
- sudo chown redis:redis /var/lib/redis/dump.rdb
グループでも書き込み可能になるようにファイルを更新します。
- sudo chmod 660 /var/lib/redis/dump.rdb
次に、/var/lib/redis/
ディレクトリの内容を再度リストします。
- ls -la /var/lib/redis/
これで、復元されたdump.rdb
ファイルに正しい権限が与えられました。
-rw-rw---- 1 redis redis 70 Feb 25 15:38 dump.rdb
-rw-rw---- 1 redis redis 4137 Feb 25 15:36 dump.rdb.old
ファイルを復元する前にRedisサーバーデーモンが実行されていて、起動しない場合は、Could not connect to Redis at 127.0.0.1:6379: Connection refused
のようなメッセージが表示されます—Redisのログを確認してください。
Fatal error loading the DB: Permission denied. Exiting.
のような行がログに表示される場合は、この手順で説明されているように、dump.rdb
ファイルのアクセス許可を確認する必要があります。
Redisを起動しています
次に、Redisサーバーを再起動する必要があります。
sudo service redis-server start
データベースの内容を確認する
復元が機能したかどうかを見てみましょう。
Redisにログインします。
- redis-cli
shapes:triangles
エントリを確認してください。
- GET shapes:triangles
出力は次のようになります。
"3 sides"
素晴らしい! 私たちの修復はうまくいきました。
出口:
- exit
AOFを使用していない場合は、これで完了です。 復元されたRedisインスタンスは通常の状態に戻るはずです。
(オプション)AOFの有効化
データベースへのすべての書き込みを追跡するためにAOFの使用を再開または開始する場合は、次の手順に従ってください。 AOFファイルはRedisコマンドラインから再作成する必要があります。
Redisにログインします。
- redis-cli
AOFをオンにします。
- BGREWRITEAOF
次の出力が得られるはずです。
Background append only file rewriting started
info
コマンドを実行します。 これにより、かなりの量の出力が生成されます。
- info
Persistence セクションまでスクロールし、aofエントリがここに表示されているものと一致することを確認します。 aof_rewrite_in_progressが0の場合、AOFファイルの再作成は完了しています。
# Persistence
. . .
aof_enabled:0
aof_rewrite_in_progress:0
aof_rewrite_scheduled:0
aof_last_rewrite_time_sec:0
aof_current_rewrite_time_sec:-1
aof_last_bgrewrite_status:ok
aof_last_write_status:ok
AOFファイルの再作成が完了したことが確認されたら、Redisコマンドラインを終了できます。
- exit
/var/lib/redis
のファイルを再度一覧表示できます。
- ls /var/lib/redis
appendonly.aof
やredis-staging-ao.aof
などのライブ.aof
ファイルが、dump.rdb
ファイルやその他のバックアップファイルとともに表示されます。
それが確認されたら、Redisサーバーを停止します。
- sudo service redis-server stop
ここで、redis.conf
ファイルでAOFを再度オンにします。
- sudo nano /etc/redis/redis.conf
次に、appendonly
の値をyes
に変更して、AOFを再度有効にします。
appendonly yes
Redisを起動します:
- sudo service redis-server start
データベースの内容をもう一度確認したい場合は、データベースの内容の確認セクションをもう一度実行してください。
それでおしまい! 復元されたRedisインスタンスは通常の状態に戻るはずです。
結論
この記事に記載されている方法でRedisデータをバックアップすることは、同じサーバー上のディレクトリにデータをバックアップすることを気にしない場合に適しています。
もちろん、最も安全なアプローチは、別のマシンにバックアップすることです。 バックアップに関する次の記事を読むことで、より多くのバックアップオプションを調べることができます。
これらのバックアップ方法の多くは、/var/lib/redis
ディレクトリ内の同じファイルで使用できます。
Redisの移行と復元に関する今後の記事に注目してください。 rdiff-backup
を効果的に使用する方法については、rdiff-backup
のドキュメントの例を参照することもできます。