Назад | Перейти на главную страницу

Автоматическая отработка отказа БД в c # не работает, когда основной сервер физически отключается

Я настраиваю автоматическое переключение БД на C # с SQL Server 2008, и у меня есть «высокая безопасность с автоматическим зеркалом аварийного переключения» с использованием настройки свидетеля, и моя строка подключения выглядит так

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

Во время тестирования, когда я выключаю службу SQL Server на основном сервере, автоматическое переключение на другой работает как шарм, но если я отключаю основной сервер (путем выключения сервера или отключения сетевой карты), автоматическое переключение на другой не работает, и мой сайт просто время ожидания.

я нашел Эта статья где второй последний пост предполагает, что это потому, что мы используем именованные каналы, которые не работают, когда принципал отключается, но мы принудительно вводим TCP в нашу строку подключения.

Что мне не хватает, чтобы эта функция автоматического переключения БД работала?

Проработав неделю с MS, мы выяснили, почему это происходит.

По сути, приложение не выполняет аварийное переключение, потому что оно должно быть уверенным, что база данных аварийно завершила работу, а время ожидания соединения sql истекает до того, как соединение определит, что БД сбой.

Процесс подтверждения сбоя базы данных (со всеми параметрами реестра tcp по умолчанию) заключается в следующем:

  1. попытайтесь связаться с директором, убедитесь, что он больше не директор
  2. связаться с аварийным переключателем, чтобы убедиться, что он переключился и теперь он является новым участником.

Когда принципал не работает, это сообщение занимает около 21 секунды, потому что он:

  1. попробуйте связаться с главным, подождите 3 секунды, таймаут
  2. попробуйте снова связаться с принципалом, подождите 6 секунд, таймаут
  3. попробуйте снова связаться с принципалом, подождите 12 секунд, таймаут
  4. попробуйте связаться с партнером по отработке отказа, убедитесь, что он вышел из строя, поэтому выполните отработку отказа в приложении.

Итак, если ваше sql-соединение не ждет 21 секунду (возможно, больше в реальности), то его время истечет, прежде чем он закончит этот танец, и он вообще не будет сбой.

Решение - установить для тайм-аута в строке подключения большое значение, на всякий случай мы используем 60 секунд.

Ура

Мне интересно, не соблюдаются ли условия автоматического переключения при отказе во время ваших тестов? В частности, если база данных не синхронизирована с зеркалом (проверьте состояние зеркального отображения из sys.database_mirroring) во время сбоя И / ИЛИ, если свидетель и зеркало не подключены в это время (проверьте через эхо-запросы между участвующими ролями).

У вас также может быть ситуация, когда ваш партнер и зеркало не подключены друг к другу, но партнерская и зеркальная базы данных по-прежнему подключены к свидетелю независимо. В этом случае свидетель не видит ничего плохого (а значит, и переключения при отказе). Но вы упомянули, что отключили сам сервер, поэтому это звучит менее вероятно.

Или вы говорите, что в конечном итоге переключение произойдет, но повторное подключение не удастся? В этом случае время обнаружения и переключения при отказе зависит от того, как отказал принципал, и от общего времени восстановления зеркальной базы данных.