ボクココ

個人開発に関するテックブログ

Heroku Redis は初期設定で利用してはならない

無料でそれなりなメモリとコネクション数を確保できる Heroku Redis。最近できたばかりのアドオンで情報がなかなか出回ってないが、ここに落とし穴があるので利用する場合は注意。

https://s3.amazonaws.com/assets.heroku.com/addons.heroku.com/icons/1503/original.png?1435249054

注意点は以下の2点だ。

アイドル状態のコネクションをデフォルトではKillしない

Heroku Redis は アイドル状態のコネクションをデフォルトではKillしない。これはどういうことかというと、つなぎっぱなしになって、最終的に限界である20コネクションに達し、アプリケーション全体が落ちる、ということが起きる。 しかもこの復旧はなかなか大変で、コマンド経由でRedisを再起動ということができないのでびっくりすることになる。対応するなら、一度Redisアドオンを削除し、再度追加する、といったところか。もちろん Redisに保存していたデータは全て消える。

そんなことにならないようにHeroku Redisを入れたら、まずタイムアウトを設定しよう。

heroku plugins:install heroku-redis
heroku redis:timeout {redis_name} --seconds 60 --app {app_name}

メモリ容量がMAXになった時にデフォルトではエラーを投げる

二つ目。Heroku Redisはデフォルトでメモリ容量がMAXになった時にデフォルトではエラーを投げる。これまた急にシステム全体が止まるということになりかねないので、注意しておきたいところ。これはまだ経験したことないけど、それなりにRedisを使うと起こりうる問題だ。

メモリをどうやって管理するかは以下のタイプにわかれる模様。

  • noeviction will return errors when the memory limit is reached. (リミットに達したらエラー)
  • allkeys-lru will remove less recently used keys first.(使用済みキーで最も古い物を削除)
  • volatile-lru will remove less recently used keys first that have an expiry set.(期限切れセットを持つ最初のキーから削除)
  • allkeys-random will evict random keys.(ランダムで削除)
  • volatile-random will evict random keys but only those that have an expiry set.(ランダムだが、期限切れの物だけを削除)
  • volatile-ttl will only evict keys with an expiry set and a short TTL.(期限切れで短いTTLのものだけを削除)

んで、例えばこんな感じでセットする。

heroku redis:maxmemory {redis_name} --policy volatile-lru --app {app_name}

詳細は、英語のドキュメントに書いてあるが、デフォルト設定で痛い目を見てしまった。ちゃんと使うアドオンは一通りドキュメントに目を通しておくようにしよう。

またこれらの初期設定もそのうち変わる可能性が高いので、そういう意味でもドキュメントは大事。英語必須だ。