Redisの設定

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

LinuxパッケージのインストールにはデフォルトでRedisが含まれています。GitLabアプリケーションを自分のローカルで動いているRedisインスタンスに向けるには:

  1. /etc/gitlab/gitlab.rb を編集します:

    # Disable the bundled Redis
    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>'
    
  2. 変更を有効にするために GitLab を再設定します:

    sudo gitlab-ctl reconfigure
    

バンドルされている Redis に TCP 経由でアクセスできるようにします。

Linuxパッケージが管理するRedisインスタンスをTCP経由で到達可能にするには、以下の設定を使用します:

  1. 編集/etc/gitlab/gitlab.rb

    redis['port'] = 6379
    redis['bind'] = '127.0.0.1'
    
  2. ファイルを保存し、変更を有効にするために GitLab を再設定します:

    sudo gitlab-ctl reconfigure
    

Linux パッケージを使った Redis 専用サーバーの設定

RedisをGitLabアプリケーションとは別のサーバーにセットアップしたい場合は、LinuxパッケージのインストールからバンドルされているRedisを使うことができます。

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

https://docs.gitlab.com/ee/administration/redis/replication_and_failover.html#running-multiple-redis-clusters を参照してください。

Redis センチネル

https://docs.gitlab.com/ee/administration/redis/replication_and_failover.html を参照してください。

フェイルオーバーセットアップでの Redis の使用

https://docs.gitlab.com/ee/administration/redis/replication_and_failover.html を参照してください。

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 は、アイドル状態のTCP接続を終了する前にRedisサーバーが待機する秒数で設定した値です。tcp_keepalive は、通信がない場合にクライアントへのTCP ACKを秒単位でチューニング可能な設定です。

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

ホスト名からipをアナウンス

現在のところ、Redisでホスト名を有効にする唯一の方法はredis['announce_ip'] を設定することです。しかし、これはRedisインスタンスごとに一意に設定する必要があります。announce_ip_from_hostname はブール値で、これをオンまたはオフにすることができます。これはホスト名を動的に取得し、hostname -f コマンドからホスト名を推測します。

redis['announce_ip_from_hostname'] = true

RedisキャッシュインスタンスをLRUとして設定します。

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

メモリ使用量を32GBに制限するには、以下を使用します:

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

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

RedisをSSLで実行するように設定できます。

RedisサーバーのSSLビハインドでの実行

  1. SSLビハインドでRedisサーバーを実行するには、/etc/gitlab/gitlab.rb 。設定可能な値については、redis.conf.erb の TLS/SSL セクションを参照してください:

    redis['tls_port']
    redis['tls_cert_file']
    redis['tls_key_file']
    
  2. 必要な値を指定したら、GitLabを再設定して変更を有効にします:

    sudo gitlab-ctl reconfigure
    
note
redis-cli バイナリによっては、TLS経由でRedisサーバーに直接接続することをサポートしてビルドされていない redis-cliものがあります。--tls フラグがサポートされていないredis-cli 場合は redis-cli、次のようなものを使う必要があります。 stunnelredis-cli を使って Redis サーバーに接続しなければなりません。

GitLabクライアントがSSL経由でRedisサーバーに接続するようにします。

GitLabクライアントのSSLサポートを有効にします:

  1. /etc/gitlab/gitlab.rb に以下の行を追加してください:

    gitlab_rails['redis_ssl'] = true
    
  2. 変更を有効にするために GitLab を再設定します:

    sudo gitlab-ctl reconfigure
    

SSL証明書

Redisにカスタム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

怠惰な解放

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

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

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

スレッドI/O

Redis 6ではスレッドI/Oが導入されました。これにより、複数のコアにまたがって書き込みをスケールできるようになりました。

この設定はデフォルトでは無効になっています。有効にするには

redis['io_threads'] = 4
redis['io_threads_do_reads'] = 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. Linux パッケージが提供する 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:

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

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

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