- 別のローカル Redis インスタンスの使用
- バンドルされている Redis に TCP 経由でアクセスできるようにします。
- Linux パッケージを使った Redis 専用サーバーの設定
- 複数のRedisインスタンスでの実行
- Redis センチネル
- フェイルオーバーセットアップでの Redis の使用
- Google Cloud Memorystore の使用
- Redisの接続数をデフォルトより増やす
- Redis用のTCPスタックのチューニング
- ホスト名からipをアナウンス
- RedisキャッシュインスタンスをLRUとして設定します。
- セキュア・ソケット・レイヤーの使用(SSL)
- SSL証明書
- 名前の変更されたコマンド
- 怠惰な解放
- スレッドI/O
- トラブルシューティング
Redisの設定
別のローカル 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'
-
ファイルを保存し、変更を有効にするために GitLab を再設定します:
sudo gitlab-ctl reconfigure
Linux パッケージを使った Redis 専用サーバーの設定
RedisをGitLabアプリケーションとは別のサーバーにセットアップしたい場合は、LinuxパッケージのインストールからバンドルされているRedisを使うことができます。
複数のRedisインスタンスでの実行
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ビハインドでの実行
-
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
フラグがサポートされていないredis-cli
場合は redis-cli
、次のようなものを使う必要があります。 stunnel
redis-cli
を使って Redis サーバーに接続しなければなりません。GitLabクライアントがSSL経由でRedisサーバーに接続するようにします。
GitLabクライアントのSSLサポートを有効にします:
-
/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
トラブルシューティング
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を使うように設定されていない可能性があります。
-
サーバーが実際に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
パラメータが適切に設定されていないか、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>