古くなったRedisセッションのクリーンアップ

バージョン6.2以降、GitLabはウェブユーザーのセッションをRedisにkey-valueペアとして保存しています。 GitLab 7.3以前では、ユーザーセッションはRedisから自動的に失効することはありませんでした。 GitLab 7.3以前から大規模なGitLabサーバー(数千ユーザー)を運用している場合は、GitLab 7.3にアップグレードした後、Redisデータベースをコンパクトにするために古いセッションをクリーンアップすることをお勧めします。 GitLab 7.2以前を運用したままクリーンアップを行うこともできますが、その場合はクリーンアップ後に新しい古いセッションが再び蓄積され始めます。

GitLab 7.3.0より前のバージョンでは、Redisのセッションキーは’976aa289e2189b17d7ef525a6702ace9’のような16バイトの16進数値です。 GitLab 7.3.0からは、キーの先頭にsession:gitlab:がつくので、session:gitlab:976aa289e2189b17d7ef525a6702ace9のようになります。以下では、古い形式のキーを削除する方法を説明します。

注意:Configuration Files Documentationで説明されている高度なRedis設定を使用している場合、以下の手順は設定に従って変更する必要があります。

まず、適切なRedis接続の詳細を持つシェル関数を定義します。

rcli() {
  # This example works for Omnibus installations of GitLab 7.3 or newer. For an
  # installation from source you will have to change the socket path and the
  # path to redis-cli.
  sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.shared_state.socket "$@"
}

# test the new shell function; the response should be PONG
rcli ping

ここで、古いフォーマットのセッションキーがあるかどうかを検索し、クリーンアップします。

# returns the number of old-format session keys in Redis
rcli keys '*' | grep '^[a-f0-9]\{32\}$' | wc -l

ゼロより大きい場合は、Redisから鍵を失効させます。 ゼロの場合は、何もすることはありません。

# Tell Redis to expire each matched key after 600 seconds.
rcli keys '*' | grep '^[a-f0-9]\{32\}$' | awk '{ print "expire", $0, 600 }' | rcli
# This will print '(integer) 1' for each key that gets expired.

次の15分間(10分間の有効期限+5分間のRedisバックグラウンド保存間隔)で、Redisデータベースはコンパクト化されます。 GitLab 7.2をまだ使っている場合、10分間の有効期限中にGitLabをクリックしていないユーザーはGitLabからサインアウトされます。