Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Penanganan koneksi mati di PostgreSQL
Koneksi mati terjadi ketika sesi database tetap aktif di server meskipun aplikasi klien telah ditinggalkan atau dihentikan secara tidak normal. Situasi ini biasanya muncul ketika proses klien macet atau berhenti secara tak terduga tanpa menutup koneksi database mereka dengan benar atau membatalkan permintaan yang sedang berlangsung.
PostgreSQL secara efisien mengidentifikasi dan membersihkan koneksi mati saat proses server menganggur atau mencoba mengirim data ke klien. Namun, deteksi menantang untuk sesi yang menganggur, menunggu masukan klien, atau menjalankan kueri secara aktif. Untuk menangani skenario ini, PostgreSQL tcp_keepalives_*
menyediakan,, dan parameter. tcp_user_timeout
client_connection_check_interval
Topik
Memahami TCP keepalive
TCP Keepalive adalah mekanisme tingkat protokol yang membantu menjaga dan memverifikasi integritas koneksi. Setiap koneksi TCP mempertahankan pengaturan tingkat kernel yang mengatur perilaku keepalive. Ketika timer keepalive kedaluwarsa, sistem melakukan hal berikut:
-
Mengirim paket probe tanpa data dan set flag ACK.
-
Mengharapkan respons dari titik akhir jarak jauh sesuai dengan spesifikasi. TCP/IP
-
Mengelola status koneksi berdasarkan respons atau kekurangannya.
Parameter kunci TCP keepalive dalam RDS untuk PostgreSQL Aurora
Parameter | Deskripsi | Nilai default |
---|---|---|
tcp_keepalives_idle |
Menentukan jumlah detik tidak aktif sebelum mengirim pesan keepalive. | 300 |
tcp_keepalives_interval |
Menentukan jumlah detik antara transmisi ulang pesan keepalive yang tidak diakui. | 30 |
tcp_keepalives_count |
Pesan keepalive maksimum yang hilang sebelum menyatakan koneksi mati | 2 |
tcp_user_timeout |
Menentukan berapa lama (dalam Millidetik) data yang tidak diakui dapat tetap sebelum menutup sambungan secara paksa. | 0 |
client_connection_check_interval |
Mengatur interval (dalam Millidetik) untuk memeriksa status koneksi klien selama kueri yang berjalan lama. Ini memastikan deteksi koneksi tertutup yang lebih cepat. | 0 |
Kasus penggunaan untuk pengaturan TCP keepalive
Menjaga sesi idle tetap hidup
Untuk mencegah koneksi idle dihentikan oleh firewall atau router karena tidak aktif:
-
Konfigurasikan
tcp_keepalives_idle
untuk mengirim paket keepalive secara berkala.
Mendeteksi koneksi mati
Untuk mendeteksi koneksi mati dengan segera:
-
Sesuaikan
tcp_keepalives_idle
,tcp_keepalives_interval
, dantcp_keepalives_count
. Misalnya, dengan default Aurora PostgreSQL, dibutuhkan sekitar satu menit (2 probe × 30 detik) untuk mendeteksi koneksi mati. Menurunkan nilai-nilai ini dapat mempercepat deteksi. -
Gunakan
tcp_user_timeout
untuk menentukan waktu tunggu maksimum untuk pengakuan.
Pengaturan TCP keepalive membantu kernel mendeteksi koneksi mati, tetapi PostgreSQL mungkin tidak bertindak sampai soket digunakan. Jika sesi menjalankan kueri panjang, koneksi mati mungkin hanya terdeteksi setelah kueri selesai. Di PostgreSQL 14 dan versi yang lebih tinggiclient_connection_check_interval
, dapat mempercepat deteksi koneksi mati dengan melakukan polling soket secara berkala selama eksekusi kueri.
Praktik terbaik
-
Tetapkan interval keepalive yang wajar: Tune
tcp_user_timeout
,tcp_keepalives_idle
,tcp_keepalives_count
dantcp_keepalives_interval
untuk menyeimbangkan kecepatan deteksi dan penggunaan sumber daya. -
Optimalkan untuk lingkungan Anda: Sejajarkan pengaturan dengan perilaku jaringan, kebijakan firewall, dan kebutuhan sesi.
-
Memanfaatkan fitur PostgreSQL: Gunakan
client_connection_check_interval
di PostgreSQL 14 dan versi yang lebih tinggi untuk pemeriksaan koneksi yang efisien.