序章

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データの場所が変更された場合は、次のように入力してサーバーを見つけることができます。

  1. sudo locate *rdb

または、redis-cliプロンプトからも見つけることができます。 これを行うには、次のように入力します。

  1. redis-cli

Redisサーバーが実行されていない場合、応答は次のようになります。

出力
Could not connect to Redis at 127.0.0.1:6379: Connection refused
not connected>

その場合は、Redisを起動し、次のコマンドを使用して再接続します。

  1. sudo service redis-server start
  2. redis-cli

シェルプロンプトは次のように変更されます。

127.0.0.1:6379>

Redisに接続している間、次の2つのコマンドはRedisに認証され、データディレクトリを取得します。

  1. auth insert-redis-password-here
  2. config get dir

最後のコマンドの出力は、Redisデータディレクトリになります。

出力
1) "dir"
2) "/var/lib/redis"

Redisディレクトリをメモします。 表示されているディレクトリと異なる場合は、チュートリアル全体でこのディレクトリを使用してください。

ここでデータベースコマンドラインインターフェイスを終了できます。

  1. exit

これが正しいディレクトリであることを確認してください。

  1. ls /var/lib/redis

dump.rdbファイルが表示されます。 これがRedisデータです。 appendonlyも有効になっている場合は、appendonly.aofまたは別の.aofファイルも表示されます。このファイルには、サーバーが受信したすべての書き込み操作のログが含まれています。

これら2つのファイルの違いについては、Redisの永続性に関するこの投稿を参照してください。 基本的に、.rdbファイルは現在のスナップショットであり、.aofファイルはRedisの履歴を保持します。 どちらもバックアップする価値があります。

.rdbファイルだけで開始し、両方のファイルの自動バックアップで終了します。

(オプション)ステップ2 —サンプルデータの追加

このセクションでは、Redisデータベースに保存するサンプルデータを作成できます。 サーバーにすでにデータがある場合は、既存のコンテンツをバックアップするだけです。

データベースのコマンドラインインターフェイスにログインします。

  1. redis-cli

認証する:

  1. auth insert-redis-password-here

サンプルデータを追加してみましょう。 各ステップの後にOKの応答が返されるはずです。

  1. SET shapes:triangles "3 sides"
  2. SET shapes:squares "4 sides"

データが追加されたことを確認してください。

  1. GET shapes:triangles
  2. GET shapes:squares

出力は以下に含まれています:

出力
"3 sides"

"4 sides"

これらの変更を/var/lib/redis/dump.rdbファイルにコミットするには、次のように保存します。

  1. save

終了できます:

  1. exit

必要に応じて、ここでダンプファイルの内容を確認できます。 マシンフレンドリーな形式ではありますが、データが含まれている必要があります。

  1. sudo cat /var/lib/redis/dump.rdb
/var/lib/redis/dump.rdb
REDIS0006?shapes:squares4 sidesshapes:triangles3 sides??o????C

ステップ3—Redisデータのバックアップ

Redisデータの場所がわかったので、次にバックアップを作成します。 公式のRedisWebサイトから、次の引用があります。

Redisは、データベースの実行中にRDBファイルをコピーできるため、データのバックアップに非常に適しています。RDBは、作成後に変更されることはなく、作成中は一時的な名前を使用し、rename(2)のみを使用してアトミックに最終的な宛先に名前が変更されます。新しいスナップショットが完了したとき。

そのため、Redisサーバーの実行中にデータベースファイルをバックアップまたはコピーできます。 ホームフォルダの下のディレクトリにバックアップしていると仮定すると、そのバックアップの実行は次のように入力するのと同じくらい簡単です。

  1. sudo cp /var/lib/redis/dump.rdb /home/sammy/redis-backup-001

Redisはここにコンテンツを定期的に保存します。つまり、上記のコマンドを実行するだけでは、最新のバックアップが保証されません。最初にデータを保存する必要があります。

ただし、潜在的に少量のデータ損失が許容できる場合は、この1つのファイルをバックアップするだけで機能します。

データベースの状態を保存する

Redisデータのより新しいコピーを取得するには、Redisコマンドラインであるredis-cliにアクセスすることをお勧めします。

手順1で説明したように認証します。

次に、次のようにsaveコマンドを発行します。

  1. save

出力は次のようになります。

出力
OK
(1.08s)

データベースを終了します。

これで、上記のcpコマンドを実行して、バックアップが完全に最新であることを確認できます。

cpコマンドはデータベースの1回限りのバックアップを提供しますが、最善の解決策は、プロセスを自動化するcronジョブを設定し、増分更新を実行できるツールを使用することです。 、データを復元します。

ステップ4—rdiff-backupとCronを使用した自動更新の構成

このセクションでは、両方のデータファイルを含むRedisデータディレクトリ全体をバックアップする自動バックアップを構成します。

利用可能な自動バックアップツールがいくつかあります。 このチュートリアルでは、rdiff-backupと呼ばれる新しいユーザーフレンドリーなツールを使用します。

rdiff-backupコマンドラインバックアップツール。 rdiff-backupがサーバーにインストールされていない可能性があるため、最初にインストールする必要があります。

  1. sudo apt-get install -y rdiff-backup

インストールされたので、Redisデータをホームディレクトリのフォルダにバックアップしてテストできます。 この例では、ホームディレクトリが/home/sammyであると想定しています。

ターゲットディレクトリが存在しない場合は、スクリプトによって作成されることに注意してください。 つまり、自分で作成する必要はありません。

–preserve-numerical-ids を使用すると、ソースフォルダーと宛先フォルダーの所有権は同じになります。

  1. sudo rdiff-backup --preserve-numerical-ids /var/lib/redis /home/sammy/redis

以前のcpコマンドと同様に、これは1回限りのバックアップです。 変更されたのは、/var/lib/redisディレクトリ全体をバックアップし、rdiff-backupを使用していることです。

次に、cronを使用してバックアップを自動化し、設定された時間にバックアップが実行されるようにします。 これを行うには、システムのcrontabを開きます。

  1. sudo crontab -e

(このサーバーで以前にcrontabを使用したことがない場合は、プロンプトでお気に入りのテキストエディタを選択してください。)

filekの下部に、以下に示すエントリを追加します。

crontab
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がより高速に実行されて使用されます。ディスク容量を少し減らします。

または、このエントリを使用して、毎日のバックアップを作成することもできます。

  1. @daily rdiff-backup --preserve-numerical-ids --no-file-statistics /var/lib/redis /home/sammy/redis

一般的なCronの詳細については、Cronに関するこのの記事をお読みください。

現状では、バックアップは1日1回行われるため、明日戻って最終テストを行うことができます。 または、バックアップの頻度を一時的に増やして、機能していることを確認することもできます。

ファイルはredisシステムユーザーが所有しているため、このコマンドを使用してファイルが配置されていることを確認できます。 (バックアップが実際にトリガーされるまで待つようにしてください):

  1. 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に適したフォーマットを使用していることに注意してください。

  1. sudo cat /home/gilly/redis/dump.rdb

これは小さなデータベース用です。 出力は次のようになります。

出力
REDIS0006?shapes:triangles3 sidesshapes:squares4 sides??!^?\?,?

最新のバックアップにデータがない場合は、復元を続行しないでください。 コンテンツがそこにある場合は、続行します。

オプション:データ損失のシミュレーション

バックアップから復元する理由となるデータ損失をシミュレートしてみましょう。

Redisにログインします。

  1. redis-cli

この一連のコマンドでは、Redisで認証し、shapes:trianglesエントリを削除します。

  1. auth insert-redis-password-here
  2. DEL shapes:triangles

次に、エントリが削除されたことを確認しましょう。

  1. GET shapes:triangles

出力は次のようになります。

出力
(nil)

保存して終了:

  1. save
  2. 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ファイルがある場合は、ファイルの名前を個別に変更し、次のコマンドを実行しないでください。

  1. sudo mv /var/lib/redis/*.aof /var/lib/redis/appendonly.aof.old

Redis構成ファイルを編集して、AOFを一時的にオフにします。

  1. sudo nano /etc/redis/redis.conf

AOFセクションで、appendonlyディレクティブを探し、yesからnoに変更します。 それはそれを無効にします:

/etc/redis/redis.conf
appendonly no

dump.rdbファイルの復元

次に、復元ファイルを使用します。このチュートリアルの前の手順に従った場合は、/home/sammy/redis/dump.rdbに保存する必要があります。

新しいサーバーに復元する場合は、今度はバックアップサーバーから新しいサーバーにファイルをアップロードします。

  1. scp /home/sammy/redis/dump.rdb sammy@your_new_redis_server_ip:/home/sammy/dump.rdb

これで、元のRedisサーバーまたは新しいサーバーである復元サーバーで、cpを使用してファイルを/var/lib/redisフォルダーにコピーできます。

  1. 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では、宛先フォルダー内のファイルの名前を指定する必要があります。

  1. sudo rdiff-backup -r now /home/sammy/redis/dump.rdb /var/lib/redis/dump.rdb

-rオプションの詳細は、この記事の最後にあるプロジェクトのWebサイトで入手できます。

dump.rdbファイルの権限の設定

バックアップを作成したのと同じサーバーに復元する場合は、おそらくすでに正しいアクセス許可を持っています。

バックアップファイルを新しいサーバーにコピーした場合は、ファイルのアクセス許可を更新する必要があります。

/var/lib/redis/ディレクトリにあるdump.rdbファイルの権限を見てみましょう。

  1. 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ユーザーとグループによって所有されるように、アクセス許可を更新する必要があります。

  1. sudo chown redis:redis /var/lib/redis/dump.rdb

グループでも書き込み可能になるようにファイルを更新します。

  1. sudo chmod 660 /var/lib/redis/dump.rdb

次に、/var/lib/redis/ディレクトリの内容を再度リストします。

  1. 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にログインします。

  1. redis-cli

shapes:trianglesエントリを確認してください。

  1. GET shapes:triangles

出力は次のようになります。

出力
"3 sides"

素晴らしい! 私たちの修復はうまくいきました。

出口:

  1. exit

AOFを使用していない場合は、これで完了です。 復元されたRedisインスタンスは通常の状態に戻るはずです。

(オプション)AOFの有効化

データベースへのすべての書き込みを追跡するためにAOFの使用を再開または開始する場合は、次の手順に従ってください。 AOFファイルはRedisコマンドラインから再作成する必要があります。

Redisにログインします。

  1. redis-cli

AOFをオンにします。

  1. BGREWRITEAOF

次の出力が得られるはずです。

出力
Background append only file rewriting started

infoコマンドを実行します。 これにより、かなりの量の出力が生成されます。

  1. info

Persistence セクションまでスクロールし、aofエントリがここに表示されているものと一致することを確認します。 aof_rewrite_in_progress0の場合、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コマンドラインを終了できます。

  1. exit

/var/lib/redisのファイルを再度一覧表示できます。

  1. ls /var/lib/redis

appendonly.aofredis-staging-ao.aofなどのライブ.aofファイルが、dump.rdbファイルやその他のバックアップファイルとともに表示されます。

それが確認されたら、Redisサーバーを停止します。

  1. sudo service redis-server stop

ここで、redis.confファイルでAOFを再度オンにします。

  1. sudo nano /etc/redis/redis.conf

次に、appendonlyの値をyesに変更して、AOFを再度有効にします。

/etc/redis/redis.conf
appendonly yes

Redisを起動します:

  1. sudo service redis-server start

データベースの内容をもう一度確認したい場合は、データベースの内容の確認セクションをもう一度実行してください。

それでおしまい! 復元されたRedisインスタンスは通常の状態に戻るはずです。

結論

この記事に記載されている方法でRedisデータをバックアップすることは、同じサーバー上のディレクトリにデータをバックアップすることを気にしない場合に適しています。

もちろん、最も安全なアプローチは、別のマシンにバックアップすることです。 バックアップに関する次の記事を読むことで、より多くのバックアップオプションを調べることができます。

これらのバックアップ方法の多くは、/var/lib/redisディレクトリ内の同じファイルで使用できます。

Redisの移行と復元に関する今後の記事に注目してください。 rdiff-backupを効果的に使用する方法については、rdiff-backupのドキュメントの例を参照することもできます。