バンドルされているPgBouncerサービスでの作業

note
PgBouncerはgitlab-ee パッケージにバンドルされていますが、使用は無料です。サポートについては、Premiumサブスクリプションが必要です。

PgBouncerは、フェイルオーバーシナリオでサーバー間のデータベース接続をシームレスにマイグレーションするために使用されます。さらに、フォールトトレラントでない設定で接続をプールし、リソースの使用量を減らしながら応答時間を短縮するために使用することもできます。

GitLab Premiumには、/etc/gitlab/gitlab.rb で管理できるPgBouncerがバンドルされています。

フォールトトレラントなGitLabインストールの一部としてのPgBouncer

このコンテンツは新しい場所に移動しました。

フォールトトレラントでないGitLabインストールの一部としてのPgBouncer

  1. コマンドでPGBOUNCER_USER_PASSWORD_HASHgitlab-ctl pg-password-md5 pgbouncer

  2. gitlab-ctl pg-password-md5 gitlab コマンドでSQL_USER_PASSWORD_HASH を生成します。平文のSQL_USER_PASSWORDは後で入力してください。

  3. データベース・ノードの/etc/gitlab/gitlab.rb

    postgresql['pgbouncer_user_password'] = 'PGBOUNCER_USER_PASSWORD_HASH'
    postgresql['sql_user_password'] = 'SQL_USER_PASSWORD_HASH'
    postgresql['listen_address'] = 'XX.XX.XX.Y' # Where XX.XX.XX.Y is the ip address on the node postgresql should listen on
    postgresql['md5_auth_cidr_addresses'] = %w(AA.AA.AA.B/32) # Where AA.AA.AA.B is the IP address of the pgbouncer node
    
  4. 走るgitlab-ctl reconfigure

    note
    データベースがすでに実行されている場合は、再設定後にgitlab-ctl restart postgresql を実行して再起動する必要があります。
  5. PgBouncerを実行しているノード上で、以下が設定されていることを確認してください。/etc/gitlab/gitlab.rb

    pgbouncer['enable'] = true
    pgbouncer['databases'] = {
      gitlabhq_production: {
        host: 'DATABASE_HOST',
        user: 'pgbouncer',
        password: 'PGBOUNCER_USER_PASSWORD_HASH'
      }
    }
    

    データベースごとに追加の設定パラメータを渡すことができます:

    pgbouncer['databases'] = {
      gitlabhq_production: {
         ...
         pool_mode: 'transaction'
      }
    }
    

    これらのパラメータは注意して使用してください。パラメータの完全なリストはPgBouncerのドキュメントを参照してください。

  6. 走るgitlab-ctl reconfigure

  7. Pumaが稼動しているノードで、以下が設定されていることを確認します。/etc/gitlab/gitlab.rb

    gitlab_rails['db_host'] = 'PGBOUNCER_HOST'
    gitlab_rails['db_port'] = '6432'
    gitlab_rails['db_password'] = 'SQL_USER_PASSWORD'
    
  8. 走るgitlab-ctl reconfigure

  9. この時点で、インスタンスはPgBouncerを通してデータベースに接続するはずです。イシューがある場合は、トラブルシューティングセクションを参照してください。

バックアップ

PgBouncer接続を通してGitLabのバックアップやリストアをしないでください:GitLabが停止してしまいます。

バックアップの再設定方法についてはこちらをご覧ください。

モニタリングの有効化

GitLab 12.0から導入されました

モニタリングを有効にする場合、全てのPgBouncerサーバーで有効にする必要があります。

  1. /etc/gitlab/gitlab.rb を作成/編集し、以下の設定を追加します:

    # Enable service discovery for Prometheus
    consul['enable'] = true
    consul['monitoring_service_discovery'] =  true
       
    # Replace placeholders
    # Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z
    # with the addresses of the Consul server nodes
    consul['configuration'] = {
       retry_join: %w(Y.Y.Y.Y consul1.gitlab.example.com Z.Z.Z.Z),
    }
       
    # Set the network addresses that the exporters will listen on
    node_exporter['listen_address'] = '0.0.0.0:9100'
    pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
    
  2. sudo gitlab-ctl reconfigure を実行して設定をコンパイルします。

管理コンソール

Linuxパッケージのインストールでは、PgBouncer管理コンソールに自動的に接続するコマンドが提供されています。コンソールの詳しい操作方法はPgBouncerのドキュメントを参照してください。

セッションを開始するには以下を実行し、pgbouncer ユーザーのパスワードを入力してください:

sudo gitlab-ctl pgb-console

インスタンスに関する基本情報を取得します:

pgbouncer=# show databases; show clients; show servers;
        name         |   host    | port |      database       | force_user | pool_size | reserve_pool | pool_mode | max_connections | current_connections
---------------------+-----------+------+---------------------+------------+-----------+--------------+-----------+-----------------+---------------------
 gitlabhq_production | 127.0.0.1 | 5432 | gitlabhq_production |            |       100 |            5 |           |               0 |                   1
 pgbouncer           |           | 6432 | pgbouncer           | pgbouncer  |         2 |            0 | statement |               0 |                   0
(2 rows)

 type |   user    |      database       | state  |   addr    | port  | local_addr | local_port |    connect_time     |    request_time     |    ptr    | link
| remote_pid | tls
------+-----------+---------------------+--------+-----------+-------+------------+------------+---------------------+---------------------+-----------+------
+------------+-----
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44590 | 127.0.0.1  |       6432 | 2018-04-24 22:13:10 | 2018-04-24 22:17:10 | 0x12444c0 |
|          0 |
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44592 | 127.0.0.1  |       6432 | 2018-04-24 22:13:10 | 2018-04-24 22:17:10 | 0x12447c0 |
|          0 |
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44594 | 127.0.0.1  |       6432 | 2018-04-24 22:13:10 | 2018-04-24 22:17:10 | 0x1244940 |
|          0 |
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44706 | 127.0.0.1  |       6432 | 2018-04-24 22:14:22 | 2018-04-24 22:16:31 | 0x1244ac0 |
|          0 |
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44708 | 127.0.0.1  |       6432 | 2018-04-24 22:14:22 | 2018-04-24 22:15:15 | 0x1244c40 |
|          0 |
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44794 | 127.0.0.1  |       6432 | 2018-04-24 22:15:15 | 2018-04-24 22:15:15 | 0x1244dc0 |
|          0 |
 C    | gitlab    | gitlabhq_production | active | 127.0.0.1 | 44798 | 127.0.0.1  |       6432 | 2018-04-24 22:15:15 | 2018-04-24 22:16:31 | 0x1244f40 |
|          0 |
 C    | pgbouncer | pgbouncer           | active | 127.0.0.1 | 44660 | 127.0.0.1  |       6432 | 2018-04-24 22:13:51 | 2018-04-24 22:17:12 | 0x1244640 |
|          0 |
(8 rows)

 type |  user  |      database       | state |   addr    | port | local_addr | local_port |    connect_time     |    request_time     |    ptr    | link | rem
ote_pid | tls
------+--------+---------------------+-------+-----------+------+------------+------------+---------------------+---------------------+-----------+------+----
--------+-----
 S    | gitlab | gitlabhq_production | idle  | 127.0.0.1 | 5432 | 127.0.0.1  |      35646 | 2018-04-24 22:15:15 | 2018-04-24 22:17:10 | 0x124dca0 |      |
  19980 |
(1 row)

PgBouncerをバイパスする手順

Linux パッケージのインストール

データベースの変更はPgBouncerを通さずに直接行う必要があります。

主に影響を受ける作業は、データベースのリストアと データベースのマイグレーションを伴うGitLabのアップグレードです。

  1. プライマリノードを見つけるには、データベースノード上で以下を実行してください:

    sudo gitlab-ctl patroni members
    
  2. タスクを実行するアプリケーションノードで/etc/gitlab/gitlab.rb を編集し、gitlab_rails['db_host']gitlab_rails['db_port'] をデータベースのプライマリノードのホストとポートで更新します。

  3. reconfigure を実行します:

    sudo gitlab-ctl reconfigure
    

タスクまたはプロシージャを実行した後、PgBouncerの使用に戻ります:

  1. /etc/gitlab/gitlab.rb 、PgBouncerを指すように戻してください。
  2. reconfigure を実行します:

    sudo gitlab-ctl reconfigure
    

Helmチャートのインストール

高可用性デプロイもLinuxパッケージベースと同じ理由でPgBouncerをバイパスする必要があります。Helmチャートのインストールの場合:

  • データベースのバックアップとリストアタスクはツールボックスコンテナによって実行されます。
  • マイグレーションタスクは migrations コンテナによって実行されます。

各サブチャートで PostgreSQL ポートをオーバーライドして、これらのタスクが実行され、PostgreSQL に直接接続できるようにしてください:

微調整

PgBouncerのデフォルト設定はほとんどのインストールに適しています。特定のケースでは、スループットを向上させたり、データベースのメモリ不足を引き起こす可能性のあるリソースの使用を制限するために、パフォーマンス固有の変数やリソース固有の変数を変更することができます。

公式のPgBouncerドキュメントでパラメータとそれぞれのドキュメントを見つけることができます。以下に最も関連するパラメータとLinuxパッケージインストール時のデフォルトを示します:

  • pgbouncer['max_client_conn'] (デフォルト:2048, サーバファイル記述子の制限に依存) これはPgBouncerの “フロントエンド “プールです: RailsからPgBouncerへの接続。
  • pgbouncer['default_pool_size'] (デフォルト:100) これはPgBouncerの “バックエンド “プールです。

default_pool_size の理想的な数は、データベースにアクセスする必要がある全てのプロビジョニングされたサービスを処理するのに十分でなければなりません。以下の各サービスは、データベースプールのサイズを定義するために以下の式を使用します:

  • puma:max_threads + headroom (デフォルト14)
    • max_threads は次の方法で設定します:gitlab['puma']['max_threads'] (デフォルト:4)
    • headroom 環境変数DB_POOL_HEADROOM で設定可能 (デフォルトは10)
  • sidekiq:max_concurrency + 1 + headroom (デフォルト:31)
    • max_concurrency は次の方法で設定します:sidekiq['max_concurrency'] (デフォルト:20)
    • headroom 環境変数DB_POOL_HEADROOM で設定可能 (デフォルトは10)
  • geo-logcursor:1+headroom (デフォルト:11)
    • headroom 環境変数DB_POOL_HEADROOM で設定可能 (デフォルトは10)

default_pool_size を計算するには、pumasidekiqgeo-logcursor のインスタンス数に、上記のようにそれぞれが消費できる接続数を掛けます。その合計が推奨されるdefault_pool_size となります。

内部ロードバランサーで複数のPgBouncerを使用している場合、default_pool_size をインスタンス数で割ることで、インスタンス間の負荷を均等に分散することができます。

pgbouncer['max_client_conn'] はPgBouncerが受け入れられる接続のハードリミットです。これを変更する必要はないでしょう。もし制限に達している場合は、内部ロードバランサーでPgBouncerを追加することを検討してください。

Geo Tracking Databaseを指すPgBouncerの制限を設定する場合、puma

トラブルシューティング

PgBouncerを通して接続する際に何らかの問題が発生した場合、最初に確認するのはログです:

sudo gitlab-ctl tail pgbouncer

さらに、管理コンソールのshow databases 。出力では、gitlabhq_production データベースのhost フィールドに値があるはずです。また、current_connections は 1 より大きいはずです。

メッセージLOG: invalid CIDR mask in address

Geo ドキュメントの修正案を参照してください。

メッセージLOG: invalid IP mask "md5": Name or service not known

Geo ドキュメントの修正案を参照してください。