RedisClusterにslaveを追加したとき、masterとslaveでキーの数が違う
以前、Redis Clusterにslaveを追加したときmasterとslaveでキーの数が違う現象に合いました。
masterの方がキーが多くslaveの方がキーが少ない。 その時はどうしてそんなことになるのか分からなかったのですが、調査して分かりました。
結論は、
slaveを追加するとき、全てのキーのexpireチェックをかけて期限が切れているキーは除かれた状態でslaveとして追加される。 しかしmasterは期限が切れたキーも保持している(可能性がある)。
なのでmasterとslaveでキー数が異なることがある。
期限切れキーの削除のされ方
さて、そもそもRedisはキーの期限が切れた瞬間にキーを削除しているわけではありません。
またdbsizeコマンドをうった結果も期限が切れたキーも含まれた結果が返って来ます。
Redisの期限切れキー削除の仕方の仕様は
http://redis.io/commands/expire#how-redis-expires-keys
に書いてあります。
簡単にまとめると、
- 0.1秒間に一回、expireがセットされているキーをランダムに20個取得する。
- その中で期限が切れているキーを削除する
- step2で削除したキーが25%以上(つまり20個の25%なので5個以上)だった場合、step1を再度実行する
といったアルゴリズムで削除しています。 また、もちろん、値が取得された時にキーの期限が切れていた場合も削除します。
強制的に期限切れキーを削除する方法
とは言っても、masterとslaveでキーの数が大きく違うのは気持ち悪いし不安だという場合は、 https://ivan-site.com/2014/06/force-evict-expired-keys-from-redis/ に書いてあるように、SCAN commandを実行すると期限切れキーは削除されます。
なので上記のブログのあるように全キーをscanするプログラムをかけば、その時点で期限が切れているキーを削除することができます。