teketeke_55の日記

技術メモとか

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のままにしてローテートしてないとかあると容量食ってしまうのでそのあたりも注意しないといけない。
あと監視も。