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

に書いてあります。

簡単にまとめると、

  1. 0.1秒間に一回、expireがセットされているキーをランダムに20個取得する。
  2. その中で期限が切れているキーを削除する
  3. step2で削除したキーが25%以上(つまり20個の25%なので5個以上)だった場合、step1を再度実行する

といったアルゴリズムで削除しています。 また、もちろん、値が取得された時にキーの期限が切れていた場合も削除します。

強制的に期限切れキーを削除する方法

とは言っても、masterとslaveでキーの数が大きく違うのは気持ち悪いし不安だという場合は、 https://ivan-site.com/2014/06/force-evict-expired-keys-from-redis/ に書いてあるように、SCAN commandを実行すると期限切れキーは削除されます。

なので上記のブログのあるように全キーをscanするプログラムをかけば、その時点で期限が切れているキーを削除することができます。