Snowflake Postgres接続プーリング¶
接続プールは、再利用できるデータベース接続のキャッシュです。クライアントからのリクエストを受信すると、そのリクエストまたはトランザクションに対してプールから利用可能な接続が与えられます。
対照的に、接続プーリングがない場合、クライアントはデータベースに到達して接続を確立する必要があります。新しい接続を開くと、可用性とパフォーマンスに影響する可能性があります。 PostgreSQL では、サーバーが新しいプロセスを「フォーク」するか、作成するので、利用可能なリソースを使い果たすだけでなく、新しい接続の確立を妨げる可能性があります。接続プーリングは、これらの問題を軽減し、アプリケーションをスケーリングできるようにします。
接続プーリングは必要ですか?¶
接続プーリングは、アプリケーションから多数の接続がある場合に特に役立ちます。この接続は多くの場合、クライアント側のプール内、またはウェブサーバーからの複数のスレッド/プロセスを介して発生します。
Snowflake Postgresインスタンスで次のクエリを実行すると、接続プーリングのメリットがあるかどうかを判断できます。
SELECT count(*),
state
FROM pg_stat_activity
GROUP BY 2;
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;
snowflake_pooler とは何ですか?¶
snowflake_pooler は snowflake_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
スーパーユーザーまたは複製権限が ない ロールのみが、 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;