Connection Pooling

CloudNativePGは、 Pooler カスタムリソース定義CRDを介して、 PostgreSQLで最も人気のあるオープンソース接続プーラーの1つである PgBouncer との接続プーリングのネイティブサポートを提供します。

簡単に言うと、CloudNativePGのプーラーは、アプリケーションとPostgreSQLサービスたとえば rw サービスの間にあるPgBouncerポッドの展開です。別個の、スケーラブル、構成可能、高可用性のデータベースアクセスレイヤーを作成します。

警告

CloudNativePGでは、PgBouncerの`auth_dbname` 機能が必要です。必ずPgBouncerコンテナイメージバージョン**1.19以降**を使用してください。

アーキテクチャ

次の図は、PgBouncerに基づいたデータベースアクセスレイヤーの導入がCloudNativePGのアーキテクチャをどのように変更するかを強調しています。 PostgreSQLプライマリサービスに直接接続する代わりに、アプリケーションはPgBouncerの同等のサービスに接続できます。この機能により、既存の接続を再利用できるため、PostgreSQL側でのパフォーマンスとリソース管理が向上します。

Applications writing to the single primary via PgBouncer

Applications writing to the single primary via PgBouncer

クイックスタート

この例は、CloudNativePGがPgBouncerプーラーを実装する方法を示すのに役立ちます。

apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: pooler-example-rw
spec:
  cluster:
    name: cluster-example

  instances: 3
  type: rw
  pgbouncer:
    poolMode: session
    parameters:
      max_client_conn: "1000"
      default_pool_size: "10"

注釈

プーラー名は、同じ名前空間内のクラスター名と同じにすることはできません。

この例では、 cluster-example と呼ばれるPostgres Cluster リソースに厳密に関連付けられるpooler-example-rw と呼ばれるPooler リソースを作成します。これは、読み取り/書き込みサービスrw 、したがってcluster-example-rw によって識別されるプライマリを指します。

Pooler リソースは、Postgresクラスターと同じ名前空間に存在する必要があります。これは、 session で構成された latest stable image of PgBouncer を実行する3つのポッドのKubernetesデプロイメントで構成されています

それぞれ最大1000の接続を受け入れます。デフォルトのプールサイズは、PostgreSQLに対する10ユーザー/データベースペアです。

注釈

Pooler リソースは、PgBouncerに`*` フォールバックデータベースのみを設定します。この設定は、クライアントから渡された接続文字列のすべてのパラメーターがPostgreSQLサーバーに中継されることを意味します。詳細については、 ["Section [databases]" in the PgBouncer documentation](https://www.pgbouncer.org/config.html#section-databases)を参照してください。

CloudNativePGは、PgBouncerで使用される構成ファイルを含むプーラーと同じ名前のシークレットも作成します。

注釈

詳細はこちら PgBouncerSpec

APIリファレンスで。

リソースのライフサイクルのプール化

Pooler リソースは、オペレーターによって自動的に管理されません。必要に応じて手動で作成し、同じPostgreSQLクラスターに複数のプーラーを展開できます。

理解する重要なポイントは、 Cluster およびPooler リソースのライフサイクルが独立していることです。クラスターを削除してもプーラーは自動的に削除されず、プーラーを削除してもクラスターには影響しません。

注釈

プーラーの動作を理解すると、アーキテクチャを完全に柔軟に設計できます。プーラーなしのクラスター、単一のプーラーのあるクラスター、または複数のプーラーたとえば、アプリケーションごとに1つを持つクラスターを実行できます。

注釈

オペレーター自分自身がアップグレードされると、プーラーポッドもローリングアップグレードされます。これにより、プーラーポッド内のインスタンスマネージャーが一貫してアップグレードされます。

セキュリティ

PgBouncerプーラーは、プールのクライアントアプリケーション側とサーバーPostgreSQL側の両方で、TLS接続を介した転送中の暗号化のCloudNativePGサポートと透過的に統合されています。

コンテナはpgbouncer システムユーザーとして実行され、 pgbouncer 管理データベースへのアクセスは、ピア認証を介したローカル接続を介してのみ許可されます。

証明書

デフォルトでは、PgBouncerプーラーはPostgreSQLクラスターと同じ証明書を再利用します。 TLSクライアント証明書認証に依存して、PostgreSQLサーバーに接続し、クライアントのパスワード認証に使用されるauth_query を実行します 認証を使用する を参照してください。

独自のシークレットを指定すると、ビルトイン統合が無効になります。その時点から、認証を管理するための完全な制御と責任を取得します。サポートされているシークレット形式は次のとおりです。

  1. ベーシック認証

  2. TLS

  3. 不透明

不透明なシークレットの場合、 Pooler リソースは次のキーを想定しています。

  • tls.crt

  • tls.key

実際、これは、不透明なシークレットをTLSシークレットとして、同じ構造から開始できることを意味します。

認証

デフォルトの認証方法

デフォルトでは、CloudNativePGは、PostgreSQLデータベースに接続するPgBouncerクライアントのパスワードベースの認証をネイティブにサポートしています。

このビルトインメカニズムは、PgBouncerのauth_dbname バージョン1.19で導入、auth_user およびauth_query オプションとともに利用します。

注釈

独自の証明書シークレットを提供する場合、ビルトイン統合は無効になります。その場合、PgBouncer認証の構成と管理は自分の責任となります。

ビルトイン統合は、次のタスクを実行します。

  • PostgreSQLサーバーにcnpg_pooler_pgbouncer と呼ばれる専用ユーザーを作成します

  • postgres データベースにルックアップファンクションを作成し、実行特権をcnpg_pooler_pgbouncer に付与しますPoLA原則に従って

  • このユーザーのTLS証明書を発行します

  • auth_user としてcnpg_pooler_pgbouncer を使用し、auth_dbname としてpostgres を使用するようにPgBouncerを構成します

  • 発行されたTLS証明書を使用してPostgreSQLに対してcnpg_pooler_pgbouncer を認証するようにPgBouncerを構成します

  • クラスターに関連付けられているプーラーがない場合、上記のすべてを自動的にクリーンアップします

SQL命令

ビルトイン統合の一部として、CloudNativePGは、リコンシリエーション中に一連のSQLステートメントを自動的に実行します。これらのステートメントは、インスタンスマネージャーによってpostgres データベースに対してpostgres ユーザーを使用して実行されます。

ロールの作成

CREATE ROLE cnpg_pooler_pgbouncer WITH LOGIN;

postgres データベースへのアクセスを付与します。

GRANT CONNECT ON DATABASE postgres TO cnpg_pooler_pgbouncer;

パスワード検証のためのルックアップファンクションを作成します。このファンクションは、 SECURITY DEFINER 特権でpostgres データベースに作成され、PgBouncerのauth_query オプションで使用されます。

CREATE OR REPLACE FUNCTION public.user_search(uname TEXT)
  RETURNS TABLE (usename name, passwd text)
  LANGUAGE sql SECURITY DEFINER AS
  SELECT usename, passwd FROM pg_catalog.pg_shadow WHERE usename=$1;;

ルックアップ機能の権限を制限および付与します。

REVOKE ALL ON FUNCTION public.user_search(text)
  FROM public;

GRANT EXECUTE ON FUNCTION public.user_search(text)
  TO cnpg_pooler_pgbouncer;

カスタム認証方法

独自の証明書シークレットを提供すると、ビルトイン統合が無効になります。

これにより、認証プロセスを自分自身で管理する柔軟性と責任が得られます。上記の手順に従って、デフォルトの設定と同様の動作を複製できます。

ポッドテンプレート

Pooler リソースのtemplate セクションのポッドテンプレート仕様を利用できます。詳細については、APIリファレンスの PoolerSpec を参照してください。

テンプレートを使用して、ポッドとノードのアフィニティおよびアンチアフィニティルールの微制御を含め、必要に応じてポッドを構成できます。デフォルトでは、コンテナはghcr.io/cloudnative-pg/pgbouncer のイメージを使用します。

この例は、 PodAntiAffinity を指定する Pooler`を示しています。

apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: pooler-example-rw
spec:
  cluster:
    name: cluster-example
  instances: 3
  type: rw

  template:
    metadata:
      labels:
        app: pooler
    spec:
      containers: []
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - pooler
            topologyKey: "kubernetes.io/hostname"

注釈

PodSpec の必須フィールドであるため、変更しない場合は`.spec.template.spec.containers` を`[]` に明示的に設定します。 .spec.template.spec.containers が設定されていない場合、Kubernetes APIサーバーはマニフェストを適用しようとすると次のエラーを返します。error validating "pooler.yaml": error validating data: ValidationError(Pooler.spec.template.spec): missing required field "containers"

この例では、リソースを設定し、使用されるイメージを変更します。

apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: pooler-example-rw
spec:
  cluster:
    name: cluster-example
  instances: 3
  type: rw

  template:
    metadata:
      labels:
        app: pooler
    spec:
      containers:
        - name: pgbouncer
          image: my-pgbouncer:latest
          resources:
            requests:
              cpu: "0.1"
              memory: 100Mi
            limits:
              cpu: "0.5"
              memory: 500Mi

サービステンプレート

場合によっては、プーラーには別のラベル、アノテーション、またはサービスタイプの変更が必要になる場合があります。 serviceTemplate フィールドを使用してこれを実現できます。

apiVersion: postgresql.cnpg.io/v1
kind: Pooler
metadata:
  name: pooler-example-rw
spec:
  cluster:
    name: cluster-example
  instances: 3
  type: rw
  serviceTemplate:
    metadata:
      labels:
        app: pooler
    spec:
      type: LoadBalancer
  pgbouncer:
    poolMode: session
    parameters:
      max_client_conn: "1000"
      default_pool_size: "10"

デフォルトで、オペレーターは次のデータを使用してServicePort を追加します。

ports:
- name: pgbouncer
  port: 5432
  protocol: TCP
  targetPort: pgbouncer

警告

名前`pgbouncer` またはポート`5432` で`ServicePort` を指定すると、デフォルトの`ServicePort` が追加されません。これは、同じ`name` または`port` と同じ`ServicePort` エントリがKubernetesでは許可されず、エラーが発生するためです。

高可用性HA

Kubernetesの展開のため、単一のインスタンスまたは複数のポッドで実行するようにプーラーを構成できます。公開されたサービスにより、クライアントがPgBouncerを実行している利用可能なポッドにランダムに分散されるようになり、基になるサーバーrw サービスを使用する場合またはサーバー複数のレプリカでro サービスを使用する場合への接続を管理および再利用します。

警告

インフラストラクチャが複数のアベイラビリティーゾーンにまたがり、それらの間の遅延が高い場合、ネットワークホップに注意してください。たとえば、ゾーン2で実行され、ゾーン3で実行されているPgBouncerに接続し、ゾーン1のPostgreSQLプライマリをポイントしている場合を検討します。

PgBouncer構成オプション

オペレーターは configuration options for PgBouncer の大部分を管理し、それらのサブセットのみを変更できます。

警告

オペレーターは検証しないため、各オプションの値を正しく設定する責任があります。

これらはカスタマイズ可能なPgBouncerオプションであり、各パラメーターのPgBouncerドキュメントへのリンクがあります。特に記載のない限り、デフォルト値はPgBouncerによって直接設定された値です。

PgBouncer構成のカスタマイズは、.spec.pgbouncer.parameters マップに宣言的に書き込まれます。

オペレーターはプーラー仕様の変更に対応し、すべてのPgBouncerインスタンスは、サービスを中断せずに更新された構成をリロードします。

警告

すべてのPgBouncerポッドは同じ構成で、仕様のパラメーターに合わせて調整されています。これらのパラメーターを間違えると、プーラー全体の操作性を混乱させる可能性があります。演算子はオプションの値を検証しません。

モニタリング

Pooler のPgBouncer実装には、デフォルトのPrometheusエクスポーターが付属しています。次のコマンドを実行して、cnpg_pgbouncer_ 接頭辞を持ついくつかのメトリックを利用できるようにします。

  • SHOW LISTS 接頭辞 cnpg_pgbouncer_lists

  • SHOW POOLS 接頭辞 cnpg_pgbouncer_pools

  • SHOW STATS 接頭辞 cnpg_pgbouncer_stats

CloudNativePGインスタンスと同様に、エクスポーターは、PgBouncerを実行している各ポッドのポート9127 で実行され、Goランタイム接頭辞go_* に関連するメトリックも提供します。

注釈

PgBouncerを実行しているポッドでエクスポートされたメトリックを検査できます。手順については、 エクスポートされたメトリックを検査する方法 を参照してください。正しいIPと`9127` ポートを使用していることを確認します。

この例は、cnpg_pgbouncer メトリックの出力を示しています。

##  HELP cnpg_pgbouncer_collection_duration_seconds Collection time duration in seconds

##  TYPE cnpg_pgbouncer_collection_duration_seconds gauge

cnpg_pgbouncer_collection_duration_seconds{collector="Collect.up"} 0.002338805

##  HELP cnpg_pgbouncer_collection_errors_total Total errors occurred accessing PostgreSQL for metrics.

##  TYPE cnpg_pgbouncer_collection_errors_total counter

cnpg_pgbouncer_collection_errors_total{collector="sql: Scan error on column index 16, name \"load_balance_hosts\": converting NULL to int is unsupported"} 5

##  HELP cnpg_pgbouncer_collections_total Total number of times PostgreSQL was accessed for metrics.

##  TYPE cnpg_pgbouncer_collections_total counter

cnpg_pgbouncer_collections_total 5

##  HELP cnpg_pgbouncer_last_collection_error 1 if the last collection ended with error, 0 otherwise.

##  TYPE cnpg_pgbouncer_last_collection_error gauge

cnpg_pgbouncer_last_collection_error 0

##  HELP cnpg_pgbouncer_lists_databases Count of databases.

##  TYPE cnpg_pgbouncer_lists_databases gauge

cnpg_pgbouncer_lists_databases 1

##  HELP cnpg_pgbouncer_lists_dns_names Count of DNS names in the cache.

##  TYPE cnpg_pgbouncer_lists_dns_names gauge

cnpg_pgbouncer_lists_dns_names 0

##  HELP cnpg_pgbouncer_lists_dns_pending Not used.

##  TYPE cnpg_pgbouncer_lists_dns_pending gauge

cnpg_pgbouncer_lists_dns_pending 0

##  HELP cnpg_pgbouncer_lists_dns_queries Count of in-flight DNS queries.

##  TYPE cnpg_pgbouncer_lists_dns_queries gauge

cnpg_pgbouncer_lists_dns_queries 0

##  HELP cnpg_pgbouncer_lists_dns_zones Count of DNS zones in the cache.

##  TYPE cnpg_pgbouncer_lists_dns_zones gauge

cnpg_pgbouncer_lists_dns_zones 0

##  HELP cnpg_pgbouncer_lists_free_clients Count of free clients.

##  TYPE cnpg_pgbouncer_lists_free_clients gauge

cnpg_pgbouncer_lists_free_clients 49

##  HELP cnpg_pgbouncer_lists_free_servers Count of free servers.

##  TYPE cnpg_pgbouncer_lists_free_servers gauge

cnpg_pgbouncer_lists_free_servers 0

##  HELP cnpg_pgbouncer_lists_login_clients Count of clients in login state.

##  TYPE cnpg_pgbouncer_lists_login_clients gauge

cnpg_pgbouncer_lists_login_clients 0

##  HELP cnpg_pgbouncer_lists_pools Count of pools.

##  TYPE cnpg_pgbouncer_lists_pools gauge

cnpg_pgbouncer_lists_pools 1

##  HELP cnpg_pgbouncer_lists_used_clients Count of used clients.

##  TYPE cnpg_pgbouncer_lists_used_clients gauge

cnpg_pgbouncer_lists_used_clients 1

##  HELP cnpg_pgbouncer_lists_used_servers Count of used servers.

##  TYPE cnpg_pgbouncer_lists_used_servers gauge

cnpg_pgbouncer_lists_used_servers 0

##  HELP cnpg_pgbouncer_lists_users Count of users.

##  TYPE cnpg_pgbouncer_lists_users gauge

cnpg_pgbouncer_lists_users 2

##  HELP cnpg_pgbouncer_pools_cl_active Client connections that are linked to server connection and can process queries.

##  TYPE cnpg_pgbouncer_pools_cl_active gauge

cnpg_pgbouncer_pools_cl_active{database="pgbouncer",user="pgbouncer"} 1

##  HELP cnpg_pgbouncer_pools_cl_active_cancel_req Client connections that have forwarded query cancellations to the server and are waiting for the server response.

##  TYPE cnpg_pgbouncer_pools_cl_active_cancel_req gauge

cnpg_pgbouncer_pools_cl_active_cancel_req{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_cl_cancel_req Client connections that have not forwarded query cancellations to the server yet.

##  TYPE cnpg_pgbouncer_pools_cl_cancel_req gauge

cnpg_pgbouncer_pools_cl_cancel_req{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_cl_waiting Client connections that have sent queries but have not yet got a server connection.

##  TYPE cnpg_pgbouncer_pools_cl_waiting gauge

cnpg_pgbouncer_pools_cl_waiting{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_cl_waiting_cancel_req Client connections that have not forwarded query cancellations to the server yet.

##  TYPE cnpg_pgbouncer_pools_cl_waiting_cancel_req gauge

cnpg_pgbouncer_pools_cl_waiting_cancel_req{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_load_balance_hosts Number of hosts not load balancing between hosts

##  TYPE cnpg_pgbouncer_pools_load_balance_hosts gauge

cnpg_pgbouncer_pools_load_balance_hosts{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_maxwait How long the first (oldest) client in the queue has waited, in seconds. If this starts increasing, then the current pool of servers does not handle requests quickly enough. The reason may be either an overloaded server or just too small of a pool_size setting.

##  TYPE cnpg_pgbouncer_pools_maxwait gauge

cnpg_pgbouncer_pools_maxwait{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_maxwait_us Microsecond part of the maximum waiting time.

##  TYPE cnpg_pgbouncer_pools_maxwait_us gauge

cnpg_pgbouncer_pools_maxwait_us{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_pool_mode The pooling mode in use. 1 for session, 2 for transaction, 3 for statement, -1 if unknown

##  TYPE cnpg_pgbouncer_pools_pool_mode gauge

cnpg_pgbouncer_pools_pool_mode{database="pgbouncer",user="pgbouncer"} 3

##  HELP cnpg_pgbouncer_pools_sv_active Server connections that are linked to a client.

##  TYPE cnpg_pgbouncer_pools_sv_active gauge

cnpg_pgbouncer_pools_sv_active{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_sv_active_cancel Server connections that are currently forwarding a cancel request

##  TYPE cnpg_pgbouncer_pools_sv_active_cancel gauge

cnpg_pgbouncer_pools_sv_active_cancel{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_sv_idle Server connections that are unused and immediately usable for client queries.

##  TYPE cnpg_pgbouncer_pools_sv_idle gauge

cnpg_pgbouncer_pools_sv_idle{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_sv_login Server connections currently in the process of logging in.

##  TYPE cnpg_pgbouncer_pools_sv_login gauge

cnpg_pgbouncer_pools_sv_login{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_sv_tested Server connections that are currently running either server_reset_query or server_check_query.

##  TYPE cnpg_pgbouncer_pools_sv_tested gauge

cnpg_pgbouncer_pools_sv_tested{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_sv_used Server connections that have been idle for more than server_check_delay, so they need server_check_query to run on them before they can be used again.

##  TYPE cnpg_pgbouncer_pools_sv_used gauge

cnpg_pgbouncer_pools_sv_used{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_pools_sv_wait_cancels Servers that normally could become idle, but are waiting to do so until all in-flight cancel requests have completed that were sent to cancel a query on this server.

##  TYPE cnpg_pgbouncer_pools_sv_wait_cancels gauge

cnpg_pgbouncer_pools_sv_wait_cancels{database="pgbouncer",user="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_bind_count Average number of prepared statements readied for execution by clients and forwarded to PostgreSQL by pgbouncer.

##  TYPE cnpg_pgbouncer_stats_avg_bind_count gauge

cnpg_pgbouncer_stats_avg_bind_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_client_parse_count Average number of prepared statements created by clients.

##  TYPE cnpg_pgbouncer_stats_avg_client_parse_count gauge

cnpg_pgbouncer_stats_avg_client_parse_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_query_count Average queries per second in last stat period.

##  TYPE cnpg_pgbouncer_stats_avg_query_count gauge

cnpg_pgbouncer_stats_avg_query_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_query_time Average query duration, in microseconds.

##  TYPE cnpg_pgbouncer_stats_avg_query_time gauge

cnpg_pgbouncer_stats_avg_query_time{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_recv Average received (from clients) bytes per second.

##  TYPE cnpg_pgbouncer_stats_avg_recv gauge

cnpg_pgbouncer_stats_avg_recv{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_sent Average sent (to clients) bytes per second.

##  TYPE cnpg_pgbouncer_stats_avg_sent gauge

cnpg_pgbouncer_stats_avg_sent{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_server_parse_count Average number of prepared statements created by pgbouncer on a server.

##  TYPE cnpg_pgbouncer_stats_avg_server_parse_count gauge

cnpg_pgbouncer_stats_avg_server_parse_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_wait_time Time spent by clients waiting for a server, in microseconds (average per second).

##  TYPE cnpg_pgbouncer_stats_avg_wait_time gauge

cnpg_pgbouncer_stats_avg_wait_time{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_xact_count Average transactions per second in last stat period.

##  TYPE cnpg_pgbouncer_stats_avg_xact_count gauge

cnpg_pgbouncer_stats_avg_xact_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_avg_xact_time Average transaction duration, in microseconds.

##  TYPE cnpg_pgbouncer_stats_avg_xact_time gauge

cnpg_pgbouncer_stats_avg_xact_time{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_bind_count Total number of prepared statements readied for execution by clients and forwarded to PostgreSQL by pgbouncer

##  TYPE cnpg_pgbouncer_stats_total_bind_count gauge

cnpg_pgbouncer_stats_total_bind_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_client_parse_count Total number of prepared statements created by clients.

##  TYPE cnpg_pgbouncer_stats_total_client_parse_count gauge

cnpg_pgbouncer_stats_total_client_parse_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_query_count Total number of SQL queries pooled by pgbouncer.

##  TYPE cnpg_pgbouncer_stats_total_query_count gauge

cnpg_pgbouncer_stats_total_query_count{database="pgbouncer"} 15

##  HELP cnpg_pgbouncer_stats_total_query_time Total number of microseconds spent by pgbouncer when actively connected to PostgreSQL, executing queries.

##  TYPE cnpg_pgbouncer_stats_total_query_time gauge

cnpg_pgbouncer_stats_total_query_time{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_received Total volume in bytes of network traffic received by pgbouncer.

##  TYPE cnpg_pgbouncer_stats_total_received gauge

cnpg_pgbouncer_stats_total_received{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_sent Total volume in bytes of network traffic sent by pgbouncer.

##  TYPE cnpg_pgbouncer_stats_total_sent gauge

cnpg_pgbouncer_stats_total_sent{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_server_parse_count Total number of prepared statements created by pgbouncer on a server.

##  TYPE cnpg_pgbouncer_stats_total_server_parse_count gauge

cnpg_pgbouncer_stats_total_server_parse_count{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_wait_time Time spent by clients waiting for a server, in microseconds.

##  TYPE cnpg_pgbouncer_stats_total_wait_time gauge

cnpg_pgbouncer_stats_total_wait_time{database="pgbouncer"} 0

##  HELP cnpg_pgbouncer_stats_total_xact_count Total number of SQL transactions pooled by pgbouncer.

##  TYPE cnpg_pgbouncer_stats_total_xact_count gauge

cnpg_pgbouncer_stats_total_xact_count{database="pgbouncer"} 15

##  HELP cnpg_pgbouncer_stats_total_xact_time Total number of microseconds spent by pgbouncer when connected to PostgreSQL in a transaction, either idle in transaction or executing queries.

##  TYPE cnpg_pgbouncer_stats_total_xact_time gauge

cnpg_pgbouncer_stats_total_xact_time{database="pgbouncer"} 0

注釈

メトリックをより深く理解するには、PgBouncerのドキュメントを参照してください。

クラスターに関しては、 Prometheus operator's を使用して特定のプーラーを監視できます

PodMonitor

次の基本的な例を使用して、特定のプーラーにPodMonitor を展開し、必要に応じて変更できます。

apiVersion: monitoring.coreos.com/v1
kind: PodMonitor
metadata:
  name: <POOLER_NAME>
spec:
  selector:
    matchLabels:
      cnpg.io/poolerName: <POOLER_NAME>
  podMetricsEndpoints:
  - port: metrics

PodMonitor 自動作成の非推奨

現在この機能を使用している場合、 .spec.monitoring.enablePodMonitor を削除またはfalse に設定し、上記のようにプーラーのPodMonitor リソースを手動で作成することを強くお勧めします。この変更により、監視構成の完全な所有権が保証され、オペレーターによって管理または上書きされるのを防ぎます。

ロギング

ログは、次の例のように、JSON形式で標準出力に直接送信されます。

{
  "level": "info",
  "ts": SECONDS.MICROSECONDS,
  "msg": "record",
  "pipe": "stderr",
  "record": {
    "timestamp": "YYYY-MM-DD HH:MM:SS.MS UTC",
    "pid": "<PID>",
    "level": "LOG",
    "msg": "kernel file descriptor limit: 1048576 (hard: 1048576); max_client_conn: 100, max expected fd use: 112"
  }
}

接続の一時停止

Pooler 仕様では、宣言的構成のみを使用して、PgBouncerのPAUSE およびRESUME コマンドを利用できます。 paused オプションを使用してこれを行うことができます。デフォルトではfalse に設定されています。 true に設定すると、オペレーターはPgBouncerのPAUSE コマンドを内部的に呼び出します。

  1. クエリが完了するのを待った後、PostgreSQLサーバーへのアクティブな接続をすべて閉じます。

  2. クライアントからの新しい接続を一時停止します

paused オプションがfalse にリセットされると、オペレーターはPgBouncerでRESUME コマンドを呼び出し、Pooler リソースで定義されたPostgreSQLサービスへのタップを再度開きます。

注釈

詳細については、 PAUSE を参照してください。

注釈

将来のバージョンでは、スイッチオーバー操作はPgBouncerプーラーと完全に統合され、 PAUSE / RESUME 機能を利用して、クライアントアプリケーションによる知覚的なダウンタイムを削減します。現在、 paused 属性を`true` に設定し、 postgresql.cnpg.io/v1 を介してswitchoverコマンドを発行し、 paused 属性を`false` に復元することにより、同じ結果を得ることができます。

制限事項

単一のPostgreSQLクラスター

プーラーの現在の実装は、特定のCloudNativePGクラスターサービスの一部として動作するように設計されています。現在、複数のクラスターにまたがるプーラーを作成することはできません。

制御された構成可能性

CloudNativePGは、PgBouncerレイヤーがPostgreSQLと通信するために使用されるいくつかの構成オプションを透過的に管理します。このようなオプションは外部から構成できず、TLS証明書、認証設定、databases セクション、およびusers セクションが含まれます。また、単一のPostgreSQLクラスターの特定のユースケースを考慮して、採用される基準は、ユーザーが構成できるオプションを明示的にリストすることです。

注釈

採用されたソリューションは、大部分のユースケースに対応すると考えられます。これにより、PgBouncerの別のオペレーターを将来的に実装して、より高度なカスタマイズされたシナリオでガンマを完了する余地が残されています。