**Cette page a été importée automatiquement de notre ancien wiki mais n'a pas encore été révisée.**

## PgBouncer

<https://wiki.postgresql.org/wiki/PgBouncer>

PgBouncer agit en tant que proxy entre des clients et un ou des serveurs PostgreSQL. Il permet de gérer un pool de connexion et est donc utile lorsque le client ne gère pas soit même son pool, notamment dans le cas de PHP.

Pour PostgreSQL, accepter une nouvelle connexion est très coûteux en terme de ressource car il va forquer un nouveau processus. PgPouncer permet donc de maintenir un pool de connexions actives auprès de PostgreSQL et de les rendre disponibles pour les clients voulant se connecter. PgBouncer a été conçu pour être très peu consommateur de ressources et pouvoir accepter un grand nombre de connexions (pas de fork ni de thread à chaque connexion, programmation évènementielle comme Nginx).

### Installation

~~~
# aptitude install pgbouncer
~~~

### Configuration

La configuration se fait dans le fichier _/etc/pgbouncer/pgbouncer.ini_.

* La section _[databases]_ doit contenir la liste des bases de données sur
    lesquelles les clients pourront se connecter, avec une chaine de connexion
    valide.

    Par exemple :

~~~
[databases]
remotedb = dbname=db host=192.0.2.42 port=5433

* =
~~~
    
    Les connexions sur la base _remotedb_ seront renvoyées à l'hôte
    192.0.2.42 sur le port 5433 et sur la base _db_. Toutes les autres seront
    renvoyées en local sur la base initialement demandée dans la requête.
* La section _[pgbouncer]_ contient différents paramètres pour le fonctionnement de PgBouncer. Les paramètres importants à modifier sont :
* _pool_mode_ : permet de définir quand une connexion peut être
      réattribuée (_session_ dans le cas d'une déconnexion explicite du
      client (peu de gain de performance mais permet d'être complètement
      transparent pour le client), _transaction_ lorsqu'une transaction est
      terminée, _statement_ lorsque une requête est terminée (les
      transactions ne peuvent alors plus être utilisées)) ;
* _max_client_conn_ : le nombre total de client qui peuvent être connectés simultanément à PgBouncer. Exemple : 5000
* _default_pool_size_ : le nombre total de client qui peuvent être connectés simultanément au serveur PostgreSQL derrière. Il ne faut pas dépasser le _max_connections_ du serveur en question moins une vingtaine (pour les connexions réservées au superadmin). Si _default_pool_size_ est dépassé (mais pas _max_client_conn_), alors les nouvelles connexions seront mises en attente.

userlist.txt

### Monitoring et administration

#### Connexion à la console pgbouncer

Une des fonctionnalités très intéressante de PgBouncer est de pouvoir s'y connecter avec le client `psql` est d'exécuter des pseudos requêtes SQL :

~~~
# psql -p 6432 -U pgbpostgres pgbouncer
psql (9.2.4, server 1.5.4/bouncer)
WARNING: psql version 9.2, server version 1.5.
         Some psql features might not work.
Type "help" for help.

pgbouncer=# 
~~~

La requêtes `SHOW HELP;` permet de lister les requêtes possibles.

#### Voir les statistiques, connexions établies, etc…

~~~
pgbouncer# show pools;
~~~

~~~
pgbouncer# show clients;
~~~

~~~
pgbouncer# show servers;
~~~

~~~
pgbouncer# show stats;
~~~

#### Opérations d'administration

À tester et documenter

### FAQ

* *Je vois un pic de connexions qui sont mises en attentant (_client_waiting_), alors que le _default_pool_size_ est loin d'être dépassé, pourquoi ?*

  C'est dû au fonctionnement de PgBouncer : si il reçoit un pic de demande de
  connexion, afin de ne pas répercuter ce pic sur le backend PostgreSQL, il va
  ouvrir ses connexions les une après les autres.