- アプリケーション・サーバー上でのRedisの実行
- Redis専用サーバーの設定
- Redisの接続数をデフォルトより増やす
- Redis用TCPスタックのチューニング
- 複数のRedisインスタンスでの実行
- Redisセンチネル
- RedisキャッシュインスタンスをLRUに設定
- Redis HAセットアップの使用
- セキュア・ソケット・レイヤーの使用(SSL)
- コマンド名の変更
- SSL証明書
- 怠惰な解放
- 一般的なトラブルシューティング
Redisの設定
アプリケーション・サーバー上でのRedisの実行
別のローカル Redis インスタンスの使用
Omnibus GitLabはデフォルトでRedisのインスタンスを提供します。 GitLabアプリケーションを自分の ローカルでRedisインスタンスに向けたい管理者は、gitlab.rb
を変更してください。 変更を有効にするにはgitlab-ctl reconfigure
を実行してください。
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'
バンドルされたRedisインスタンスにTCP経由で到達可能にする方法
Omnibus GitLabが管理するRedisインスタンスのいずれかをTCP経由で到達可能にする場合は、次の設定を使用します。
redis['port'] = 6379
redis['bind'] = '127.0.0.1'
Redis専用サーバーの設定
GitLabで使用するために別のRedisサーバーをセットアップしたい場合(スケーリングの問題の場合など)、Omnibus GitLabを使ってセットアップすることができます。
Redisノードのセットアップ
注:Redisはデフォルトでは認証を必要としません。 詳細はRedisセキュリティのドキュメントを参照してください。 Redisサービスのセキュリティを確保するには、Redisパスワードと厳格なファイアウォールルールの組み合わせを使用することをお勧めします。
- GitLabのダウンロードページのステップ1と2を使用して、Omnibus GitLabをダウンロード/インストールします。 ダウンロードページの他のステップは完了しないでください。
-
/etc/gitlab/gitlab.rb
を作成/編集し、以下の設定を使用します。# Disable all services except Redis redis_master_role['enable'] = true # Redis configuration redis['port'] = 6379 redis['bind'] = '0.0.0.0' # If you wish to use Redis authentication (recommended) redis['password'] = 'Redis Password' # Disable automatic database migrations # Only the primary GitLab application server should handle migrations gitlab_rails['auto_migrate'] = false
注:
redis_master_role['enable']
オプションは GitLab 8.14 以降でのみ利用可能です。このオプションによってどのサービスが自動的に無効になるかはgitlab_rails.rb
を参照してください。 -
sudo gitlab-ctl reconfigure
を実行して Redis をインストールし、設定します。
GitLab アプリケーションノードの設定
-
以下の設定はGitLabアプリケーションを外部のRedisサービスに向けるものです:
redis['enable'] = false gitlab_rails['redis_host'] = 'redis.example.com' gitlab_rails['redis_port'] = 6379 # Required if Redis authentication is configured on the Redis node gitlab_rails['redis_password'] = 'Redis Password'
-
sudo gitlab-ctl reconfigure
を実行して、外部 Redis ノードを使用するようにアプリケーションを設定します。
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
は、Redisサーバがアイドル状態のTCP接続を終了するまでの待機時間を秒単位で設定した値です。tcp_keepalive
は、通信がない場合にクライアントへのTCP ACKを秒単位で調整可能な設定です。
redis['tcp_timeout'] = "60"
redis['tcp_keepalive'] = "300"
複数のRedisインスタンスでの実行
GitLabには、異なる永続化クラス用の別々のRedisインスタンスで実行するためのサポートが含まれています。現在のところ、cache
、queues
、shared_state
、actioncable
。
インスタンス | 目的 |
---|---|
cache
| キャッシュデータの保存 |
queues
| ストア Sidekiq バックグラウンド ジョブ |
shared_state
| セッション関連データおよびその他の永続データの保存 |
actioncable
| ActionCable 用 Pub/Sub キューバックエンド |
- Redis専用サーバのセットアップ」の説明に従って、各固有クラス専用のインスタンスを作成します。
-
/etc/gitlab/gitlab.rb
、使用するインスタンスごとに適切な変数を設定してください:gitlab_rails['redis_cache_instance'] = REDIS_CACHE_URL gitlab_rails['redis_queues_instance'] = REDIS_QUEUES_URL gitlab_rails['redis_shared_state_instance'] = REDIS_SHARED_STATE_URL gitlab_rails['redis_actioncable_instance'] = REDIS_ACTIONCABLE_URL
注意:RedisのURLは以下の形式でなければなりません:
redis://PASSWORD@REDIS_HOST:PORT/2
どこで
- PASSWORD は Redis インスタンスの平文のパスワードです。
- REDIS_HOST はホストのホスト名または IP アドレス。
- REDIS_PORTはRedisがリッスンしているポートで、デフォルトは6379です。
- 走る
gitlab-ctl reconfigure
Redisセンチネル
Redis Sentinelの設定の詳細については、https://docs.gitlab.com/ee/administration/high_availability/redis.htmlを参照してください。
RedisキャッシュインスタンスをLRUに設定
複数のRedisインスタンスを使用することで、RedisをLeast Recently Usedキャッシュとして設定することができます。 これはRedisキャッシュインスタンスに対してのみ行う必要があることに注意してください。Redisキューおよび共有ステートインスタンスは、永続的であることが期待されるデータ(Sidekiqジョブなど)を含むため、決してLRUとして設定すべきではありません。
メモリ使用量の上限を32GBにするには、次のようにします:
redis['maxmemory'] = "32gb"
redis['maxmemory_policy'] = "allkeys-lru"
redis['maxmemory_samples'] = 5
Redis HAセットアップの使用
https://docs.gitlab.com/ee/administration/high_availability/redis.htmlを参照。
セキュア・ソケット・レイヤーの使用(SSL)
Redis v3.2.xはSSLをサポートしていませんが、stunnelを使用してRedis接続を暗号化することができます。 AWS ElasticCacheもRedis over 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
制限事項
-
GitLabはRedisサーバーを暗号化するためのstunnelやその他のツールは同梱していません。 しかし、GitLabは
rediss://
(redis://
とは対照的)URLスキームによるクライアントサポートを提供しています。 -
Redis SentinelはまだSSLをサポートしていません。 Redis Sentinelを使用する場合は、SSLのクライアントサポートを有効にしないでください。このプルリクエストにより、Redis 6.0にネイティブサポートがもたらされる可能性があります。
SSLの有効化(クライアント設定)
GitLabクライアントのSSLサポートを有効にするには、以下のようにします:
-
/etc/gitlab/gitlab.rb
に以下の行を追加:gitlab_rails['redis_ssl'] = true
-
sudo gitlab-ctl reconfigure
を実行して変更を有効にします。
SSL証明書
RedisにカスタムSSL証明書を使用している場合は、信頼できる証明書に追加してください。
怠惰な解放
Redis 4 では遅延解放が導入され、大きな値を解放する際のパフォーマンスが向上しました。
この設定のデフォルトはfalse
。有効にするには
redis['lazyfree_lazy_eviction'] = true
redis['lazyfree_lazy_expire'] = true
redis['lazyfree_lazy_server_del'] = true
redis['replica_lazy_flush'] = 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'
-
Omnibus が提供する 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:
/opt/gitlab/embedded/bin/redis-cli -s /var/opt/gitlab/redis/redis.socket
-
TCP経由のRedis:
/opt/gitlab/embedded/bin/redis-cli -h 127.0.0.1 -p 6379
-
必要に応じてRedisを認証するためのパスワード:
/opt/gitlab/embedded/bin/redis-cli -h 127.0.0.1 -p 6379 -a <password>