Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Gestione delle connessioni interrotte in PostgreSQL
Le connessioni interrotte si verificano quando una sessione di database rimane attiva sul server nonostante l'applicazione client sia stata abbandonata o terminata in modo anomalo. Questa situazione si verifica in genere quando i processi client si bloccano o si interrompono in modo imprevisto senza chiudere correttamente le connessioni al database o annullare le richieste in corso.
PostgreSQL identifica e ripulisce in modo efficiente le connessioni interrotte quando i processi del server sono inattivi o tentano di inviare dati ai client. Tuttavia, il rilevamento è difficile per le sessioni inattive, in attesa dell'input del client o che eseguono attivamente le query. Per gestire questi scenari, PostgreSQL fornisce tcp_keepalives_*
e parametri. tcp_user_timeout
client_connection_check_interval
Comprendere TCP keepalive
TCP Keepalive è un meccanismo a livello di protocollo che aiuta a mantenere e verificare l'integrità della connessione. Ogni connessione TCP mantiene le impostazioni a livello di kernel che regolano il comportamento di keepalive. Quando il timer keepalive scade, il sistema esegue le seguenti operazioni:
-
Invia un pacchetto di sonda senza dati e con il flag ACK impostato.
-
Prevede una risposta dall'endpoint remoto in base alle specifiche. TCP/IP
-
Gestisce lo stato della connessione in base alla risposta o alla sua mancanza.
Parametro | Descrizione | Valori predefiniti |
---|---|---|
tcp_keepalives_idle |
Speciifica il numero di secondi di inattività prima dell'invio del messaggio keepalive. | 300 |
tcp_keepalives_interval |
Speciifica il numero di secondi tra le ritrasmissioni di messaggi keepalive non riconosciuti. | 30 |
tcp_keepalives_count |
Numero massimo di messaggi keepalive persi prima di dichiarare interrotta la connessione | 2 |
tcp_user_timeout |
Speciifica per quanto tempo (in millisecondi) possono rimanere i dati non riconosciuti prima della chiusura forzata della connessione. | 0 |
client_connection_check_interval |
Imposta l'intervallo (in millisecondi) per il controllo dello stato della connessione del client durante le query di lunga durata. Ciò garantisce un rilevamento più rapido delle connessioni chiuse. | 0 |
Casi d'uso per le impostazioni TCP keepalive
Mantenere attive le sessioni inattive
Per evitare che le connessioni inattive vengano interrotte da firewall o router a causa dell'inattività:
-
Configura
tcp_keepalives_idle
per inviare pacchetti keepalive a intervalli regolari.
Rilevamento di connessioni interrotte
Per rilevare tempestivamente le connessioni interrotte:
-
Regola
tcp_keepalives_idle
tcp_keepalives_interval
, e.tcp_keepalives_count
Ad esempio, con le impostazioni predefinite di Aurora PostgreSQL, è necessario circa un minuto (2 sonde × 30 secondi) per rilevare una connessione interrotta. La riduzione di questi valori può velocizzare il rilevamento. -
tcp_user_timeout
Da utilizzare per specificare il tempo massimo di attesa per un riconoscimento.
Le impostazioni TCP keepalive aiutano il kernel a rilevare le connessioni interrotte, ma PostgreSQL potrebbe non agire finché non viene utilizzato il socket. Se una sessione esegue una query lunga, le connessioni interrotte potrebbero essere rilevate solo dopo il completamento della query. In PostgreSQL 14 e versioni successiveclient_connection_check_interval
, può accelerare il rilevamento delle connessioni interrotte interrogando periodicamente il socket durante l'esecuzione della query.
Best practice
-
Imposta intervalli keepalive ragionevoli: ottimizza e bilancia la velocità di rilevamento
tcp_keepalives_count
etcp_user_timeout
tcp_keepalives_interval
l'tcp_keepalives_idle
uso delle risorse. -
Ottimizza per il tuo ambiente: allinea le impostazioni al comportamento della rete, alle politiche del firewall e alle esigenze delle sessioni.
-
Sfrutta le funzionalità di PostgreSQL:
client_connection_check_interval
utilizzalo in PostgreSQL 14 e versioni successive per controlli di connessione efficienti.