2012-05-15 2 views
3

У меня есть 3 сервера, настроенных для зеркалирования SQL и автоматического переключения на другой ресурс с использованием сервера-свидетеля. Это работает так, как ожидалось.Автоматический переход на другой ресурс с зеркалированием SQL и строками подключения

Теперь мое приложение, которое подключается к базе данных, похоже, имеет проблемы при возникновении сбоя - мне нужно вручную вмешаться и изменить строки подключения, чтобы он снова подключался. Лучшее решение, которое я нашел до сих пор, включает в себя параметр Failover Partner строки подключения, однако он не является ни интуитивным, ни полным: Data Source="Mirror";Failover Partner="Principal"found here.

Из примера в вышеприведенном блоге (сценарий №3), когда происходит первый переход на другой ресурс, а основной (партнер по отказоустойчивости) недоступен, вместо этого используется источник данных (который является новым директором). Если он снова не работает (и я только пробовал в течение ограниченного периода времени), тогда появляется сообщение об ошибке. Это происходит из-за того, что строка подключения кэшируется, поэтому пока обновление не будет обновлено, оно будет выходить с ошибкой (кажется, строка подключения обновляется через 5 минут после того, как она встречает ошибку). Если после перехода на другой ресурс я заменил источник данных и партнера по отказоустойчивости, у меня снова возникнет еще один «молчащий» переход на другой ресурс.

Есть ли способ полностью автоматизировать переход на другой ресурс для приложений, в которых также используются зеркальные базы данных (без видимых ошибок)?

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

ответ

2

Прочитайте сообщение в блоге здесь http://blogs.msdn.com/b/spike/archive/2010/12/15/running-a-database-mirror-setup-with-the-sqlbrowser-service-off-may-produce-unexpected-results.aspx

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

+0

Тогда почему он работает так, как ожидалось, при объединении соединений? – Shagglez

+0

Когда пулы соединений подключены к основным, имеющим вторичный (с сервера), хранящийся вместе с ним, будут сохранены для дальнейшего использования. Это те, которые не терпят неудачу. При отключении пула соединений создается новое соединение и каждый раз считывается из конфигурации. Они будут работать, поскольку они не могут подключиться к первичной, поэтому использует переход из конфигурации не для основного значения сервера для перехода на другой ресурс. –

+0

См. Здесь для более подробной информации: http://blogs.msdn.com/b/spike/archive/2010/12/08/clarification-on-the-failover-partner-in-the-connectionstring-in-database-mirror -setup.aspx –

0

Решения превратить Пулы соединений от Pooling="false"

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

+0

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

+0

Я не помню, чтобы быть честным, но требование состояло в том, чтобы иметь почти 0 простоя, поэтому я не мог дождаться этого долгого пути. – Shagglez

1

Вы можете очистить пул приложений в случае, если произошел переход на другой ресурс. Не очень хорошо знаю ;-)

// ClearAllPools resets (or empties) the connection pool. 
    // If there are connections in use at the time of the call, 
    // they are marked appropriately and will be discarded 
    // (instead of being returned to the pool) when Close is called on them. 
    System.Data.SqlClient.SqlConnection.ClearAllPools(); 

Мы используем его, когда мы изменить основной сервер с помощью псевдонима SQL Server, для обеспечения соблюдения «обновить» от имени сервера.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.clearallpools.aspx

+0

Как узнать, когда произошел переход на другой ресурс? Теоретически, если моему приложению известно о сбое базы данных, я мог бы просто изменить строки подключения. – Shagglez

+0

Не знаете, как вы знаете о произошедшем отказоустойчивости ... Вам нужно указать 2 сервера в строке подключения? Первичная и зеркальная? –

+0

yes using 'Data Source' и' Failover Partner' – Shagglez