Sesi Oracle terputus lewat VPN? Periksa lapisan keepalive
Pekerjaan basis data yang sepi dapat bertahan melewati aliran jaringan yang tidak aktif. Telusuri sakelar soket, nilai bawaan kernel, dan pengaturan Oracle Net dalam urutan yang benar.
Dua puluh lima menit pekerjaan basis data yang berguna hampir tidak menghasilkan keluaran, dan dari setiap perangkat di jalur itu aliran tersebut tampak tidak aktif. Keadaan tidak aktiflah yang justru dikumpulkan. Laporan sesudahnya selalu berbentuk sama: kueri sedang berjalan, lalu sesi hilang, dan hasilnya tidak pernah tiba.
Empat pemeriksaan menentukan apakah sesi yang sepi bertahan, dan semuanya berjalan dari soket ke luar. Lakukan berurutan, karena masing-masing mengandaikan lapisan sebelumnya menjalankan tugasnya.
Aliran mana yang menjadi sepi
Koneksi yang penting adalah yang membawa lalu lintas basis data, dikenali dari alamat dan portnya sendiri. Tidak ada yang lain menyegarkannya. Ping ke gateway, koneksi SQL kedua dari host yang sama, dan detak jantung terowongan itu sendiri adalah aliran terpisah dengan status terpisah di setiap perangkat yang melacaknya.
ss -tio dst 10.60.4.20
sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_intvl net.ipv4.tcp_keepalive_probes
Daftar soket menunjukkan pengatur waktu dan status antrean untuk koneksi yang hidup, yang lebih informatif daripada uji keterjangkauan. Nilai sysctl adalah nilai bawaan kernel untuk perilaku keepalive, dan bagian berikutnya menjelaskan mengapa nilai itu mungkin tidak pernah berlaku untuk sesi Anda. Nilai bawaan yang tidak pernah terpicu tidak dapat dibedakan dari tidak adanya nilai bawaan sama sekali.
Catat alamat, port, dan antarmuka yang dipakai koneksi. Ketika sesi mati, detail itulah yang memungkinkan Anda bertanya kepada perangkat yang tepat apa yang dilakukannya, bukan bertanya apakah jaringan sedang hidup.
Apakah kebijakan diam kedaluwarsa atau membatasi
Dua kebijakan menghasilkan gejala yang sama dan menuntut respons yang berlawanan. Batas waktu diam menghapus status yang bisa disegarkan oleh lalu lintas yang memenuhi syarat, dan keepalive dapat mencegahnya. Batas sesi absolut menghapus aliran setelah durasi tetap terlepas dari aktivitas, dan tidak ada keepalive yang mengubahnya.
Tanyakan kepada pemilik setiap perantara mana dari keduanya yang diterapkan. Firewall, perangkat NAT, penyeimbang beban, dan gateway cloud semuanya dapat menyimpan status, dan mereka tidak harus sepakat. Yang paling sempit menetapkan tenggat yang harus Anda kalahkan.
Perbedaan itu juga memberi tahu Anda kapan berhenti menyetel. Jika kebijakannya batas absolut, solusi yang benar adalah unit kerja yang lebih pendek, tugas yang dapat dilanjutkan, atau pengecualian yang disetujui, dan pemeriksaan di bawah hanya akan menegaskan bahwa keepalive tidak mengubah apa pun.
Sakelar soket di balik nilai bawaan Linux
Keepalive bersifat pilihan per soket. Nilai bawaan kernel menjelaskan bagaimana probe berperilaku setelah soket mengaktifkan mekanismenya, dan nilai itu tidak mengaktifkannya untuk koneksi yang sudah ada. Aplikasi yang tidak pernah memintanya tidak mendapat probe, apa pun kata nilai sysctl.
Karena itu menaikkan angkanya saja tidak mengubah apa pun bagi klien basis data. Pustaka klien atau aplikasi harus mengaktifkan mekanismenya, dan di tempat tumpukan menyediakan kendali per koneksi, pengaturan terbatas lebih baik daripada perubahan untuk seluruh host yang memengaruhi layanan tak terkait.
Interval sampai probe pertama juga bukan batas waktu kueri. Koneksi yang sehat tetap sepi di antara probe, dan rekan yang mati dikenali menurut interval dan jumlah probe. Membaca ketiga nilai itu sebagai satu batas waktu membuat orang sampai pada pengaturan yang mendeteksi kegagalan entah jauh terlalu lambat atau terlalu bersemangat. Nilai itu mengendalikan pendeteksian, bukan kesabaran aplikasi.
EXPIRE_TIME adalah pengaturan basis data, bukan perbaikan jaringan
Oracle Net menawarkan mekanisme keaktifannya sendiri, dikonfigurasi dalam profil efektif untuk prosesnya, bukan dalam berkas sembarang yang kebetulan bernama mirip. Nilainya dinyatakan dalam menit.
SQLNET.EXPIRE_TIME = 5
Tujuan utamanya adalah pendeteksian koneksi mati di sisi server, dan pada platform yang mendukung model yang ditingkatkan ia juga menyetel perilaku keepalive TCP untuk koneksi tersebut. Itu sifat yang berguna: lapisan basis data dapat mengatur probe tanpa meminta aplikasi klien berubah.
Nilai ilustratif di atas adalah pilihan terkoordinasi terhadap tenggat yang diasumsikan, bukan rekomendasi. Panduan umum yang didokumentasikan adalah interval yang lebih panjang, dan angka yang tepat bergantung pada implementasi yang terpasang, biaya probe yang Anda terima, dan aturan penyegaran sebenarnya di jalur. Letakkan pengaturan itu di profil yang dibaca proses terkait, dan pastikan prosesnya mengambilnya. Oracle mendokumentasikan lokasi profil dan perilaku pendeteksian di referensi parameternya.
Uji interval sepi, lalu rencanakan pemulihan
Lewatkan koneksi baru yang diizinkan melalui periode sepi yang lebih panjang daripada tenggat yang Anda coba kalahkan, dan amati lalu lintas keaktifan serta hasil aplikasi. Jangan menangkap isi muatan yang tidak Anda butuhkan; pengatur waktu dan status koneksi menjawab pertanyaannya.
ss -tio dst 10.60.4.20
# after the quiet interval, same command
ls -l "$ORACLE_HOME/network/admin/sqlnet.ora"
Jika sesi tetap hilang, tenggat itu milik perangkat yang belum Anda tanyai, atau kebijakannya batas absolut. Jika bertahan, catat lapisan mana yang berubah agar operasi sepi berikutnya tidak mengulangi penyelidikan.
Akhirnya, putuskan apa yang terjadi ketika koneksi benar-benar putus, karena pemeriksaan keaktifan menurunkan frekuensinya dan tidak pernah menghilangkan kemungkinannya. Tetapkan hasil tercatat dari operasi basis data sebelum mengirimnya lagi: hilangnya balasan tidak membuktikan apa pun tentang apakah pekerjaannya sudah dikonfirmasi. Untuk apa pun yang harus bertahan saat laptop ditutup atau terowongan dimulai ulang, tugas milik server dengan hasil yang tahan lama adalah rancangan yang lebih kuat, dan keepalive bukan penjadwal.