正式なドキュメントは英語版であり、この日本語訳はAI支援翻訳により作成された参考用のものです。日本語訳の一部の内容は人間によるレビューがまだ行われていないため、翻訳のタイミングにより英語版との間に差異が生じることがあります。最新かつ正確な情報については、英語版をご参照ください。

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のトラブルシューティングを開始します:

  1. GitLabサーバーでターミナルを開きます。
  2. gitlab-redis-cli --statを実行し、実行中の出力を観察します。
  3. お使いのGitLab UIに移動し、いくつかのページを閲覧します。グループまたはプロジェクトの概要、イシュー、リポジトリ内のファイルなど、どのページでも機能します。
  4. 再度statの出力を確認し、閲覧するにつれてkeysclientsrequests、およびconnectionsの値が増加することを確認します。数値が増加すれば、基本的なRedis機能は動作しており、GitLabはそれに接続できます。

Redisのレプリケーションのトラブルシューティング

redis-cliアプリケーションを使用して各サーバーに接続し、以下のinfo replicationコマンドを送信することで、すべてが正しいか確認できます。

/opt/gitlab/embedded/bin/redis-cli -h <redis-host-or-ip> -a '<redis-password>' info replication

Primary 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の場合、プライマリ接続の詳細と、そのステータスがupdownかが表示されます:

# 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:0

Redisインスタンスでの高いCPU使用率

デフォルトでは、GitLabは600以上のSidekiqキューを使用し、それぞれがRedisリストとして保存されます。各Sidekiqスレッドは、長い文字列でリストされたすべてのキューを含むBRPOPコマンドを発行します。キューの数とBRPOP呼び出しのレートが増加するにつれて、RedisのCPU使用率が上昇します。お使いのGitLabインスタンスに多くのSidekiqプロセスがある場合、これによりRedisのCPU使用率が100%に近づく可能性があります。高いCPU使用率は、GitLabのパフォーマンスを著しく低下させます。

Sidekiqによって引き起こされるRedisのCPU使用率を削減するには、次の両方を行うことができます:

SIDEKIQ_SEMI_RELIABLE_FETCH_TIMEOUTオプションは、切断と接続によるオーバーヘッドを削減しますが、Sidekiqのシャットダウン遅延を増加させます。

Sentinelのトラブルシューティング

Redis::CannotConnectError: No sentinels available.のようなエラーが発生した場合、設定ファイルに問題があるか、またはこのイシューに関連している可能性があります。

Sentinelノードで定義したのと同じ値をredis['master_name']redis['master_password']で定義していることを確認する必要があります。

Redisコネクタredis-rbがSentinelと連携する動作は、やや直感的ではありません。この複雑さはLinuxパッケージ内で隠蔽しようとしていますが、それでもいくつかの追加設定が必要です。

お使いの設定が正しいことを確認するには:

  1. GitLabアプリケーションサーバーにSSH接続します

  2. Railsコンソールに入ります:

    # For Omnibus installations
    sudo gitlab-rails console
    
    # For source installations
    sudo -u git rails console -e production
  3. コンソールで実行します:

    redis = Gitlab::Redis::SharedState.redis
    redis.info

    この画面を開いたまま、以下に説明されているようにフェイルオーバーをトリガーするに進みます。

  4. プライマリ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秒間インスタンスを停止させます。成功すれば、その後回復するはずです。

  5. 次に、最初のステップからRailsコンソールに戻って、実行します:

    redis.info

    数秒の遅延(フェイルオーバー/再接続時間)の後、異なるポートが表示されるはずです。

バンドルされていないRedisとセルフコンパイルインストールでのトラブルシューティング

GitLabでRedis::CannotConnectError: No sentinels available.のようなエラーが発生した場合、設定ファイルに問題があるか、またはこのアップストリームのイシューに関連している可能性があります。

resque.ymlsentinel.confが正しく設定されていることを確認する必要があります。そうでない場合、redis-rbは正常に動作しません。

sentinel.confで定義されたmaster-group-namegitlab-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のドキュメントを参照してください。