Redis ( 4 ) ~ バックアップ ~

October 01, 2017

Redis の永続化オプション

Redis のデータ永続化オプションには以下の二つが存在する。

  • スナップショット: ある瞬間のデータを取り出してディスクに書き出す
  • AOF (Append Only File): コマンドを受け取った際にそれをディスクにコピーする

状況次第で上記を併用することも、片方のみ使う、もしくは全く使わないこともできる。

スナップショットによる永続化

BGSAVE コマンドによりスナップショットを開始できる。また、設定ファイルに定期的にスナップショットを取得するように書き込むこともできる。

以下の簡単なスクリプトでとりあえずデータを書き込む。

<?php
$redis = new Redis();
$redis->connect("127.0.0.1",6379);

for( $i=0; $i < 10000000; $i++ ) {
  $redis->set('key'."$i", 'value'."$i");
}
?>

Redis クライアントから以下のコマンドにより、スナップショットを作成できる。
できたスナップショットは適当に Rename する。(もしくは設定ファイルの dbfilename フィールドで設定可能)

$ redis-cli
127.0.0.1:6379> BGSAVE
Background saving started

$ mv dump.rdb snapshot.rdb

ちなみに Redis-Server 側では以下のようにログが出力される。

1645:M 01 Oct 09:03:17.658 * Background saving started by pid 1649
1649:C 01 Oct 09:03:17.661 * DB saved on disk
1649:C 01 Oct 09:03:17.661 * RDB: 6 MB of memory used by copy-on-write
1645:M 01 Oct 09:03:17.760 * Background saving terminated with success

なお、定期的なスナップショットの取得の設定は、設定ファイル内に以下のように記述することで行える。

# ./redis.conf
################################ SNAPSHOTTING  ################################                                                                                                                                     
#                                                                                                                                                                                                                   
# Save the DB on disk:                                                                                                                                                                                              
#                                                                                                                                                                                                                   
#   save <seconds> <changes>                                                                                                                                                                                        
#                                                                                                                                                                                                                   
#   Will save the DB if both the given number of seconds and the given                                                                                                                                              
#   number of write operations against the DB occurred.                                                                                                                                                             
#                                                                                                                                                                                                                   
#   In the example below the behaviour will be to save:                                                                                                                                                             
#   after 900 sec (15 min) if at least 1 key changed                                                                                                                                                                
#   after 300 sec (5 min) if at least 10 keys changed                                                                                                                                                               
#   after 60 sec if at least 10000 keys changed                                                                                                                                                                     
#                                                                                                                                                                                                                   
#   Note: you can disable saving completely by commenting out all "save" lines.                                                                                                                                     
#                                                                                                                                                                                                                   
#   It is also possible to remove all the previously configured save                                                                                                                                                
#   points by adding a save directive with a single empty string argument                                                                                                                                           
#   like in the following example:                                                                                                                                                                                  
#                                                                                                                                                                                                                   
#   save ""
save 900 1
save 300 10
save 60 10000

-> キーの更新回数によって、使い分けられる。

作成したスナップショットファイルを別の Redis サーバーにコピーし、設定ファイルの dbfilename でそのファイルを指定し、起動すると、スナップショットからの起動が実施される。
実際に、key200 や key7777 が存在することを以下のコマンドで確認。

$ redis-cli 
127.0.0.1:6379> GET key200
"value200"
127.0.0.1:6379> GET key7777
"value7777"

スナップショット取得時、実ハードウェア、VMWare、KVM などの場合は 1 GB あたり 10 ~ 20 ms ほどで、fork によるスナップショット用プロセスを作成できるが、Xen の場合は 1 GB あたり 200 ~ 300 ms ほどになる。そのため、Xen 仮想化を用いる場合は Redis が 4 ~ 6 秒ほど停止する場合もある。

AOF

Redis Server にて AOF を有効化するには、設定ファイル内で appendonly を yes にする必要がある。

(設定ファイルの例)

appendonly yes
appendfilename "appendlonly.aof"
appendfsync exerysec # always は write コマンド毎にディスクに書き込むことになる。os はディスクの同期管理を os に任せる。

AOF があればスナップショットはいらないのでは、という疑問もあるかもしれないが、Redis はリスタート時に AOF に記録されるコマンドを全て実行するため、起動に時間がかかる場合がある。
先ほど使用した php スクリプトを用いて、連続的に書き込みをしている際に、appendonly.aof ファイルサイズが徐々に大きくなってることが下記からわかる。

$ ls -l appendonly.aof 
-rw-rw-r-- 1 ubuntu ubuntu 74394004 Oct  1 10:27 appendonly.aof
$ ls -l appendonly.aof 
-rw-rw-r-- 1 ubuntu ubuntu 74418194 Oct  1 10:27 appendonly.aof
$ ls -l appendonly.aof 
-rw-rw-r-- 1 ubuntu ubuntu 74435947 Oct  1 10:27 appendonly.aof
$ ls -l appendonly.aof 
-rw-rw-r-- 1 ubuntu ubuntu 74456160 Oct  1 10:27 appendonly.aof

 © 2023, Dealing with Ambiguity