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

9

Я настраиваю автоматический переход на другой ресурс БД в 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 в нашей строке подключения.

Чего мне не хватает, чтобы этот автоматический отказоустойчивый БД работал?

user62521
источник
Нужен ли для этого тег [C #]? Похоже, это не относится к C # в любом случае.
Гейб

Ответы:

6

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

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

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

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

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

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

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

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

ура

Trev
источник
0

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

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

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

Джо Сэк
источник