どのシステムでも、パフォーマンスは常に重要です。可能な限り最高の応答時間を確保するには、利用可能なリソースを十分に活用する必要があります。これを行うには、さまざまな方法があります。データベースへのすべての接続はリソースを消費するため、これらの方法の1つは、アプリケーションとデータベースの間に適切な接続マネージャーを配置することです。このブログでは、PostgreSQLの接続プールであるpgBouncerについて説明し、これを実装してPostgreSQLのパフォーマンスを向上させる方法を示します。
システムのトラフィックによっては、データベースの負荷を軽減してパフォーマンスを向上させる外部ツールを追加すると便利な場合があります。多分それは十分ではありませんが、それは良い出発点です。このため、接続プールを実装することをお勧めします
接続プールは、接続のプールを作成して再利用する方法であり、データベースへの新しい接続を常に開くことを回避します。これにより、アプリケーションのパフォーマンスが大幅に向上します。 PgBouncerは、PostgreSQL用に設計された人気のある接続プールです。
PgBouncerのしくみ
PgBouncerはPostgreSQLサーバーとして機能するため、PgBouncer情報(IPアドレス/ホスト名とポート)を使用してデータベースにアクセスするだけで、PgBouncerはPostgreSQLサーバーへの接続を作成します。存在する場合は再利用します。
PgBouncerは接続を受信すると、構成ファイルで指定された方法に応じて認証を実行します。 PgBouncerは、PostgreSQLサーバーがサポートするすべての認証メカニズムをサポートします。この後、PgBouncerは、同じユーザー名とデータベースの組み合わせで、キャッシュされた接続をチェックします。キャッシュされた接続が見つかった場合は、クライアントに接続を返します。見つからなかった場合は、新しい接続を作成します。 PgBouncerの構成とアクティブな接続の数によっては、新しい接続が作成されるか、中止されるまでキューに入れられる可能性があります。
PgBouncerの動作は、構成されているプーリングモードによって異なります。
-
セッションプーリング(デフォルト):クライアントが接続すると、サーバー接続が全体に割り当てられますクライアントが接続を維持している期間。クライアントが切断すると、サーバー接続はプールに戻されます。
-
トランザクションプーリング:サーバー接続は、トランザクション中にのみクライアントに割り当てられます。 PgBouncerがトランザクションの終了に気付くと、サーバー接続はプールに戻されます。
-
ステートメントプーリング:サーバー接続は、クエリが完了した直後にプールに戻されます。このモードでは、マルチステートメントトランザクションが機能しなくなるため、許可されません。
ClusterControlを使用してPgBouncerを実装する方法
このため、PostgreSQLクラスターが稼働していて、ClusterControlを使用して管理していることを前提としています。それ以外の場合は、このブログ投稿に従ってPostgreSQLを高可用性に簡単にデプロイできます。
>ClusterControlに移動->PostgreSQLCluster-> Cluster Actions-> Add LoadBalancer->PgBouncerを選択します。そこで、選択したデータベースノードにデプロイされる新しいPgBouncerノードをデプロイしたり、既存のPgBouncerノードをインポートしたりすることもできます。
IPアドレスまたはホスト名、リッスンポート、およびPgBouncerを指定する必要があります資格情報。 Deploy PgBouncerを押すと、ClusterControlはノードにアクセスし、手動で介入することなくすべてをインストールおよび構成します。
ClusterControlアクティビティセクションで進行状況を監視できます。終了したら、新しいプールを作成する必要があります。これを行うには、ClusterControl->PostgreSQLクラスターの選択->ノード->PgBouncerノードに移動します。
ここで、次の情報を追加する必要があります:
-
PgBouncerホスト名:接続プールを作成するノードホストを選択します。
-
プール名:プール名とデータベース名は同じである必要があります。
-
ユーザー名:PostgreSQLプライマリノードからユーザーを選択するか、新しいユーザーを作成します。
-
プールモード:前述のモードの1つにすることができます:セッション(デフォルト)、トランザクション、またはステートメントプーリング。
-
プールサイズ:このデータベースのプールの最大サイズ。デフォルト値は20です。
-
データベース接続の最大数:データベース全体の最大数を構成します。デフォルト値は0で、無制限を意味します。
これで、ノードセクションにプールが表示されるはずです。
これは基本的なトポロジです。たとえば、ロードバランサノードを複数追加して単一障害点を回避したり、「キープアライブ」などのツールを使用して可用性を確保したりするなど、改善できます。 ClusterControlを使用して実行することもできます。
PgBouncerを接続プールとして使用することは、データベースのパフォーマンスを向上させ、サーバーで使用可能なリソースを適切に使用するための優れた方法です。
PgBouncer + HAProxyの組み合わせを使用して、PostgreSQLクラスターの高可用性を実現することにより、このトポロジを改善することもできます。これらはすべて、同じClusterControlUIから実行できます。