Le prestazioni sono sempre importanti in qualsiasi sistema. Dovrai fare buon uso delle risorse disponibili per garantire il miglior tempo di risposta possibile e ci sono diversi modi per farlo. Ogni connessione a un database consuma risorse, quindi uno di questi modi è avere un buon gestore di connessione tra l'applicazione e il database. In questo blog parleremo di pgBouncer, un pool di connessioni per PostgreSQL, e mostreremo come implementarlo per migliorare le prestazioni di PostgreSQL.
Collegamenti in pool
A seconda del traffico dei tuoi sistemi, potrebbe essere utile aggiungere uno strumento esterno per ridurre il carico sul tuo database che migliorerà le prestazioni. Forse non basta, ma è un buon punto di partenza. Per questo, è una buona idea implementare un pool di connessioni
Un pool di connessioni è un metodo per creare un pool di connessioni e riutilizzarle, evitando di aprire continuamente nuove connessioni al database, il che aumenterà notevolmente le prestazioni delle tue applicazioni. PgBouncer è un popolare pool di connessioni progettato per PostgreSQL.
Come funziona PgBouncer
PgBouncer funge da server PostgreSQL, quindi è sufficiente accedere al database utilizzando le informazioni PgBouncer (Indirizzo IP/Nome host e porta) e PgBouncer creerà una connessione al server PostgreSQL, altrimenti riutilizzane uno se esiste.
Quando PgBouncer riceve una connessione, esegue l'autenticazione, che dipende dal metodo specificato nel file di configurazione. PgBouncer supporta tutti i meccanismi di autenticazione supportati dal server PostgreSQL. Successivamente, PgBouncer verifica la presenza di una connessione memorizzata nella cache, con la stessa combinazione nome utente + database. Se viene trovata una connessione memorizzata nella cache, restituisce la connessione al client, in caso contrario crea una nuova connessione. A seconda della configurazione di PgBouncer e del numero di connessioni attive, potrebbe essere possibile che la nuova connessione venga messa in coda fino a quando non può essere creata, o addirittura interrotta.
Il comportamento di PgBouncer dipende dalla modalità di pooling configurata:
-
pooling di sessioni (predefinito):quando un client si connette, gli verrà assegnata una connessione al server per l'intero durata in cui il cliente rimane connesso. Quando il client si disconnette, la connessione al server verrà rimessa nel pool.
-
pooling di transazioni:una connessione al server viene assegnata a un client solo durante una transazione. Quando PgBouncer si accorge che la transazione è terminata, la connessione al server verrà rimessa nel pool.
-
pool di istruzioni:la connessione al server verrà ripristinata nel pool subito dopo il completamento di una query. Le transazioni con più estratti conto non sono consentite in questa modalità poiché si interromperebbero.
Come implementare PgBouncer utilizzando ClusterControl
Per questo, assumiamo che tu abbia il tuo cluster PostgreSQL attivo e funzionante e che tu stia utilizzando ClusterControl per gestirlo, altrimenti puoi seguire questo post del blog per distribuire facilmente PostgreSQL per l'alta disponibilità.
Vai a ClusterControl -> Seleziona PostgreSQL Cluster -> Azioni Cluster -> Aggiungi Load Balancer -> PgBouncer. Lì puoi distribuire un nuovo nodo PgBouncer che verrà distribuito nel nodo del database selezionato o persino importare un nodo PgBouncer esistente.
Dovrai specificare l'indirizzo IP o il nome host, la porta di ascolto e PgBouncer credenziali. Premendo su Deploy PgBouncer, ClusterControl accederà al nodo, installerà e configurerà tutto senza alcun intervento manuale.
Puoi monitorare lo stato di avanzamento nella Sezione Attività ClusterControl. Al termine, è necessario creare il nuovo Pool. Per questo, vai su ClusterControl -> Seleziona il cluster PostgreSQL -> Nodi -> PgBouncer Node.
Qui dovrai aggiungere le seguenti informazioni:
-
Nome host PgBouncer:seleziona gli host del nodo per creare il pool di connessioni.
-
Nome pool:i nomi pool e database devono essere gli stessi.
-
Nome utente: seleziona un utente dal nodo primario di PostgreSQL o creane uno nuovo.
-
Modalità pool:può essere una delle modalità che abbiamo menzionato prima:sessione (predefinita), transazione, o raccolta di dichiarazioni.
-
Dimensione pool:dimensione massima dei pool per questo database. Il valore predefinito è 20.
-
Numero massimo di connessioni al database:configurare un massimo a livello di database. Il valore predefinito è 0, che significa illimitato.
Ora dovresti essere in grado di vedere il Pool nella sezione Node.
Questa è una topologia di base. Puoi migliorarlo, ad esempio, aggiungendo nodi di bilanciamento del carico, più di uno per evitare un singolo punto di errore, e utilizzando alcuni strumenti come "Keepalived", per garantire la disponibilità. Può anche essere fatto usando ClusterControl.
Conclusione
Utilizzare PgBouncer come pool di connessioni è un buon modo per migliorare le prestazioni del database sfruttando al meglio le risorse disponibili nel server.
Puoi anche migliorare questa topologia utilizzando una combinazione di PgBouncer + HAProxy per ottenere un'elevata disponibilità per il tuo cluster PostgreSQL. Tutte queste cose possono essere eseguite dalla stessa interfaccia utente di ClusterControl.