Redisの設定

アプリケーション・サーバー上でのRedisの実行

別のローカル Redis インスタンスの使用

Omnibus GitLabはデフォルトでRedisのインスタンスを提供します。 GitLabアプリケーションを自分の ローカルでRedisインスタンスに向けたい管理者は、gitlab.rbを変更してください。 変更を有効にするにはgitlab-ctl reconfigure を実行してください。

redis['enable'] = false

# Redis via TCP
gitlab_rails['redis_host'] = '127.0.0.1'
gitlab_rails['redis_port'] = 6379

# OR Redis via Unix domain sockets
gitlab_rails['redis_socket'] = '/tmp/redis.sock' # defaults to /var/opt/gitlab/redis/redis.socket

# Password to Authenticate to alternate local Redis if required
gitlab_rails['redis_password'] = 'Redis Password'

バンドルされたRedisインスタンスにTCP経由で到達可能にする方法

Omnibus GitLabが管理するRedisインスタンスのいずれかをTCP経由で到達可能にする場合は、次の設定を使用します。

redis['port'] = 6379
redis['bind'] = '127.0.0.1'

Redis専用サーバーの設定

GitLabで使用するために別のRedisサーバーをセットアップしたい場合(スケーリングの問題の場合など)、Omnibus GitLabを使ってセットアップすることができます。

Redisノードのセットアップ

注:Redisはデフォルトでは認証を必要としません。 詳細はRedisセキュリティのドキュメントを参照してください。 Redisサービスのセキュリティを確保するには、Redisパスワードと厳格なファイアウォールルールの組み合わせを使用することをお勧めします。

  1. GitLabのダウンロードページのステップ1と2を使用して、Omnibus GitLabをダウンロード/インストールします。 ダウンロードページの他のステップは完了しないでください。
  2. /etc/gitlab/gitlab.rb を作成/編集し、以下の設定を使用します。

    # Disable all services except Redis
    redis_master_role['enable'] = true
    
    # Redis configuration
    redis['port'] = 6379
    redis['bind'] = '0.0.0.0'
    
    # If you wish to use Redis authentication (recommended)
    redis['password'] = 'Redis Password'
    
    # Disable automatic database migrations
    #   Only the primary GitLab application server should handle migrations
    gitlab_rails['auto_migrate'] = false
    

    注: redis_master_role['enable'] オプションは GitLab 8.14 以降でのみ利用可能です。このオプションによってどのサービスが自動的に無効になるかはgitlab_rails.rbを参照してください。

  3. sudo gitlab-ctl reconfigure を実行して Redis をインストールし、設定します。

GitLab アプリケーションノードの設定

  1. 以下の設定はGitLabアプリケーションを外部のRedisサービスに向けるものです:

    redis['enable'] = false
    
    gitlab_rails['redis_host'] = 'redis.example.com'
    gitlab_rails['redis_port'] = 6379
    
    # Required if Redis authentication is configured on the Redis node
    gitlab_rails['redis_password'] = 'Redis Password'
    
  2. sudo gitlab-ctl reconfigure を実行して、外部 Redis ノードを使用するようにアプリケーションを設定します。

Google Cloud Memorystoreの使用

Google Cloud MemorystoreはRedisCLIENTコマンドをサポートしていません。 デフォルトでは、Sidekiqはデバッグ目的でCLIENT を設定しようとします。 これは、このコンフィギュレーション設定で無効にすることができます:

gitlab_rails['redis_enable_client'] = false

Redisの接続数をデフォルトより増やす

デフォルトでは、Redisは10,000のクライアント接続しか受け付けません。 10,000を超える接続が必要な場合は、maxclients ニーズに合わせて属性を maxclients設定してください。 属性をmaxclients 調整 maxclientsするということは、fs.file-max (例:sysctl -w fs.file-max=20000) のシステム設定も考慮に入れる必要があることをご承知おきください。

redis['maxclients'] = 20000

Redis用TCPスタックのチューニング

以下の設定は、よりパフォーマンスの高いRedisサーバ・インスタンスを有効にするためのものです。tcp_timeout は、Redisサーバがアイドル状態のTCP接続を終了するまでの待機時間を秒単位で設定した値です。tcp_keepalive は、通信がない場合にクライアントへのTCP ACKを秒単位で調整可能な設定です。

redis['tcp_timeout'] = "60"
redis['tcp_keepalive'] = "300"

複数のRedisインスタンスでの実行

GitLabには、異なる永続化クラス用の別々のRedisインスタンスで実行するためのサポートが含まれています。現在のところ、cachequeuesshared_stateactioncable

インスタンス 目的
cache キャッシュデータの保存
queues ストア Sidekiq バックグラウンド ジョブ
shared_state セッション関連データおよびその他の永続データの保存
actioncable ActionCable 用 Pub/Sub キューバックエンド
  1. Redis専用サーバのセットアップ」の説明に従って、各固有クラス専用のインスタンスを作成します。
  2. /etc/gitlab/gitlab.rb 、使用するインスタンスごとに適切な変数を設定してください:

    gitlab_rails['redis_cache_instance'] = REDIS_CACHE_URL
    gitlab_rails['redis_queues_instance'] = REDIS_QUEUES_URL
    gitlab_rails['redis_shared_state_instance'] = REDIS_SHARED_STATE_URL
    gitlab_rails['redis_actioncable_instance'] = REDIS_ACTIONCABLE_URL
    

    注意:RedisのURLは以下の形式でなければなりません:redis://PASSWORD@REDIS_HOST:PORT/2

    どこで

    • PASSWORD は Redis インスタンスの平文のパスワードです。
    • REDIS_HOST はホストのホスト名または IP アドレス。
    • REDIS_PORTはRedisがリッスンしているポートで、デフォルトは6379です。
  3. 走るgitlab-ctl reconfigure

Redisセンチネル

Redis Sentinelの設定の詳細については、https://docs.gitlab.com/ee/administration/high_availability/redis.htmlを参照してください。

RedisキャッシュインスタンスをLRUに設定

複数のRedisインスタンスを使用することで、RedisをLeast Recently Usedキャッシュとして設定することができます。 これはRedisキャッシュインスタンスに対してのみ行う必要があることに注意してください。Redisキューおよび共有ステートインスタンスは、永続的であることが期待されるデータ(Sidekiqジョブなど)を含むため、決してLRUとして設定すべきではありません。

メモリ使用量の上限を32GBにするには、次のようにします:

redis['maxmemory'] = "32gb"
redis['maxmemory_policy'] = "allkeys-lru"
redis['maxmemory_samples'] = 5

Redis HAセットアップの使用

https://docs.gitlab.com/ee/administration/high_availability/redis.htmlを参照。

セキュア・ソケット・レイヤーの使用(SSL)

Redis v3.2.xはSSLをサポートしていませんが、stunnelを使用してRedis接続を暗号化することができます。 AWS ElasticCacheもRedis over SSLをサポートしています。

コマンド名の変更

デフォルトでは、セキュリティ対策としてKEYS コマンドは無効になっています。

このコマンドや他のコマンドを難読化または無効化したい場合は、/etc/gitlab/gitlab.rbredis['rename_commands'] 設定を以下のように編集してください:

redis['rename_commands'] = {
  'KEYS': '',
  'OTHER_COMMAND': 'VALUE'
}
  • OTHER_COMMAND は修正したいコマンドです。
  • VALUE のいずれかでなければなりません:
    1. 新しいコマンド名。
    2. コマンドを完全に無効にします。

この機能を無効にするには

  1. /etc/gitlab/gitlab.rb ファイルにredis['rename_commands'] = {} を設定します。
  2. 走るsudo gitlab-ctl reconfigure

制限事項

  • GitLabはRedisサーバーを暗号化するためのstunnelやその他のツールは同梱していません。 しかし、GitLabはrediss://redis://とは対照的)URLスキームによるクライアントサポートを提供しています。

  • Redis SentinelはまだSSLをサポートしていません。 Redis Sentinelを使用する場合は、SSLのクライアントサポートを有効にしないでください。このプルリクエストにより、Redis 6.0にネイティブサポートがもたらされる可能性があります。

SSLの有効化(クライアント設定)

GitLabクライアントのSSLサポートを有効にするには、以下のようにします:

  1. /etc/gitlab/gitlab.rbに以下の行を追加:

    gitlab_rails['redis_ssl'] = true
    
  2. sudo gitlab-ctl reconfigure を実行して変更を有効にします。

SSL証明書

RedisにカスタムSSL証明書を使用している場合は、信頼できる証明書に追加してください。

怠惰な解放

Redis 4 では遅延解放が導入され、大きな値を解放する際のパフォーマンスが向上しました。

この設定のデフォルトはfalse。有効にするには

redis['lazyfree_lazy_eviction'] = true
redis['lazyfree_lazy_expire'] = true
redis['lazyfree_lazy_server_del'] = true
redis['replica_lazy_flush'] = true

一般的なトラブルシューティング

x509: certificate signed by unknown authority

このエラーメッセージは、SSL証明書がサーバーの信頼できる証明書のリストに正しく追加されていないことを示唆しています。 これがイシューかどうかを確認するには、以下の手順に従います:

  1. /var/log/gitlab/gitlab-workhorse/currentで Workhorse のログを確認してください。

  2. のようなメッセージが表示されたら

    2018-11-14_05:52:16.71123 time="2018-11-14T05:52:16Z" level=info msg="redis: dialing" address="redis-server:6379" scheme=rediss
    2018-11-14_05:52:16.74397 time="2018-11-14T05:52:16Z" level=error msg="unknown error" error="keywatcher: x509: certificate signed by unknown authority"
    

    最初の行には、Redisサーバーのアドレスとスキームとしてrediss 。 2行目は、証明書がこのサーバーで適切に信頼されていないことを示しています。前のセクションを参照してください。

  3. 以下のトラブルシューティング手順でSSL証明書が機能していることを確認してください。

NOAUTH 認証が必要

Redisサーバーでは、コマンドを受け付ける前にAUTH メッセージでパスワードを送信する必要がある場合があります。NOAUTH Authentication required エラーメッセージは、クライアントがパスワードを送信していないことを示唆しています。 GitLab ログがこのエラーのトラブルシューティングに役立つ場合があります:

  1. /var/log/gitlab/gitlab-workhorse/currentで Workhorse のログを確認してください。

  2. のようなメッセージが表示されたら

    2018-11-14_06:18:43.81636 time="2018-11-14T06:18:43Z" level=info msg="redis: dialing" address="redis-server:6379" scheme=rediss
    2018-11-14_06:18:43.86929 time="2018-11-14T06:18:43Z" level=error msg="unknown error" error="keywatcher: pubsub receive: NOAUTH Authentication required."
    
  3. /etc/gitlab/gitlab.rb で指定した Redis クライアントのパスワードが正しいことを確認します:

    gitlab_rails['redis_password'] = 'your-password-here'
    
  4. Omnibus が提供する Redis サーバを使用している場合は、サーバに同じパスワードが設定されていることを確認します:

    redis['password'] = 'your-password-here'
    

Redis接続のリセット(ECONNRESET)

GitLab Railsのログ(/var/log/gitlab-rails/production.log)にRedis::ConnectionError: Connection lost (ECONNRESET) が表示される場合は、サーバーがSSLを期待しているのにクライアントがSSLを使うように設定されていない可能性があります。

  1. サーバーが実際にSSL経由でポートをリッスンしていることを確認してください:

    /opt/gitlab/embedded/bin/openssl s_client -connect redis-server:6379
    
  2. /var/opt/gitlab/gitlab-rails/etc/resque.ymlを確認してください:

    production:
      url: rediss://:mypassword@redis-server:6379/
    
  3. rediss://の代わりにredis:// が存在する場合、redis_sslパラメータが適切に構成されていないか、reconfigure ステップが実行されていない可能性があります。

CLIによるRedisへの接続

トラブルシューティングのためにRedisに接続するときに使用できます:

  • Unixドメインソケット経由のRedis:

     /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
    
  • TCP経由のRedis:

     /opt/gitlab/embedded/bin/redis-cli -h 127.0.0.1 -p 6379
    
  • 必要に応じてRedisを認証するためのパスワード:

     /opt/gitlab/embedded/bin/redis-cli -h 127.0.0.1 -p 6379 -a <password>