Snowflake Postgres接続プーリング

接続プールは、再利用できるデータベース接続のキャッシュです。クライアントからのリクエストを受信すると、そのリクエストまたはトランザクションに対してプールから利用可能な接続が与えられます。

対照的に、接続プーリングがない場合、クライアントはデータベースに到達して接続を確立する必要があります。新しい接続を開くと、可用性とパフォーマンスに影響する可能性があります。 PostgreSQL では、サーバーが新しいプロセスを「フォーク」するか、作成するので、利用可能なリソースを使い果たすだけでなく、新しい接続の確立を妨げる可能性があります。接続プーリングは、これらの問題を軽減し、アプリケーションをスケーリングできるようにします。

接続プーリングは必要ですか?

接続プーリングは、アプリケーションから多数の接続がある場合に特に役立ちます。この接続は多くの場合、クライアント側のプール内、またはウェブサーバーからの複数のスレッド/プロセスを介して発生します。

Snowflake Postgresインスタンスで次のクエリを実行すると、接続プーリングのメリットがあるかどうかを判断できます。

SELECT count(*),
       state
FROM pg_stat_activity
GROUP BY 2;
Copy
 count |             state
-------+-------------------------------
     7 | active
    69 | idle
    26 | idle in transaction
    11 | idle in transaction (aborted)
(4 rows)

アクティブな接続と比較してアイドル接続の数が多い場合は、接続プーリングの使用を強くお勧めします。

PgBouncer による接続プーリング

Snowflake Postgresは接続プーリングに pgBouncer を使用します。 PgBouncer はデフォルトですべてのSnowflake Postgresインスタンスで使用できるため、独自の「仮想」接続でネイティブPostgres接続を多重化することで、接続管理が容易になります。デフォルトでは、Snowflake Postgresの PgBouncer インスタンスは、トランザクションプーリングモードで実行されます。

ただし、 PgBouncer サービスを使用するためには、 snowflake_pooler 拡張機能をインストールして、使用したい各データベースで1つ追加の手順を実行する必要があります。

snowflake_pooler 拡張機能を使用した PgBouncer のアクティブ化

snowflake_admin Postgresユーザーは、データベースで次を実行して snowflake_pooler 拡張機能をインストールします。

CREATE EXTENSION snowflake_pooler;
Copy

snowflake_pooler とは何ですか?

snowflake_poolersnowflake_pooler というユーザーを作成する単純な拡張機能です。このユーザーは、 PgBouncer に受信接続を認証させる user_lookup と呼ばれる単一の関数にアクセスできます。このように、クライアントが PgBouncer に接続すると、Postgresの正規ユーザーストアをクエリすることで、クライアントの認証情報が有効かどうかを確認できます。

注釈

snowflake_pooler 拡張機能は、 PgBouncer を介して接続する各データベースに個別にインストールする必要があります。snowflake_pooler がインストールされていない場合、次のようなエラーが表示されることがあります。

failed: FATAL: bouncer config error

エラーを解決するには、データベースに接続して CREATE EXTENSION snowflake_pooler; を実行します。

PgBouncer への接続

クライアントは、通常の5432ではなく、ポート5431以外の、メインのPostgresデータベースに使用するのと同じ接続文字列を使用して PgBouncer に接続します。

psql postgres://my_application_user:my_application_password@p.43lmodgbqvdmlpbjirv22dfciu.db.postgresbridge.com:5431/mydb
Copy

スーパーユーザーまたは複製権限が ない ロールのみが、 PgBouncer を介して接続できます。application ロール(チームメンバーのために作成された個別のユーザーロール)または作成したカスタムユーザーロール(たとえば、 CREATE ROLE Postgresコマンドを使用して作成したもの)を使用して PgBouncer へ接続できます。ただし、 snowflake_pooler によって作成された user_lookup 関数は、スーパーユーザーと複製ロールの検索を拒否します。Snowflake PostgresでのPostgresユーザーとロールの詳細については、 Snowflake Postgresのロール をご参照ください。

Tip

Postgresの「ユーザー」と「ロール」という用語は、ほぼ同義です。1つの小さな違いは( CREATE ROLE に対して) CREATE USER が LOGIN 属性(例: CREATE ROLE myuser LOGIN; )を意味していることです。

プーリングモード

PgBouncer はトランザクション、セッション、ステートメントの3つの異なるプーリングモードをサポートします。 以下ではそれぞれについて簡潔に説明し、 PgBouncer ドキュメント で詳しく説明します。

トランザクション

Snowflake Postgresインスタンスはデフォルトでトランザクションプーリングモードで PgBouncer を実行します。これは、そのモードがほとんどの人に推奨されるためです。

注釈

PgBouncer がトランザクションプーリングモードの時、 PREPARE を使用して作成され、異なるトランザクションで EXECUTE を使用して実行される SQL レベルの準備済みステートメントは、異なるサーバー接続で実行される可能性があるため、機能しません。ただし、アプリケーションのPostgresドライバーがサポートしている場合は、 PgBouncer はプロトコルレベルの準備済みトランザクションをサポートします。 PgBouncer によるこの処理方法の詳細については、 max_prepared_statements ドキュメントをご参照ください。

プロトコルレベルの準備済みステートメントに PgBouncer のサポートを使用するには、 PgBouncer max_prepared_statements設定0 より大きい値に設定されている必要があります。Snowflake Postgresのデフォルトは 250 ですが、必要に応じて別の値に設定できます。

セッション

セッションプーリングモードは、必要な場合にSnowflake Postgresでサポートされます。このプーリングモードを使用するには、 pool_mode設定 をクラスター上の session に設定します。

ステートメント

ステートメントプーリングモードも利用できます。ただし、複数ステートメントトランザクションはエラーをスローすることに注意してください。このプーリングモードを使用するには、 pool_mode設定 をクラスター上の statement に設定します。

PgBouncer の無効化

snowflake_pooler 拡張機能をデータベースからドロップすると、 PgBouncer は認証できなくなるため機能的に無効になります。

DROP EXTENSION snowflake_pooler;
Copy