Kegagalan otomatis DB di c # tidak berfungsi ketika server utama secara fisik offline


9

Saya mengatur DB auto failover di C # dengan SQL Server 2008 dan saya memiliki 'keamanan tinggi dengan mirror failover otomatis' menggunakan pengaturan saksi dan string koneksi saya terlihat seperti

"Server=tcp:DC01; Failover Partner=tcp:DC02; database=dbname; uid=sewebsite;pwd=somerndpwd;Connect Timeout=10;Pooling=True;"

Selama pengujian, ketika saya mematikan layanan SQL Server pada server utama failover otomatis berfungsi seperti pesona, tetapi jika saya mengambil server utama offline (dengan mematikan server atau mematikan kartu jaringan) failover otomatis tidak berfungsi dan saya situs web hanya kali.

Saya menemukan artikel ini di mana posting terakhir kedua menunjukkan bahwa itu karena kami menggunakan pipa bernama yang tidak berfungsi ketika prinsipal offline, tetapi kami memaksa TCP dalam string koneksi kami.

Apa yang saya lewatkan agar kegagalan otomatis DB ini berfungsi?


Apakah ini membutuhkan tag [C #]? Tampaknya tidak khusus untuk C # dengan cara apa pun.
Gabe

Jawaban:


6

Setelah bekerja dengan MS selama seminggu, kami telah mengetahui mengapa ini terjadi.

Pada dasarnya, aplikasi tidak gagal karena perlu memastikan bahwa database telah gagal - dan koneksi sql adalah waktu sebelum koneksi menentukan bahwa db telah gagal.

Proses untuk mengonfirmasi bahwa basis data telah gagal (dengan semua pengaturan registri tcp default) adalah untuk:

  1. coba berkomunikasi dengan kepala sekolah, pastikan itu bukan kepala sekolah lagi
  2. berkomunikasi dengan failover untuk memastikan kegagalan telah berakhir dan sekarang prinsipal baru.

Ketika kepala sekolah turun, komunikasi ini memakan waktu sekitar 21 detik karena akan:

  1. mencoba berkomunikasi dengan kepala sekolah, tunggu 3 detik, batas waktu
  2. coba berkomunikasi dengan kepala sekolah lagi, tunggu 6 detik, batas waktu
  3. coba berkomunikasi lagi dengan kepala sekolah, tunggu 12 detik, batas waktu
  4. cobalah untuk berkomunikasi dengan mitra failover, lihat bahwa ia telah gagal, jadi gagal dalam aplikasi.

Jadi jika koneksi sql Anda tidak menunggu 21 detik (mungkin lebih dalam kenyataan) maka akan habis sebelum menyelesaikan tarian ini dan itu tidak akan gagal sama sekali.

Solusi adalah mengatur batas waktu dalam string koneksi Anda ke nilai besar, kami menggunakan 60 detik hanya untuk aman.

Bersulang


0

Saya ingin tahu apakah kondisi kegagalan otomatis tidak terpenuhi pada saat pengujian Anda? Khususnya - jika database tidak disinkronkan dengan mirror (periksa keadaan mirroring dari sys.database_mirroring) pada saat kegagalan DAN / ATAU jika saksi dan mirror tidak terhubung pada waktu itu (uji melalui ping antara peran yang berpartisipasi).

Anda juga dapat memiliki situasi di mana Mitra dan Mirror Anda tidak terhubung satu sama lain - tetapi database mitra dan mirror masih terhubung ke saksi secara independen. Dalam hal itu saksi melihat tidak ada yang salah (dan karenanya tidak ada kegagalan). Tetapi Anda menyebutkan bahwa Anda menutup server itu sendiri, jadi ini sepertinya kurang mungkin.

Atau apakah Anda mengatakan bahwa failover pada akhirnya terjadi tetapi koneksi ulang Anda gagal? Dalam hal ini, waktu deteksi dan kegagalan bervariasi tergantung pada bagaimana prinsipal gagal dan total waktu untuk memulihkan mirror db.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.