Automatyczne przełączanie awaryjne DB w języku C # nie działa, gdy główny serwer fizycznie przechodzi w tryb offline

9

Konfiguruję automatyczne przełączanie awaryjne DB w C # z SQL Server 2008 i mam „wysokie bezpieczeństwo z automatycznym lustrem przełączania awaryjnego” przy użyciu konfiguracji świadka, a mój ciąg połączenia wygląda jak

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

Podczas testowania, kiedy wyłączam usługę SQL Server na głównym serwerze, automatyczne przełączanie awaryjne działa jak urok, ale jeśli przełączę główny serwer w tryb offline (przez zamknięcie serwera lub zabicie karty sieciowej) automatyczne przełączanie awaryjne nie działa, a mój strona właśnie się skończyła.

Znalazłem ten artykuł, w którym drugi ostatni post sugeruje, że jest tak, ponieważ używamy nazwanych potoków, które nie działają, gdy główny użytkownik przechodzi w tryb offline, ale wymuszamy TCP w ciągu połączenia.

Czego mi brakuje, aby ten automatyczny tryb failover bazy danych działał?

użytkownik62521
źródło
Czy to wymaga znacznika [C #]? W żaden sposób nie wydaje się być specyficzny dla C #.
Gabe,

Odpowiedzi:

6

Po tygodniu pracy ze stwardnieniem rozsianym, ustaliliśmy, dlaczego tak się dzieje.

Zasadniczo aplikacja nie przechodzi w tryb failover, ponieważ musi mieć pewność, że baza danych uległa awarii, a połączenie sql wygasło, zanim połączenie ustali, że baza danych uległa awarii.

Proces potwierdzania, że ​​baza danych uległa awarii (przy wszystkich domyślnych ustawieniach rejestru tcp) to:

  1. spróbuj komunikować się z głównym zleceniodawcą, zobacz, że nie jest on już zleceniodawcą
  2. komunikować się z przełączaniem awaryjnym, aby upewnić się, że nastąpiło przełączenie awaryjne i że jest to teraz nowa jednostka główna.

Gdy zleceniodawca nie działa, komunikacja trwa około 21 sekund, ponieważ:

  1. spróbuj komunikować się z głównym, odczekaj 3 sekundy, limit czasu
  2. spróbuj ponownie komunikować się z głównym, odczekać 6 sekund, upłynął limit czasu
  3. spróbuj ponownie skontaktować się z głównym, odczekać 12 sekund, upłynął limit czasu
  4. spróbuj komunikować się z partnerem przełączania awaryjnego, sprawdź, czy nastąpiło przełączenie awaryjne, więc przełączenie awaryjne w aplikacji.

Więc jeśli twoje połączenie sql nie czeka 21 sekund (prawdopodobnie więcej w rzeczywistości), to upłynie limit czasu, zanim zakończy ten taniec i wcale się nie zawiedzie.

Rozwiązaniem jest ustawienie limitu czasu w ciągu połączenia na dużą wartość, używamy 60 sekund, aby być bezpiecznym.

Twoje zdrowie

Trev
źródło
0

Zastanawiam się, czy warunki automatycznego przełączania awaryjnego nie są spełnione w czasie testów? W szczególności - jeśli baza danych nie jest zsynchronizowana z kopią lustrzaną (sprawdź stan kopii lustrzanej z sys.database_mirroring) w momencie awarii ORAZ / LUB jeśli świadek i kopia lustrzana nie są w tym czasie połączone (przetestuj za pomocą pingów między uczestniczącymi rolami).

Możesz również mieć sytuację, w której Twój Partner i Mirror nie są ze sobą połączone - ale bazy danych partnera i Mirror są nadal połączone niezależnie ze świadkiem. W takim przypadku świadek nie widzi nic złego (a zatem nie ma pracy awaryjnej). Ale wspomniałeś, że zamknąłeś sam serwer, więc brzmi to mniej prawdopodobne.

A może mówisz, że przełączenie awaryjne w końcu się zdarza, ale ponowne połączenie nie powiedzie się? W takim przypadku czas wykrywania i przełączania awaryjnego różni się w zależności od tego, w jaki sposób jednostka główna uległa awarii i całkowity czas na odzyskanie bazy danych kopii lustrzanej.

Joe Sack
źródło