Gestione delle connessioni
Le connessioni alla tua distribuzione Databases for PostgreSQL utilizzano risorse, quindi è importante considerare quante connessioni hai bisogno per ottimizzare le prestazioni della tua distribuzione. PostgreSQL utilizza un'impostazione max_connections per limitare il numero di connessioni (e le risorse che vengono utilizzate dalle connessioni) per evitare che il comportamento della connessione run-away travolga le risorse della distribuzione.
È possibile verificare il valore di max_connections con utente admin e psql.
ibmclouddb=> SHOW max_connections;
max_connections
-----------------
115
(1 row)
Limiti connessioni
Al momento del provisioning, Databases for PostgreSQL imposta il numero massimo di connessioni al database PostgreSQL su 115. 15 connessioni sono riservate al superutente per mantenere lo stato e l'integrità del tuo database e 100 connessioni sono disponibili per te e le tue applicazioni. Se il numero di connessioni al database supera il limite di 100 connessioni, le nuove connessioni non riescono e restituiscono un errore.
FATAL: remaining connection slots are reserved for
non-replication superuser connections
Il superamento del limite di connessione per la distribuzione può rendere il database non raggiungibile dalle applicazioni.
È possibile verificare il numero di connessioni alla propria distribuzione con l'utente admin psql e pg_stat_database.
SELECT count(distinct(numbackends)) FROM pg_stat_database;
Se è necessario capire dove stanno andando le connessioni, è possibile suddividere le connessioni per database.
SELECT datname, numbackends FROM pg_stat_database;
Per esaminare ulteriormente le connessioni ad un database specifico, eseguire la query pg_stat_activity.
SELECT * FROM pg_stat_activity WHERE datname='ibmclouddb';
Connessioni di terminazione
L'utente amministratore ha il ruolo pg_signal_backend. Se si trovano connessioni che devono essere reimpostate o chiuse, l'utente Admin può utilizzare sia pg_cancel_backend che pg_terminate_backend. Il pid di un processo viene trovato dalla tabella pg_stat_activity.
-
pg_cancel_backendannulla la query corrente di una connessione senza terminare la connessione e senza arrestare altre query che potrebbero essere in esecuzione.SELECT pg_cancel_backend(pid); -
pg_terminate_backendarresta l'intero processo e chiude la connessione.SELECT pg_terminate_backend(pid);
L'utente amministratore ha il potere di reimpostare o chiudere le connessioni per qualsiasi utente sulla distribuzione, ad eccezione dei superutenti. Fare attenzione a non terminare le connessioni di replica dall'utente ibm-replication,
poiché interferiscono con l'alta disponibilità della distribuzione.
Connessioni finali
Se la distribuzione raggiunge il limite di connessione o si hanno problemi di connessione alla distribuzione e si sospetta che un numero elevato di connessioni sia un problema, disconnettere tutte le connessioni alla propria distribuzione.
Nella UI, nella scheda Impostazioni , è presente un pulsante per End connections per la tua distribuzione. Fate attenzione, perché interrompe tutto ciò che è collegato all'installazione.
Il comando CLI per terminare le connessioni alla distribuzione è:
ibmcloud cdb deployment-kill-connections <DEPLOYMENT_NAME_OR_CRN>
Puoi anche utilizzare l'APICloud Databases per eseguire l'operazione di fine di tutte le connessioni.
Pooling delle connessioni
Un modo per evitare il superamento del limite di connessione e garantire che le connessioni dalle applicazioni vengano gestite in maniera efficiente è tramite il pool di connessioni. Se ti trovi ad impostare il limite di connessioni IBM Cloud® Databases for PostgreSQL su più di 500 connessioni, dovresti prendere seriamente in considerazione l'utilizzo del pool di connessioni o rivalutare come utilizzare e gestire le connessioni in modo più efficace. Il benchmarking delle prestazioni nella comunità PostgreSQL suggerisce 500 connessioni o meno per essere ottimale per le prestazioni del database.
Molte librerie di driver PostgreSQL hanno classi e funzioni di pooling delle connessioni. È necessario consultare la documentazione del driver per implementare il pool di connessioni ottimale per il proprio caso d'uso. Ad esempio, il driver Python ha classi per gestire il pooling delle connessioni nell'applicazione. Il driver Java PostgreSQL JDBC dispone di metodi per il connection pooling sia a livello di applicazione che di application server.
In alternativa, è possibile utilizzare uno strumento di terze parti come PgBouncer per gestire le connessioni dell'applicazione. Le distribuzioni di Databases for PostgreSQL includono
il supporto integrato per l'autenticazione PgBouncer's auth_query, pertanto un'istanza di PgBouncer in esecuzione può verificare l'autenticità degli utenti confrontandoli con il database senza dover gestire un elenco di password
locale, e le modifiche alle password hanno effetto senza che sia necessario riavviare PgBouncer. Per le istruzioni di configurazione, consultare la sezione " Pool di connessioni" all'indirizzo PgBouncer.
Aumentare il limite di connessione
PostgreSQL assegna una certa quantità di memoria per connessione, di solito circa 5-10 MB per connessione. È importante considerare la quantità totale di memoria disponibile per la distribuzione prima di aumentare il limite di connessione. Per aumentare il limite di connessione, prima potresti voler ridimensionare la tua distribuzione per assicurarti di disporre di memoria sufficiente per ospitare più connessioni.
Successivamente, modificare il valore di max_connections nella distribuzione. Per apportare modifiche permanenti alla configurazione PostgreSQL,
vuoi utilizzare Cloud Databases cli-plugin o API per scrivere le modifiche nel file di configurazione per la tua distribuzione.
Ad esempio, per aumentare max_connections a 215, potrebbe essere una buona idea scalare la tua distribuzione ad almeno 2 GB di RAM per membro di dati, per un totale di 4 GB di RAM per la tua distribuzione. Una volta terminata l'operazione
di ridimensionamento, impostare il limite di connessione.
- Prima di regolare
max_connections, assicurarsi di puntare alla regione preferita con un comando come:
ibmcloud target -r <REGION>
- Successivamente, aumentare la quantità di memoria disponibile per un gruppo di distribuzione con un comando come:
ibmcloud cdb deployment-groups-set deployment-example member --memory 4096
- Infine, regolare
max_connectionscon un comando come:
ibmcloud cdb deployment-configuration <DEPLOYMENT_NAME_OR_CRN> '{"configuration":{"max_connections":215}}'
Per apportare le modifiche tramite l'API, utilizzare il seguente comando:
curl -X PATCH `https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/groups/member' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"memory": {
"allocation_mb": 4096
}
}'
curl -X PATCH 'https://api.{region}.databases.cloud.ibm.com/v5/ibm/deployments/{id}/configuration' \
-H "Authorization: Bearer $APIKEY" \
-H "Content-Type: application/json" \
-d '{"configuration":{
"max_connections":215
}
}'
Limiti di connessione e impostazioni di TCP/IP keepalives
In caso di connessione di rete o di failover, è possibile che le connessioni interrotte di TCP/IP rimangano in uno stato di semi-apertura/chiusura fino a quando non vengono raggiunti i timeout di keepalive di TCP. Per evitare questo scenario,
impostare anche le impostazioni socket_timeout e connection_timeout nei driver dell'applicazione specifici. Le impostazioni corrette variano in base allo specifico carico di lavoro ed è importante eseguire i test di carico prima di passare alla produzione.
Un buon punto di partenza per connection_timeout è 2-5 secondi. Per socket_timeout, un buon punto di partenza è 30-60 secondi.
Inoltre, sul lato server, vengono utilizzate le seguenti configurazioni keepalive come predefinite.
tcp_keepalives_idleè impostato su 5 minuti- L'intervallo di analisi
tcp_keepalives_intervalè impostato su 10 secondi tcp_keepalives_countè impostato su 6
Per evitare che le connessioni half - open/closed o i burst nei tentativi di connessione sovraccaricino la distribuzione, impostare il parametro max_connections per Postgres su almeno il doppio del conteggio di connessioni previsto.
Se viene raggiunto il limite di connessioni, è possibile terminare tutte le connessioni immediatamente.