Я настраиваю автоматический переход на другой ресурс БД в 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 по умолчанию) заключается в следующем:
Когда основной абонент не работает, это сообщение занимает около 21 секунды, потому что оно будет:
Так что, если ваше sql-соединение не ждет 21 секунду (возможно, больше в реальности), то время ожидания истекает до завершения этого танца, и оно вообще не будет переключаться при сбое.
Решение состоит в том, чтобы установить таймаут в строке подключения на большое значение, мы используем 60 секунд, чтобы быть в безопасности.
ура
источник
Мне интересно, не выполняются ли условия автоматического перехода на другой ресурс во время ваших тестов? В частности, - если база данных не синхронизирована с зеркалом (проверьте состояние зеркалирования из sys.database_mirroring) во время сбоя И / ИЛИ, если свидетель и зеркало не подключены в это время (тестирование посредством пингов между участвующими ролями).
Также может возникнуть ситуация, когда ваш партнер и зеркало не связаны друг с другом, но базы данных партнера и зеркала по-прежнему связаны со свидетелем независимо. В этом случае свидетель не видит ничего плохого (и, следовательно, никакой отказоустойчивости). Но вы упомянули, что выключили сам сервер, так что это звучит менее вероятно.
Или вы говорите, что аварийное переключение в конечном итоге происходит, но ваше повторное подключение не удается? В этом случае время обнаружения и восстановления после сбоя варьируется в зависимости от того, как произошел сбой принципала, и общего времени восстановления зеркальной базы данных.
источник