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を設定したい場合は、バンドルされたRedisをLinuxパッケージインストールから使用できます。
複数の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'] = falseRedis接続数をデフォルトより増やす
デフォルトでは、Redisは10,000のクライアント接続のみを受け入れます。10,000を超える接続が必要な場合は、maxclients属性をニーズに合わせて設定してください。maxclients属性を調整すると、fs.file-max (sysctl -w fs.file-max=20000など) のシステム設定も考慮する必要があることに注意してください。
redis['maxclients'] = 20000RedisのTCPスタックをチューニングする
次の設定は、より高性能なRedisサーバーインスタンスを有効にするためのものです。tcp_timeoutは、Redisサーバーがアイドル状態のTCP接続を終了するまでに待機する秒単位の値です。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'] = trueRedisキャッシュインスタンスをLRUとして設定する
複数のRedisインスタンスを使用すると、RedisをLeast Recently Usedキャッシュとして設定できます。これはRedisキャッシュ、レート制限、およびリポジトリキャッシュインスタンスにのみ行うべきです。Redisキュー、共有状態インスタンス、およびtracechunksインスタンスは、永続的であると予想されるデータ(Sidekiqジョブなど)を含むため、LRUとして設定すべきではありません。
メモリ使用量を32 GBに制限するには、次を使用できます:
redis['maxmemory'] = "32gb"
redis['maxmemory_policy'] = "allkeys-lru"
redis['maxmemory_samples'] = 5Secure Sockets Layer (SSL) を使用する
RedisをSSLの背後で実行するように設定できます。
RedisサーバーをSSLの背後で実行する
RedisサーバーをSSLの背後で実行するには、
/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フラグをサポートしていない場合は、デバッグ目的でredis-cliを使用してRedisサーバーに接続するために、stunnelのようなものを使用する必要があります。
GitLabクライアントをSSL経由でRedisサーバーに接続させる
SSLに対するGitLabクライアントサポートをアクティブにするには:
/etc/gitlab/gitlab.rbに次の行を追加します:gitlab_rails['redis_ssl'] = true変更を反映するためにGitLabを再設定します:
sudo gitlab-ctl reconfigure
SSL証明書
RedisにカスタムSSL証明書を使用している場合は、それらを信頼された証明書に追加してください。
コマンドの名前変更
デフォルトでは、KEYSコマンドはセキュリティ対策として無効になっています。
このコマンドやその他のコマンドを難読化または無効にしたい場合は、/etc/gitlab/gitlab.rbのredis['rename_commands']設定を次のように編集してください:
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クライアントタイムアウト
デフォルトでは、Redis用の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クライアントに提供する
詳細については、設定ドキュメントに記載された例を参照してください。
Redisの代わりにValkeyを使用する
Valkeyは、Redisのドロップイン代替として使用できるRedis互換のキーと値のストアです。Valkeyは、Redis OSS 7.2およびすべての以前のオープンソースRedisバージョンと互換性があります。
Valkeyを使用する場合:
サービス名は
redisのままです。サービスを管理するにはgitlab-ctl restart redisを使用し、gitlab-ctl restart valkeyは使用しません。ログファイルは
/var/log/gitlab/redis/に書き込まれ、別のvalkeyディレクトリには書き込まれません。データディレクトリは
/var/opt/gitlab/redis/のままです。設定ファイルは
redis.confのままです。gitlab-ctlツールは、Redisとのやり取りに引き続きredis-cliを使用します。valkey-cliをトラブルシューティングに使用する場合は、redis-cliと同じソケット、ホスト、およびポートを使用します:sudo /opt/gitlab/embedded/bin/valkey-cli -s /var/opt/gitlab/redis/redis.socket
RedisからValkeyへの移行の詳細については、Valkey移行ドキュメントを参照してください。
Valkeyにスイッチする
Redisの代わりにValkeyを使用するには:
/etc/gitlab/gitlab.rbを編集します:redis['backend'] = 'valkey'変更を反映するためにGitLabを再設定します:
sudo gitlab-ctl reconfigure
redis['backend']がvalkeyに設定されている場合:
- Redisサービスは
redis-serverの代わりにvalkey-serverを使用します。 - Sentinelサービスは
redis-sentinelの代わりにvalkey-sentinelを使用します。 - その他のすべてのRedis設定 (ポート、パスワード、パスなど) は同じままです。
サービス管理
後方互換性とシームレスな移行を確保するために、バックエンドとしてRedisまたはValkeyのどちらを使用するかに関わらず、サービス構造は一貫性を保ちます:
サービス名は
redisです。サービスを管理するにはgitlab-ctl restart redisを使用します。ログファイルは
/var/log/gitlab/redis/に書き込まれます。データディレクトリは
/var/opt/gitlab/redis/です。設定ファイルは
redis.confです。gitlab-ctlコマンドは、構成されたバックエンドに基づいて、適切なCLIツール(redis-cliまたはvalkey-cli)を使用します。トラブルシューティングには、アクティブなバックエンドを自動的に検出するラッパースクリプトを使用してください:
sudo gitlab-redis-cli
RedisからValkeyへの移行の詳細については、Valkey移行ドキュメントを参照してください。
トラブルシューティング
x509: certificate signed by unknown authority
このエラーメッセージは、SSL証明書がサーバーの信頼された証明書のリストに適切に追加されていないことを示唆しています。これがイシューであるかどうかを確認するには:
/var/log/gitlab/gitlab-workhorse/currentのWorkhorseログファイルを確認してください。次のようなメッセージが表示される場合:
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ログファイルを確認してください。次のようなメッセージが表示される場合:
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/rediss://の代わりにredis://が存在する場合、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>