Condividi tramite


PgBouncer in Database di Azure per PostgreSQL - Server flessibile

SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile

Database di Azure per PostgreSQL - Server flessibile offre PgBouncer come soluzione predefinita per pooling di connessioni. PgBouncer è una funzionalità facoltativa che può essere abilitata per ogni server di database. È supportato nei livelli di calcolo per utilizzo generico e ottimizzato per la memoria sia nelle reti ad accesso pubblico che in reti ad accesso privato.

PgBouncer viene eseguito nella stessa macchina virtuale (VM) del server di database per il server flessibile di Database di Azure per PostgreSQL. Postgres usa un modello basato su processi per le connessioni, quindi la gestione di molte connessioni inattive comporta costi elevati. Postgres viene eseguito in vincoli di risorse quando il server esegue più di qualche migliaio di connessioni. Il vantaggio principale di PgBouncer consiste nel migliorare le connessioni inattive e le connessioni di breve durata nel server di database.

PgBouncer usa un modello leggero che utilizza operazioni I/O asincrone. Esso usa le connessioni Postgres solo quando necessario, ovvero quando si trova all'interno di una transazione aperta o quando una query è attiva. Questo modello consente l’aumento fino a 10.000 connessioni con sovraccarico ridotto.

PgBouncer viene eseguito sulla porta 6432 nel server di database. È possibile modificare la configurazione della connessione di database dell'applicazione in modo da usare lo stesso nome host, ma impostare la porta su 6432 per iniziare a usare PgBouncer e beneficiare del ridimensionamento ottimizzato delle connessioni inattive.

PgBouncer in Database di Azure per PostgreSQL - Server flessibile supporta l'autenticazione di Microsoft Entra (Azure AD).

Abilitare e configurare PgBouncer

Per abilitare PgBouncer, passare al riquadro Parametri del server nel portale di Azure, cercare PgBouncer e modificare l'impostazione pgbouncer.enabled su true. Non è necessario riavviare il server.

È possibile configurare le impostazioni di PgBouncer usando questi parametri.

Nota

L'elenco seguente di parametri del server PgBouncer è visibile nel riquadro Parametri del server solo se il parametro del server pgbouncer.enabled è impostato su true. In caso contrario, i parametri saranno deliberatamente nascosti.

Nome del parametro Descrizione Impostazione predefinita
pgbouncer.default_pool_size Impostare questo valore del parametro sul numero di connessioni per coppia utente/database. 50
pgbouncer.ignore_startup_parameters Immettere un elenco delimitato da virgole di parametri che PgBouncer può ignorare. Ad esempio, è possibile consentire a PgBouncer di ignorare il parametro extra_float_digits. Alcuni parametri sono consentiti; tutti gli altri generano un errore. Questa capacità è necessaria per tollerare una Java Database Connectivity (JDBC) troppo entusiasta che vuole impostare incondizionatamente extra_float_digits=2 in pacchetti di avvio. Usare questa opzione se la raccolta usata segnala errori, ad esempio pq: unsupported startup parameter: extra_float_digits.
pgbouncer.max_client_conn Impostare questo valore del parametro sul numero massimo di connessioni client a PgBouncer che si desidera supportare. Il valore predefinito è 5000, con un intervallo consentito compreso tra 1 e 50.000 5000
pgbouncer.max_prepared_statements Quando impostato su un valore diverso da zero, PgBouncer tiene traccia di comandi correlati a istruzioni preparate denominate a livello di protocollo inviati dal client in modalità di pool di transazioni e istruzioni. 0
pgbouncer.min_pool_size Aggiungere altre connessioni del server al pool se al di sotto di questo numero. 0
pgbouncer.pool_mode Impostare questo valore del parametro su TRANSACTION per il pooling di transazioni (l'impostazione consigliata per la maggior parte dei carichi di lavoro). transaction
pgbouncer.query_wait_timeout Tempo massimo (in secondi) per cui le query possono attendere l’esecuzione. Se la query non viene assegnata a un server durante tale periodo, il client viene disconnesso. 120
pgbouncer.server_idle_timeout Se una connessione del server rimane inattiva una volta trascorso questo numero di secondi, verrà eliminata. Se 0, il timeout è disabilitato. 600
pgbouncer.stats_users Elenco separato da virgole di utenti del database autorizzati a connettersi ed eseguire query di sola lettura nella console pgBouncer.

Per altre informazioni sulle configurazioni di PgBouncer, vedere la documentazione pgbouncer.ini.

Versione di PgBouncer

Attualmente, la versione di PgBouncer distribuita in tutte le versioni principali supportate del motore, ossia 17 (anteprima), 16, 15, 14, 13, 12, 11, in Database di Azure per PostgreSQL - Server flessibile, è 1.22.1.

Vantaggi

Usando la funzionalità predefinita PgBouncer con Database di Azure per PostgreSQL - Server flessibile, si possono ottenere questi vantaggi:

  • Praticità della configurazione semplificata: poiché PgBouncer è integrato con il server flessibile di Database di Azure per PostgreSQL, non è necessaria un'installazione diversa o una configurazione complessa. È possibile effettuare la configurazione direttamente dai parametri del server.

  • affidabilità di un servizio gestito: PgBouncer offre i vantaggi dei servizi gestiti di Azure. Ad esempio, gli aggiornamenti di PgBouncer sono gestiti da Azure. Gli aggiornamenti automatici eliminano la necessità di manutenzione manuale e assicurano che PgBouncer rimanga aggiornato con le funzionalità e le patch di sicurezza più recenti.

  • Supporto per vari tipi di connessione: PgBouncer nel server flessibile di Database di Azure per PostgreSQL offre supporto per connessioni sia pubbliche che private. È possibile usarlo per stabilire connessioni sicure su reti private o connettersi esternamente, a seconda dei requisiti specifici.

  • Disponibilità elevata in scenari di failover: se un server di standby viene promosso a ruolo primario durante un failover, PgBouncer viene riavviato senza problemi nello standby appena promosso. Non è necessario apportare modifiche alla stringa di connessione dell'applicazione. Questa funzionalità consente di garantire disponibilità continua e ridurre al minimo le interruzioni del pool di connessioni dell'applicazione.

Monitoraggio di PgBouncer

Metriche

È possibile usare le metriche PgBouncer per monitorare le prestazioni del processo PgBouncer, inclusi i dettagli relativi alle connessioni attive, alle connessioni inattive, alle connessioni in pool totali e al numero di pool di connessioni. Ogni metrica viene generata a intervalli di 1 minuto e ha una cronologia che può arrivare fino a 93 giorni. I clienti possono configurare avvisi sulle metriche e accedere inoltre alle nuove dimensioni delle metriche per suddividere e filtrare i dati delle metriche in base al nome del database.

Come abilitare le metriche PgBouncer

  • Per monitorare le metriche PgBouncer, assicurarsi che la funzionalità pgbouncer sia abilitata tramite il parametro pgbouncer.enabled, e che il parametro metrics.pgbouncer_diagnostics delle metriche sia abilitato.
  • Questi parametri sono dinamici e non richiedono un riavvio dell'istanza.
  • Le metriche PgBouncer sono disabilitate per impostazione predefinita.

Elenco delle metriche PgBouncer

Nome visualizzato ID metrica Unità Descrizione Dimension Impostazione predefinita abilitata
Connessioni client attive client_connections_active Conteggio Connessioni da client associati a una connessione a server flessibile di Database di Azure per PostgreSQL. DatabaseName NO
Connessioni client in attesa client_connections_waiting Conteggio Connessioni da client in attesa di essere servite da una connessione a server flessibile di Database di Azure per PostgreSQL. DatabaseName NO
Connessioni server attive server_connections_active Conteggio Connessioni al server flessibile di Azure Database per PostgreSQL utilizzate da una connessione client. DatabaseName NO
Connessioni inattive del server server_connections_idle Conteggio Connessioni al server flessibile di Database di Azure per PostgreSQL inattive e pronte per servire una nuova connessione client. DatabaseName NO
Totale connessioni raggruppate total_pooled_connections Conteggio Numero corrente di connessioni raggruppate. DatabaseName NO
Numero di pool di connessioni num_pools Conteggio Numero totale di pool di connessioni. DatabaseName NO

Considerazioni sull'uso delle metriche PgBouncer

  • Le metriche PgBouncer che usano la dimensione DatabaseName hanno un limite di 30 database.
  • Nello SKU Burstable, il limite è di 10 database con la dimensione DatabaseName.
  • Il limite della dimensione DatabaseName viene applicato alla colonna OID, che riflette l'ordine di creazione per il database.

Per altre informazioni, vedere Metriche PgBouncer.

Console di amministrazione

PgBouncer fornisce anche un database interno denominato pgbouncer. Quando ci si connette a tale database, è possibile eseguire comandi SHOW che forniscono informazioni sullo stato corrente di PgBouncer.

Per connettersi al database pgbouncer:

  1. Impostare il parametro pgBouncer.stats_users sul nome di un utente esistente (ad esempio, myUser) e applicare le modifiche.

  2. Connettersi al database pgbouncer come utente e impostare la porta come 6432:

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=pgbouncer user=myUser password=<password> sslmode=require"
    

Dopo aver eseguito la connessione al database, usare i comandi SHOW per visualizzare le statistiche di PgBouncer:

  • SHOW HELP: elencare tutti i comandi SHOW disponibili.
  • SHOW POOLS: mostrare il numero di connessioni in ogni stato per ogni pool.
  • SHOW DATABASES: mostrare i limiti correnti di connessione applicati per ogni database.
  • SHOW STATS: mostrare statistiche sulle richieste e sul traffico per ogni database.

Per altre informazioni sui comandi PgBouncer SHOW, vedere Console di amministrazione.

Passaggio la propria applicazione all'uso di PgBouncer

Per iniziare a usare PgBouncer, seguire questi passaggi:

  1. Connettersi al server di database, ma usare la porta 6432 anziché la normale porta 5432. Verificare che la connessione sia funzionante.

    psql "host=myPgServer.postgres.database.azure.com port=6432 dbname=postgres user=myUser password=<password> sslmode=require"
    
  2. Testare l'applicazione in un ambiente QA con PgBouncer per assicurarsi di non avere problemi di compatibilità. Il progetto PgBouncer fornisce una matrice di compatibilità ed è consigliabile usare pool di transazioni per la maggior parte degli utenti.

  3. Modificare l'applicazione di produzione perché si connetta alla porta 6432 anziché alla porta 5432. Monitorare eventuali errori sul lato applicazione che potrebbero segnalare problemi di compatibilità.

PgBouncer in disponibilità elevata con ridondanza della zona

Nei server con ridondanza della zona e disponibilità elevata, il server primario esegue PgBouncer. È possibile connettersi a PgBouncer nel server primario sulla porta 6432. Dopo un failover, PgBouncer viene riavviato nello standby appena promosso, che è ora il server primario. La stringa di connessione dell'applicazione rimane quindi la stessa dopo il failover.

Uso di PgBouncer con altri pool di connessioni

In alcuni casi, potrebbe essere già presente un pool di connessioni sul lato applicazione o PgBouncer potrebbe già essere configurato sul lato applicazione, (ad esempio, un sidecar del servizio Azure Kubernetes). In questi casi, la funzionalità PgBouncer integrata può comunque essere utile perché offre i vantaggi del ridimensionamento delle connessioni inattive.

L'uso di un pool sul lato applicazione insieme a PgBouncer nel server di database può essere utile. In questo caso, il pool lato applicazione offre il vantaggio di ridurre la latenza di connessione iniziale, perché il round trip per inizializzare la connessione è molto più veloce, e PgBouncer lato database offre il ridimensionamento delle connessioni inattive.

Limitazioni

  • La funzionalità PgBouncer attualmente non è supportata con il livello di calcolo del server con possibilità di burst. Se si modifica il livello di calcolo da Utilizzo generico o Ottimizzato per la memoria a con possibilità di burst, si perde la funzionalità PgBouncer integrata.

  • Ogni volta che il server viene riavviato durante operazioni di scalabilità, failover a disponibilità elevata o un riavvio, PgBouncer e la macchina virtuale vengono riavviati. È quindi necessario ristabilire le connessioni esistenti.

  • Il portale non mostra tutti i parametri PgBouncer. Dopo aver abilitato PgBouncer e salvato i parametri, è necessario chiudere il riquadro Parametri server (ad esempio, selezionare Panoramica) e quindi tornare al riquadro Parametri del server.

  • Non è possibile usare modalità pool di istruzioni insieme a istruzioni preparate. La versione corrente di PgBouncer ha aggiunto il supporto per istruzioni preparate all'interno della modalità transazione. Questo supporto può essere abilitato e configurato tramite max_prepared_statements parametro. L'impostazione di questo parametro sopra il valore predefinito 0 attiva il supporto per istruzioni preparate. Questo supporto riguarda solo istruzioni preparate a livello di protocollo. Per la maggior parte dei linguaggi di programmazione, ciò implica che si usa la funzione libpq PQprepare sul client, inviando comandi a livello di protocollo che PgBouncer può intercettare, anziché eseguire un comando SQL dinamico simile a PREPARE proc AS, il quale invia testo che PgBouncer non interpreterà correttamente. Per verificare altre limitazioni della modalità pool scelta, vedere la documentazione di PgBouncer.

  • Se PgBouncer viene distribuito come funzionalità, diventa un potenziale singolo punto di guasto. Se la funzionalità PgBouncer è inattiva, può interrompere l'intero pool di connessioni di database e causare tempi di inattività per l'applicazione. Per attenuare il singolo punto di guasto, è possibile configurare più istanze di PgBouncer dietro un servizio di bilanciamento del carico per disponibilità elevata in macchine virtuali di Azure.

  • Restrizione delle dimensioni del token con l'autenticazione di Azure AD: gli utenti con un numero elevato di appartenenze ai gruppi non potranno connettersi tramite PgBouncer a causa di una restrizione delle dimensioni del token. Le applicazioni, i servizi e gli utenti con un numero ridotto di gruppi funzionano.

  • PgBouncer è un'applicazione leggera che usa un'architettura a thread singolo. Questa progettazione è ideale per la maggior parte dei carichi di lavoro dell'applicazione. Nelle applicazioni che creano un numero elevato di connessioni di breve durata, tuttavia, questa progettazione potrebbe influire sulle prestazioni di pgBouncer e limitare la capacità di ridimensionare l'applicazione. Potrebbe essere necessario tentare uno di questi approcci:

    • Distribuire il carico di connessione tra più istanze di PgBouncer in macchine virtuali di Azure.
    • Prendere in considerazione soluzioni alternative, tra cui soluzioni multithreading come PgCat, nelle macchine virtuali di Azure.

Importante

Il parametro pgbouncer.client_tls_sslmode per la funzionalità PgBouncer integrata è stato deprecato in Database di Azure per PostgreSQL - Server flessibile.

Quando TLS/SSL per connessioni al server flessibile di Database di Azure per PostgreSQL viene applicato impostando il parametro require_secure_transport del server su ON, TLS/SSL viene applicato automaticamente per connessioni alla funzionalità PgBouncer integrata. Questa impostazione è attiva per impostazione predefinita quando si crea una nuova istanza di Database di Azure per PostgreSQL - Server flessibile e si abilita la funzionalità PgBouncer integrata. Per altre informazioni, vedere Proteggere la connettività con TLS e SSL nel server flessibile di Database di Azure per PostgreSQL.

Per clienti che desiderano una gestione semplificata, disponibilità elevata integrata, connettività semplice con applicazioni in contenitori e la possibilità di usare i parametri di configurazione più diffusi, la funzionalità PgBouncer integrata è un’ottima scelta. Per clienti che desiderano scalabilità multithreading, controllo completo di tutti i parametri e un'esperienza di debug, la configurazione di PgBouncer in macchine virtuali di Azure potrebbe essere un'alternativa.