正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

Redisの設定

  • プラン: Free、Premium、Ultimate
  • 提供形態: GitLab Self-Managed

代替ローカルネットワーク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'
    redis['password'] = 'redis-password-goes-here'
  2. ファイルを保存して、変更を有効にするには、GitLabを再設定してください:

    sudo gitlab-ctl reconfigure

Linuxパッケージを使用してRedis専用サーバーをセットアップする

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

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

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

Redis Sentinel

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

フェイルオーバー設定でのRedisの使用

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

Google Cloud Memorystoreの使用

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

gitlab_rails['redis_enable_client'] = false

デフォルトを超えるRedis接続数の増加

デフォルトでは、Redisは10,000クライアント接続のみを受け入れます。10,000を超える接続が必要な場合は、ニーズに合わせて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

LRUとしてのRedisキャッシュインスタンスの設定

複数のRedisインスタンスを使用すると、Least Recently UsedキャッシュとしてRedisを設定できます。これは、Redisキャッシュ、レート制限、リポジトリキャッシュインスタンスに対してのみ行う必要があります。Redisキュー、共有状態インスタンス、およびtracechunksインスタンスは、永続的であることが予想されるデータ(Sidekiqジョブなど)が含まれているため、LRUとして設定しないでください。

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

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

SSL(Secure Sockets Layer)の使用

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

SSLの背後でのRedisサーバーの実行

  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

一部のredis-cliバイナリは、TLS経由でRedisサーバーに直接接続するためのサポートを備えてビルドされていません。redis-cli--tlsフラグをサポートしていない場合は、stunnelのようなものを使用して、デバッグ目的でredis-cliを使用してRedisサーバーに接続する必要があります。

SSL経由でRedisサーバーに接続するようにGitLabクライアントを作成する

SSLのGitLabクライアントのサポートをアクティブにするには:

  1. 次の行を/etc/gitlab/gitlab.rbに追加します:

    gitlab_rails['redis_ssl'] = true
  2. 変更を有効にするには、GitLabを再設定してください:

    sudo gitlab-ctl reconfigure

SSL証明書

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

名前が変更されたコマンド

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

このコマンドまたはその他のコマンドを難読化または無効にする場合は、redis['rename_commands']設定を編集して、/etc/gitlab/gitlab.rbで次のようにします:

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

クライアントタイムアウト

デフォルトでは、Ruby用のRubyクライアントは、接続、読み取り、および書き込みタイムアウトに1秒のデフォルトを使用します。これらの値を調整して、ローカルネットワークのレイテンシーを考慮する必要がある場合があります。たとえば、Connection timed out - user specified timeoutエラーが表示される場合は、connect_timeoutを上げる必要がある場合があります:

gitlab_rails['redis_connect_timeout'] = 3
gitlab_rails['redis_read_timeout'] = 1
gitlab_rails['redis_write_timeout'] = 1

プレーンテキストストレージなしで機密性の高い設定をRedisクライアントに提供する

詳細については、設定ドキュメントの例を参照してください。

トラブルシューティング

x509: certificate signed by unknown authority

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

  1. /var/log/gitlab/gitlab-workhorse/currentでWorkhorse GitLabログを確認します。

  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 GitLabログを確認します。

  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を予期しているが、クライアントがそれを使用するように設定されていないことを示している可能性があります。

  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. redis://rediss://の代わりに存在する場合、redis_sslパラメータが適切に設定されていないか、再設定手順が実行されていない可能性があります。

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>