3

PGBouncer をセットアップし、postgres DB に接続するように構成しましたが、すべて正常に接続されていますが、実際に機能しているかどうかはわかりません。

デーモンとして実行され、beanstalk ジョブを取得する php スクリプトがあります。問題は、システム上の個別のユーザー/アクションごとに、postgres への新しい接続を開き、その接続をアイドル状態のままにすることです。これは、デーモンが実際に実行を停止しないため、接続が終了しないためです (これに対する簡単な修正は、スクリプトループの最後に接続しますが、多くの接続では非効率になります)。

とにかく、これによりpostgresは最終的に接続を使い果たし、ロックアップしました...

したがって、PGBouncer が答えのようです。

しかし、今それを実行すると、ps ax | を実行すると、同じ db 接続が複数回表示されます。ポストグルをgrepします。

PGBouncer は、DB への接続を 1 つだけ開いて、その接続を介してすべてのトラフィックをルーティングすることになっていませんか? 接続が満杯の場合は、新しい接続を開きますか?

現在、1 つのデータベース接続 (アクセス制御システム) に 3 つ、他のデータベース (クライアント固有のデータ) に 2 つ持っています。

私には、これらの変更をロールアウトすると、接続が解放されないために接続が再び食い尽くされるという同じ問題に直面するように感じます.

誰かがアドバイスを提供するのに十分な説明があることを願っています。

4

1 に答える 1

2

ここでの重要なステップは、スクリプトを修正して、完了時に接続を解放することだと思われます。これを行うと、PgBouncerは接続のセットアップ/ティアダウンのオーバーヘッドを削減するのに役立ちますが、接続プールモードでは、他の方法よりも多くのPgへの接続を維持することはできません。

ただし、トランザクションプーリングモードでPgBouncerを使用することもできます。トランザクションプーリングに使用される場合、PgBouncerはアイドル状態のバックエンドトランザクションのプールを保持し、クライアントがを実行するときにのみそれらを割り当てますBEGINCOMMITクライアントがまたはを実行した後、接続はプールに返されますROLLBACK。つまり、トランザクションプーリングモードでは、PgBouncerへの多数のオープン接続を使用できます。それらのほとんどが任意の時点でアイドル状態であり、トランザクションが開いていない限り、それぞれにPostgreSQLバックエンドへの対応する接続​​は必要ありません。

トランザクションプーリングモードの唯一の本当の欠点は、SETセッションレベルの変数を期待するアプリケーションを壊したり、トランザクション間でプリペアドステートメントを保持したりすることです。アプリケーションは、たとえばを使用するために変更が必要になる場合がありますSET LOCAL

于 2012-11-13T07:46:34.697 に答える