redisでaof,saveを有効化している場合にdiskを使い切るとどうなるか
redisはオンメモリで動くがファイルに書き込む設定をいれることで永続性を保つことができる。
そのファイルが書き込めなくなるとどうなるか調べてみた。
redisサーバ情報
amazon linux 3.4.37-40.44.amzn1.x86_64
redis 2.6.10
master slaveの2台構成
以下の設定でそれぞれ調査
#定期dump有効化 save 300 1
#aof出力有効化 appendonly yes appendfsync everysec
適当にddでtestファイルを使ってdisk容量を増やしておく
$ df -h Filesystem Size Used Avail Use% マウント位置 /dev/xvda1 7.9G 7.8G 5.2M 100% / tmpfs 298M 0 298M 0% /dev/shm
そしてredisにひたすらセットするだけのスクリプトを叩く
$ ./set.py
でdiskがいっぱいになるとどうなるか見てみる
dump 有効化の場合
自動でbgsaveが走った際にdiskスペースが足りないと次のメッセージがlogに出力され続けた。
手動でbgsaveの場合は1セットのみの出力だった。
[10124] 16 Aug 13:00:07.597 # Write error saving DB on disk: No space left on device [9532] 16 Aug 13:00:07.606 # Background saving error [9532] 16 Aug 13:00:07.616 * 1 changes in 30 seconds. Saving... [9532] 16 Aug 13:00:07.642 * Background saving started by pid 10125
redis-cliからinfoで見ると以下の出力
replicationも止まるようだ。
rdb_last_bgsave_status:err 中略 # Replication role:master connected_slaves:1 slave0:10.0.31.222,6379,wait_bgsave
※何度かinfoを打つとたまにconnected_slaveが0になっていた。
slave側ではmaster_link_status:downが確認できた。
この状態になった段階でset.pyで以下のメッセージが返ってきた
redis.exceptions.ResponseError: MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
redis-cliからも同じ。
redis 127.0.0.1:6379> set 1 a (error) MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.
getは問題なくできた。
redis 127.0.0.1:6379> get 1 "10000000"
どうやら更新を受け付けないらしい。
ソースコードを見るにsave処理が正常に終了するまでは更新させないようにしているようだ。
- redis.c
1046 shared.bgsaveerr = createObject(REDIS_STRING,sdsnew( 1047 "-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error. \r\n")); 1607 /* Don't accept write commands if there are problems persisting on disk. */ 1608 if (server.stop_writes_on_bgsave_err && 1609 server.saveparamslen > 0 1610 && server.lastbgsave_status == REDIS_ERR && 1611 c->cmd->flags & REDIS_CMD_WRITE) 1612 { 1613 flagTransaction(c); 1614 addReply(c, shared.bgsaveerr); 1615 return REDIS_OK; 1616 }
aof出力有効化の場合
set.pyの出力
redis.exceptions.ConnectionError: Error 111 connecting 127.0.0.1:6379. Connection refused.
redis-cliの場合
not connected>
つなげない。。。
ps -ef |grep [r]edis
いない。。。
どうやらredisのプロセスが落ちた模様
ログを見ると
Aug 15:08:49.067 # Exiting on short write while writing to the append-only file: Success
の出力が最後にがされていた。
まとめ
bgsaveが正常終了しないと更新不能になりレプリケーションが停止する。
※起動時にもbgsaveが走るので失敗するので同じ状態になる
aofファイルにdisk容量の影響で追記できなくなくなるとredisのプロセスが落ちる。
※aofファイルへの追記はハードリンクをしているようで起動中にリネームしても追記はしてくれた。
削除してもredisプロセスに影響はなかった。
redis専用サーバの場合はそうそうDISKがいっぱいになることはないだろうけど
loglevelをdebugのままにしてローテートしてないとかあると容量食ってしまうのでそのあたりも注意しないといけない。
あと監視も。