Redisの設定
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
代替ローカルネットワークRedisインスタンスの使用
Linuxパッケージのインストールには、Redisがデフォルトで含まれています。GitLabアプリケーションを独自のローカル実行Redisインスタンスに向けるには、次のようにします:
/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>'変更を有効にするには、GitLabを再設定してください:
sudo gitlab-ctl reconfigure
バンドルされたRedisをTCP経由で到達可能にする
Linuxパッケージで管理されているRedisインスタンスをTCP経由で到達可能にする場合は、次の設定を使用します:
/etc/gitlab/gitlab.rbを編集します:redis['port'] = 6379 redis['bind'] = '127.0.0.1' redis['password'] = 'redis-password-goes-here'ファイルを保存して、変更を有効にするには、GitLabを再設定してください:
sudo gitlab-ctl reconfigure
Linuxパッケージを使用してRedis専用サーバーをセットアップする
GitLabアプリケーションとは別のサーバーにRedisをセットアップする場合は、LinuxパッケージのインストールからバンドルされたRedisを使用できます。
複数のRedisインスタンスでの実行
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'] = 20000Redisの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'] = trueLRUとしてのRedisキャッシュインスタンスの設定
複数のRedisインスタンスを使用すると、Least Recently UsedキャッシュとしてRedisを設定できます。これは、Redisキャッシュ、レート制限、リポジトリキャッシュインスタンスに対してのみ行う必要があります。Redisキュー、共有状態インスタンス、およびtracechunksインスタンスは、永続的であることが予想されるデータ(Sidekiqジョブなど)が含まれているため、LRUとして設定しないでください。
メモリ使用量を32 GBに制限するには、次を使用します:
redis['maxmemory'] = "32gb"
redis['maxmemory_policy'] = "allkeys-lru"
redis['maxmemory_samples'] = 5SSL(Secure Sockets Layer)の使用
SSLの背後で実行するようにRedisを設定できます。
SSLの背後でのRedisサーバーの実行
SSLの背後でRedisサーバーを実行するには、
/etc/gitlab/gitlab.rbで次の設定を使用できます。使用可能な値については、redis.conf.erbのTLS/SSLセクションを参照してください:redis['tls_port'] redis['tls_cert_file'] redis['tls_key_file']必要な値を指定したら、変更を有効にするためにGitLabを再設定します:
sudo gitlab-ctl reconfigure
一部のredis-cliバイナリは、TLS経由でRedisサーバーに直接接続するためのサポートを備えてビルドされていません。redis-cliが--tlsフラグをサポートしていない場合は、stunnelのようなものを使用して、デバッグ目的でredis-cliを使用してRedisサーバーに接続する必要があります。
SSL経由でRedisサーバーに接続するようにGitLabクライアントを作成する
SSLのGitLabクライアントのサポートをアクティブにするには:
次の行を
/etc/gitlab/gitlab.rbに追加します:gitlab_rails['redis_ssl'] = true変更を有効にするには、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は、次のいずれかである必要があります:- 新しいコマンド名。
''。これにより、コマンドが完全に無効になります。
この機能を無効にするには:
/etc/gitlab/gitlab.rbファイルのredis['rename_commands'] = {}で設定します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証明書がサーバーの信頼できる証明書のリストに適切に追加されていないことを示唆しています。これがイシューであるかどうかを確認するには:
/var/log/gitlab/gitlab-workhorse/currentでWorkhorse GitLabログを確認します。次のようなメッセージが表示された場合:
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行目は、このサーバーで証明書が適切に信頼されていないことを示しています。前のセクションを参照してください。これらのトラブルシューティング手順でSSL証明書が機能していることを確認してください。
認証が必要なNOAUTH
Redisサーバーは、コマンドが受け入れられる前に、AUTHメッセージを介して送信されるパスワードを必要とする場合があります。NOAUTH Authentication requiredエラーメッセージは、クライアントがパスワードを送信していないことを示唆しています。GitLabログは、このエラーのトラブルシューティングに役立つ場合があります:
/var/log/gitlab/gitlab-workhorse/currentでWorkhorse GitLabログを確認します。次のようなメッセージが表示された場合:
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."/etc/gitlab/gitlab.rbで指定されたRedisクライアントパスワードが正しいことを確認してください:gitlab_rails['redis_password'] = 'your-password-here'Linuxパッケージが提供するRedisサーバーを使用している場合は、サーバーに同じパスワードがあることを確認してください:
redis['password'] = 'your-password-here'
Redis接続リセット (ECONNRESET)
GitLab Railsログ(/var/log/gitlab-rails/production.log)にRedis::ConnectionError: Connection lost (ECONNRESET)が表示される場合、これは、サーバーがSSLを予期しているが、クライアントがそれを使用するように設定されていないことを示している可能性があります。
サーバーが実際にSSLを介してポートをリッスンしていることを確認してください。例:
/opt/gitlab/embedded/bin/openssl s_client -connect redis-server:6379/var/opt/gitlab/gitlab-rails/etc/resque.ymlを確認してください。次のようなものが表示されるはずです:production: url: rediss://:mypassword@redis-server:6379/redis://がrediss://の代わりに存在する場合、redis_sslパラメータが適切に設定されていないか、再設定手順が実行されていない可能性があります。
CLI経由でRedisに接続する
トラブルシューティングのためにRedisに接続する場合、次を使用できます:
Unixドメインソケット経由のRedis:
sudo /opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socketTCP経由の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>