Pooling de connexions Snowflake Postgres¶
Un pool de connexions est un cache de connexions à la base de données qui peuvent être réutilisées. Lorsqu’une requête provient d’un client, une connexion disponible du pool est donnée pour cette requête ou cette transaction.
En revanche, sans aucun pooling de connexions, le client doit contacter la base de données pour établir une connexion. L’ouverture de nouvelles connexions peut avoir des conséquences sur la disponibilité et les performances : dans PostgreSQL, le serveur « dévie » ou crée un nouveau processus, ce qui peut épuiser les ressources disponibles et empêcher l’établissement de nouvelles connexions. Le pooling de connexions permet de limiter ces problèmes et de garantir la mise à l’échelle de vos applications.
Ai-je besoin d’un pooling de connexions ?¶
Le pooling de connexions est particulièrement utile lorsque votre application génère un nombre élevé de connexions, souvent dans un pool côté client ou via plusieurs threads/processus depuis votre serveur Web.
Vous pouvez exécuter la requête suivante sur votre instance Snowflake Postgres afin de déterminer si vous pouvez tirer parti du pooling de connexions :
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)
Si vous constatez un nombre élevé de connexions inactives par rapport aux connexions actives, l’utilisation du pooling de connexions est fortement recommandée.
Pooling de connexions avec PgBouncer¶
Snowflake Postgres utilise pgBourer pour le pooling de connexions. PgBouncer est disponible par défaut sur toutes les instances Snowflake Postgres pour faciliter la gestion des connexions en multiplexant les connexions Postgres natives sur ses propres connexions « virtuelles ». Par défaut, les instances PgBouncer sur Snowflake Postgres sont exécutées en mode pooling de transactions.
Toutefois, pour pouvoir utiliser le service PgBouncer, vous devez suivre une étape supplémentaire sur chaque base de données sur laquelle vous souhaitez l’utiliser en installant l’extension snowflake_pooler.
Activation de PgBouncer avec l’extension snowflake_pooler¶
En tant qu’utilisateur Postgres snowflake_admin, exécutez ce qui suit dans la base de données pour installer l’extension snowflake_pooler :
CREATE EXTENSION snowflake_pooler;
Qu’est-ce que snowflake_pooler ?¶
snowflake_pooler est une simple extension qui crée un utilisateur appelé snowflake_pooler. Cet utilisateur a accès à une seule fonction appelée user_lookup, qui permet à PgBouncer d’authentifier les connexions entrantes. De cette façon, lorsqu’un client établit une connexion à PgBouncer, il peut vérifier si les identifiants de connexion du client sont valides en interrogeant le magasin d’utilisateurs canoniques Postgres.
Note
L’extension snowflake_pooler doit être installée individuellement dans chaque base de données où vous souhaitez vous connecter via PgBouncer. Si snowflake_pooler n’a pas été installé, vous pouvez recevoir une erreur du type suivant :
failed: FATAL: bouncer config error
Pour résoudre cette erreur, connectez-vous à la base de données et exécutez : CREATE EXTENSION snowflake_pooler;.
Connexion à PgBouncer¶
Les clients se connecteront à PgBouncer en utilisant la même chaîne de connexion que celle utilisée pour la base de données principale Postgres, sauf qu’ils utiliseront le port 5431 à la place du port 5432 habituel :
psql postgres://my_application_user:my_application_password@p.43lmodgbqvdmlpbjirv22dfciu.db.postgresbridge.com:5431/mydb
Seuls les rôles sans privilèges de super-utilisateur ou de réplication pourront se connecter via PgBouncer. Vous pouvez choisir de vous connecter à PgBouncer en utilisant le rôle application, un rôle d’utilisateur individuel créé pour les membres de l’équipe, ou tout rôle d’utilisateur personnalisé que vous avez pu créer (par exemple, en utilisant la commande Postgres CREATE ROLE). Cependant, la fonction user_lookup créée par snowflake_pooler refusera les recherches sur les super-utilisateurs et les rôles de réplication. Consultez Rôles Snowflake Postgres pour en savoir plus sur les utilisateurs et les rôles Postgres dans Snowflake Postgres.
Astuce
Les termes « utilisateur » et « rôle » dans Postgres sont en grande partie synonymes. Une différence mineure est que CREATE USER (versus CREATE ROLE) implique l’attribut LOGIN, par exemple CREATE ROLE myuser LOGIN;.
Modes de pooling¶
PgBouncer prend en charge trois modes de pooling différents : transactions, sessions et instructions. Chaque mode est détaillé brièvement ci-dessous et plus loin dans la documentation PgBouncer.
Transaction¶
Les instances Snowflake Postgres exécuteront PgBouncer en mode pooling de transactions par défaut, car il s’agit du mode que nous recommandons à la plupart des utilisateurs d’utiliser.
Note
Lorsque PgBouncer est en mode pooling de transactions, les instructions préparées au niveau de SQL créées avec PREPARE et exécutées avec EXECUTE dans différentes transactions ne fonctionneront pas, car elles peuvent s’exécuter sur différentes connexions de serveur. PgBouncer prend toutefois en charge les transactions préparées au niveau du protocole si le pilote Postgres de l’application les prend en charge. Pour plus de détails sur la façon dont PgBouncer gère cela, consultez la documentation max_prepared_statements.
Pour utiliser la prise en charge de PgBouncer pour les instructions préparées au niveau du protocole, le paramètre PgBouncer max_prepared_statements doit être défini sur une valeur supérieure à 0. La valeur par défaut sur Snowflake Postgres est de 250, mais vous pouvez la définir sur une valeur différente si vous le souhaitez.
Session¶
Le mode pooling de sessions est pris en charge sur Snowflake Postgres si vous en avez besoin. Pour utiliser ce mode de pooling, définissez le paramètre :doc:` pool_mode <postgres-server-settings>` sur session sur votre cluster.
Statement¶
Le mode pooling d’instructions est également disponible. Toutefois, veuillez noter que les transactions à plusieurs instructions généreront des erreurs. Pour utiliser ce mode de pooling, définissez le paramètre :doc:` pool_mode <postgres-server-settings>` sur statement sur votre cluster.
Désactivation de PgBouncer¶
La suppression de l’extension snowflake_pooler d’une base de données désactivera fonctionnellement PgBouncer, car il ne pourra plus s’authentifier :
DROP EXTENSION snowflake_pooler;