Ana sunucu fiziksel olarak çevrimdışı olduğunda c # 'da DB otomatik yük devretme çalışmaz


9

SQL Server 2008 ile C # 'da DB otomatik yük devretme ayarlıyorum ve tanık kurulumunu kullanarak' otomatik yük devretme ayna ile yüksek güvenlik 'var ve bağlantı dizem gibi görünüyor

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

Test sırasında, ana sunucudaki SQL Server hizmetini kapattığımda otomatik yük devretme bir cazibe gibi çalışır, ancak ana sunucuyu çevrimdışı alırsam (sunucuyu kapatarak veya ağ kartını öldürerek) otomatik yük devretme çalışmaz ve benim web sitesi zaman aşımına uğradı.

Bu makaleyi buldum , ikinci son gönderi, asıl çevrimdışı olduğunda çalışmayan adlandırılmış kanallar kullandığımız için, ancak TCP'yi bağlantı dizemizde zorladığımız için önerdi.

Bu DB otomatik yük devretme çalışmasını sağlamak için ne eksik?


Bunun [C #] etiketine ihtiyacı var mı? Hiçbir şekilde C # 'a özgü görünmüyor.
Gabe

Yanıtlar:


6

MS ile bir hafta çalıştıktan sonra, bunun neden olduğunu anladık.

Temelde, uygulama başarısız çünkü veritabanı üzerinde başarısız olduğundan emin olmak gerekir - ve sql bağlantısı bağlantı db başarısız olduğunu belirlemeden önce zaman aşımına uğradı.

Veritabanının başarısız olduğunu onaylama işlemi (tüm varsayılan tcp kayıt defteri ayarlarıyla):

  1. müdürle iletişim kurmaya çalış, artık müdür olmadığını gör
  2. yük devrettiğinden ve şimdi yeni ana öğe olduğundan emin olmak için yük devretme ile iletişim kurun.

Müdür kapatıldığında, bu iletişim yaklaşık 21 saniye sürer, çünkü:

  1. müdürle iletişim kurmaya çalış, 3 saniye bekle, zaman aşımı
  2. müdürle tekrar iletişim kurmaya çalış, 6 saniye bekle, zaman aşımı
  3. müdürle tekrar iletişim kurmaya çalış, 12 saniye bekle, zaman aşımı
  4. yük devretme ortağı ile iletişim kurmaya çalışın, başarısız olduğunu görün, bu yüzden uygulamada başarısız olun.

Eğer sql bağlantınız 21 saniye (muhtemelen daha fazla gerçekte) beklemiyorsa, o zaman bu dansı bitirmeden önce zaman aşımına uğrayacak ve hiç başarısız olmayacaktır.

Çözüm, bağlantı dizenizdeki zaman aşımını büyük bir değere ayarlamaktır, sadece güvenli olmak için 60 saniye kullanıyoruz.

Şerefe


0

Testleriniz sırasında otomatik yük devretme koşullarının karşılanıp karşılanmadığını merak ediyorum. Özellikle - veritabanı, arıza sırasında ayna ile senkronize edilmezse (sys.database_mirroring'den yansıtma durumunu kontrol edin) VE / VEYA, tanık ve ayna o anda bağlı değilse (katılan roller arasındaki pingler yoluyla test edin).

Eşiniz ve Aynanızın birbirine bağlı olmadığı bir durum da olabilir - ancak ortak ve ayna veritabanları hala tanığa bağımsız olarak bağlıdır. Bu durumda tanık yanlış bir şey görmez (ve bu nedenle yerine çalışma). Ancak sunucunun kendisini kapattığınızdan bahsettiniz, bu yüzden bu daha az olasıdır.

Yoksa yük devretmenin sonunda gerçekleştiğini, ancak yeniden bağlantınızın başarısız olduğunu mu söylüyorsunuz? Bu durumda, algılama ve yük devretme süresi, asıl başarısızlık durumuna ve ayna db'sinin geri kazanılması için toplam süreye bağlı olarak değişir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.