Redisサーバーでやらかした&容量削減に挑んでみた


はじめに

大学を卒業し、エンジニアになってから二年半ほどが経ちました。
サーバーエンジニアとして仕事をしてきて、
まぁまぁやらかして
まぁまぁ大変だったRedisの話をしようと思います。

やらかし

スレーブ遅延をおこしました
アクセス障害:(´◦_◦`):

はい。

redis-cli keys "*"

なにをしたか

本番のスレーブサーバで、keysをたたきました。
keysは登録されているキーの一覧を取得するコマンドです。
本番のサービスを運用中にこれをやると、キーの数が多すぎて遅延を起こしてしまいます。

きっとその時はこんな軽い気持ちで叩いたに違いない

  1. お問合せの調査で、とあるランキングをみたいなぁ
  2. ランキングはRedisか、キーがわからん
  3. 開発サーバーだとキー名ちょっと違うしどうしよう
  4. スレーブならKeys叩いても大丈夫か

そう、こんな感じです。

ダメです。ちなみに二回くらいやりました。すみませんでした。

どうしたの?

それからは、キーの調査はこのようにやってます

  • 開発サーバーで似たキーを探す
redis-cli keys "*SeasonEvent*"
  • 本番サーバー固有の文字列があれば、それを確認する
redis-cli scan 0

とか

redis-cli monitor
  • こうすればkeysをたたかなくてもキーを特定できる!!

  • あとは特定したキーでランキングの中身をみるだけ!

容量削減

発生した問題

Redisサーバー仕様メモリ容量がいっぱいになってきた

なにをしたか

不要なキーを洗い出して、削除した
一定期間が過ぎると不要になるデータを消込するBatchを作成した
ソース内で、TTLの効果時間を設定してるとこを短くした

  • 不要なキーとは?

過去のランキングイベントのデータ
一時的なランキングのデータ
一時的なキャッシュデータ
など...

調査方法

モニターで確認してみる

redis-cli monitor

スキャンで見てみる

redis-cli scan 0

TTLが効いてるか見てみる

redis-cli ttl key名

最終的には、メンテナンス中に全部のキーリストをTextファイルに書き出しました。
個人的には、書き出したあとSCPコマンドで開発サーバーや自分のローカルに落としてきて、サーバーには残さないのが良いと思います。

結論

不要なデータが残ってないか、どう減らすか、残さないか、につきると思います。
開発したときに、将来ごみになりそうだから消込用のBatchを作っておこう。
といった気づかいができると、僕のような新人や後輩が悩むことがなくなると思います。

おまけ

redis-cli keys "*" > /tmp/redisKeys.txt
scp [オプション] コピー元 コピー先

結局これでローカルで見るのが一番楽でした。(すべて確認できるので)