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ł?
źródło
Odpowiedzi:
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:
Gdy zleceniodawca nie działa, komunikacja trwa około 21 sekund, ponieważ:
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
źródło
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.
źródło