Redisのトラブルシューティング
- プラン: Free、Premium、Ultimate
- 提供形態: GitLab Self-Managed
HAのセットアップが期待通りに機能するためには、多くの動的要素に注意を払う必要があります。
以下のトラブルシューティングに進む前に、ファイアウォールルールを確認してください:
- Redisマシン
6379でTCP接続を受け入れます6379でTCP経由で他のRedisマシンに接続します
- Sentinelマシン
26379でTCP接続を受け入れます26379でTCP経由で他のSentinelマシンに接続します6379でTCP経由でRedisマシンに接続します
基本的なRedisアクティビティチェック
基本的なRedisアクティビティチェックでRedisのトラブルシューティングを開始します:
- GitLabサーバーでターミナルを開きます。
gitlab-redis-cli --statを実行し、実行中の出力を観察します。- お使いのGitLab UIに移動し、いくつかのページを閲覧します。グループまたはプロジェクトの概要、イシュー、リポジトリ内のファイルなど、どのページでも機能します。
- 再度
statの出力を確認し、閲覧するにつれてkeys、clients、requests、およびconnectionsの値が増加することを確認します。数値が増加すれば、基本的なRedis機能は動作しており、GitLabはそれに接続できます。
Redisのレプリケーションのトラブルシューティング
redis-cliアプリケーションを使用して各サーバーに接続し、以下のinfo replicationコマンドを送信することで、すべてが正しいか確認できます。
/opt/gitlab/embedded/bin/redis-cli -h <redis-host-or-ip> -a '<redis-password>' info replicationPrimary Redisに接続すると、接続されているreplicasの数と、接続詳細を含むそれぞれのリストが表示されます:
# Replication
role:master
connected_replicas:1
replica0:ip=10.133.5.21,port=6379,state=online,offset=208037514,lag=1
master_repl_offset:208037658
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:206989083
repl_backlog_histlen:1048576それがreplicaの場合、プライマリ接続の詳細と、そのステータスがupかdownかが表示されます:
# Replication
role:replica
master_host:10.133.1.58
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
replica_repl_offset:208096498
replica_priority:100
replica_read_only:1
connected_replicas:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0Redisインスタンスでの高いCPU使用率
デフォルトでは、GitLabは600以上のSidekiqキューを使用し、それぞれがRedisリストとして保存されます。各Sidekiqスレッドは、長い文字列でリストされたすべてのキューを含むBRPOPコマンドを発行します。キューの数とBRPOP呼び出しのレートが増加するにつれて、RedisのCPU使用率が上昇します。お使いのGitLabインスタンスに多くのSidekiqプロセスがある場合、これによりRedisのCPU使用率が100%に近づく可能性があります。高いCPU使用率は、GitLabのパフォーマンスを著しく低下させます。
Sidekiqによって引き起こされるRedisのCPU使用率を削減するには、次の両方を行うことができます:
- Sidekiqキューの数を減らすために、ルーティングルールを使用します。
- GitLab 16.6以前を使用している場合、RedisのCPU使用率を改善するために
SIDEKIQ_SEMI_RELIABLE_FETCH_TIMEOUT環境変数を増やしてください。GitLab 16.7以降では、値はデフォルトで5であり、これは十分であるはずです。
SIDEKIQ_SEMI_RELIABLE_FETCH_TIMEOUTオプションは、切断と接続によるオーバーヘッドを削減しますが、Sidekiqのシャットダウン遅延を増加させます。
Sentinelのトラブルシューティング
Redis::CannotConnectError: No sentinels available.のようなエラーが発生した場合、設定ファイルに問題があるか、またはこのイシューに関連している可能性があります。
Sentinelノードで定義したのと同じ値をredis['master_name']とredis['master_password']で定義していることを確認する必要があります。
Redisコネクタredis-rbがSentinelと連携する動作は、やや直感的ではありません。この複雑さはLinuxパッケージ内で隠蔽しようとしていますが、それでもいくつかの追加設定が必要です。
お使いの設定が正しいことを確認するには:
GitLabアプリケーションサーバーにSSH接続します
Railsコンソールに入ります:
# For Omnibus installations sudo gitlab-rails console # For source installations sudo -u git rails console -e productionコンソールで実行します:
redis = Gitlab::Redis::SharedState.redis redis.infoこの画面を開いたまま、以下に説明されているようにフェイルオーバーをトリガーするに進みます。
プライマリRedisでフェイルオーバーをトリガーするには、RedisサーバーにSSH接続し、実行します:
# port must match your primary redis port, and the sleep time must be a few seconds bigger than defined one redis-cli -h localhost -p 6379 DEBUG sleep 20このアクションはサービスに影響を与え、最大20秒間インスタンスを停止させます。成功すれば、その後回復するはずです。
次に、最初のステップからRailsコンソールに戻って、実行します:
redis.info数秒の遅延(フェイルオーバー/再接続時間)の後、異なるポートが表示されるはずです。
バンドルされていないRedisとセルフコンパイルインストールでのトラブルシューティング
GitLabでRedis::CannotConnectError: No sentinels available.のようなエラーが発生した場合、設定ファイルに問題があるか、またはこのアップストリームのイシューに関連している可能性があります。
resque.ymlとsentinel.confが正しく設定されていることを確認する必要があります。そうでない場合、redis-rbは正常に動作しません。
sentinel.confで定義されたmaster-group-name(gitlab-redis)は、GitLab(resque.yml)のホスト名としてmust使用する必要があります:
# sentinel.conf:
sentinel monitor gitlab-redis 10.0.0.1 6379 2
sentinel down-after-milliseconds gitlab-redis 10000
sentinel config-epoch gitlab-redis 0
sentinel leader-epoch gitlab-redis 0# resque.yaml
production:
url: redis://:myredispassword@gitlab-redis/
sentinels:
-
host: 10.0.0.1
port: 26379 # point to sentinel, not to redis port
-
host: 10.0.0.2
port: 26379 # point to sentinel, not to redis port
-
host: 10.0.0.3
port: 26379 # point to sentinel, not to redis port不明な点がある場合は、Redis Sentinelのドキュメントを参照してください。