接続プーリングを使用する
Lakebaseオートスケールは、オートスケールコンピュート、ゼロへのスケール、分岐、即時復元を備えたLakebaseの最新バージョンです。 サポートされているリージョンについては、 「リージョンの提供状況」を参照してください。Lakebaseプロビジョニング ユーザーの場合は、 Lakebaseプロビジョニング」を参照してください。
Lakebaseは、サーバー接続のプールを維持し、それらを多くのクライアント接続間で共有する PgBouncer 接続プーラーが組み込まれています。 プーラーは最大 10,000 の接続をサポートしており、 レス関数、Web APIs 、および多数の短命な接続を開くその他のアプリケーションに適しています。
コネクションプーリングには、Postgresネイティブのパスワード認証が必要です。OAuthまたはDatabricksのIDロールでは利用できません。
接続プーリングの仕組み
PostgreSQLはクライアントごとに個別のプロセスを作成するため、PostgreSQLへの接続ごとにサーバーリソースが消費されます。Web APIsや レス関数など、短時間の接続を多数開くアプリケーションは、サーバーの接続制限をすぐに使い果たしてしまう可能性があります。
コネクションプーラーは、アプリケーションとPostgreSQLの間に位置します。クライアントはプーラーに接続し、プーラーはクエリをより小規模な実際のサーバー接続プールに転送します。トランザクションが完了すると、プーラーはサーバー接続をプールに返し、次のクライアントが利用できるようにします。
LakebaseはPgBouncerをトランザクションモードで実行します。トランザクションモードでは、サーバー接続は単一のトランザクションの期間中保持され、その後プールに戻されます。これにより、多くのクライアントが少数のサーバー接続を共有できます。
トランザクションモードは接続効率を向上させますが、永続的なサーバー接続を必要とする一部のPostgres機能を制限します。トランザクションモードの制限事項を参照してください。
接続プール
PgBouncerは、データベースとユーザーの組み合わせごとに個別のプールを作成します。同じデータベースに接続する2人のユーザーは、それぞれ独立したプールを割り当てられます。各プールのサイズはコンピュートの直接接続制限の約 90% です。
プール内のすべての接続が使用中の場合、新しいクライアントからのリクエストはキューで待機します。サーバーへの接続が2分以内に確立されない場合、クライアントはタイムアウトエラーを受け取ります。
接続制限
接続プーリングには3つの制限があります。
上限 | Value | それが制御するもの |
|---|---|---|
クライアント接続数( | 10,000 | アプリケーションからPgBouncerへの最大接続数 |
プールサイズ( | 約90% | ユーザーとデータベースのペアごとのアクティブなサーバー接続数 |
直接接続( | コンピュートサイズにより異なります | 最大直接Postgres接続数 |
直接接続の制限はコンピュートのサイズによって異なります。 たとえば、8 CU コンピュートは 1,678 の直接接続をサポートし、16 CU コンピュートは 3,357 の直接接続をサポートします。 完全なリストについては、 「コンピュート仕様」を参照してください。
接続プーリングを使用すると、アプリケーションは直接接続の制限だけではサポートできないほど多くの ユーザーをサポートできます。
前提条件
- Lakebaseオートスケール プロジェクトがアクティブである必要があります。
- プロジェクトには、ネイティブのPostgresパスワードロールが必要です。手順については、 「ネイティブPostgresパスワードロールを作成する」を参照してください。
- 読み取り専用プーラーを使用するには、 読み取り専用コンピュートインスタンスへのアクセスを許可する機能 が有効になっている高可用性エンドポイントが必要です。 高可用性を参照してください。
接続プーリングを有効にする
- Lakebaseアプリで、プロジェクトに移動して 「接続」 をクリックします。
- 接続したいブランチとコンピュートを選択します。
- 「役割」 ドロップダウンメニューから、ネイティブのPostgresパスワードロールを選択します。 接続プーリングの切り替え ボタンは、パスワードロールが選択されている場合にのみ表示されます。OAuthおよびDatabricksのIDロールでは非表示になっています。
- 接続プーリング を有効にします。
- 接続文字列をコピーして、アプリケーションで使用してください。

接続文字列の形式
プーラー接続文字列は、直接データベース接続とは異なるホスト名を使用します。
Type | ホスト名の形式 | いつ使用するか |
|---|---|---|
読み書きプーラー |
| 書き込みおよび読み取りトラフィックはすべてプーラーを経由してルーティングされます |
読み取り専用プーラー |
| 読み取り専用トラフィック。読み取りアクセスが有効になっている高可用性エンドポイントが必要です。 |
どちらのプーラータイプもポート5432を使用します。
Lakebaseアプリの 接続 ダイアログからプーラー接続文字列を直接コピーして、エンドポイント、リージョン、クラウドに対応する正しいホスト名を取得してください。
取引モードの制限
コネクションプーラーを使用する場合、以下のPostgres機能は利用できません。
-
SQL レベルのプリペアド ステートメント :
PREPAREおよびDEALLOCATEステートメントはトランザクション モードではサポートされていません。ドライバレベルのプリペアドステートメント(psycopg2、node-postgres、JDBC、および同様のライブラリが内部的に使用するもの)は、PgBouncerのプロトコルレベルのサポートを通じて正しく動作します。JDBCの場合、プリペアドステートメントに関連するエラーが表示される場合は、prepareThreshold=0を設定して、名前付きサーバー側プリペアドステートメントのキャッシュを無効にしてください。 -
セッションレベルの設定 :
SETコマンドはトランザクション間で保持されません。これは、各トランザクションが異なるサーバー接続を使用する可能性があるためです。例えば:SQLBEGIN;
SET search_path TO myschema;
SELECT * FROM mytable; -- works in this transaction
COMMIT;
-- connection returns to pool after COMMIT
SELECT * FROM mytable; -- ERROR: relation "mytable" does not exist設定を永続的に適用するには、代わりに
ALTER ROLEを使用してください。SQLALTER ROLE myrole SET search_path TO myschema, public; -
セッション保持一時テーブル :トランザクションをまたいで保持される一時テーブルは利用できません。プールに戻された接続は、次のトランザクションで別のクライアントに割り当てられる可能性があります。
-
WITH HOLDカーソル :WITH HOLDで宣言されたカーソルは永続的な接続を必要とし、サポートされていません。 -
アドバイザリロック :PgBouncerはアドバイザリロックをサポートしていません。アドバイザリロックには永続的なサーバー接続が必要ですが、トランザクションモードではそれが利用できません。
-
LISTEN/NOTIFY: サポートされていません。パブリッシュ/サブスクライブ型のメッセージングを必要とするアプリケーションには、直接接続(プール接続ではない)を使用してください。 -
pg_dumpおよびスキーマ移行 :pg_dump、スキーマ移行、およびセッションレベルの状態に依存するその他のツールには、直接接続を使用します。
セッションレベルのPostgres機能を必要とするアプリケーションの場合は、 接続プーリングの 切り替えを有効にせずに、 [接続] ダイアログから直接接続文字列を使用してください。
次のステップ
- 接続文字列 : 直接接続のための接続文字列形式のリファレンス。 接続文字列を参照してください。
- Postgresロールの作成 :接続プーリングに必要なネイティブPostgresパスワードロールを作成する方法。PostgreSQLロールの作成を参照してください。
- 認証について :OAuth認証とパスワード認証方式の比較。認証についてを参照してください。