Penanganan koneksi mati di PostgreSQL - Amazon Aurora

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

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:

  • Sesuaikantcp_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: Tunetcp_user_timeout,tcp_keepalives_idle, tcp_keepalives_count dan tcp_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.