Автовідмовлення DB в c # не працює, коли основний сервер фізично не працює в автономному режимі


9

Я налаштовую автоматичну відмову DB в 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 у нашому рядку з'єднання.

Що мені не вистачає, щоб ця автоматична аварійна помилка DB працювала?


Чи потрібен цей тег [C #]? Схоже, це ніяк не є специфічним для C #.
Гейб

Відповіді:


6

Пропрацювавши з MS протягом тижня, ми з’ясували, чому це відбувається.

По суті, програма не виходить з ладу, тому що вона повинна бути впевнена, що база даних закінчилася невдало - і з'єднання sql закінчується до того, як з'єднання визначить, що db не вдався.

Процес підтвердження того, що база даних не вдалася (з усіма типовими налаштуваннями реєстру tcp), полягає в тому, щоб:

  1. спробуйте спілкуватися з довірителем, дивіться, що він більше не є головним
  2. спілкуватися зі збоєм, щоб переконатися, що він не вдався, і що тепер він є новим головним.

Коли принцип не працює, цей зв’язок займає близько 21 секунд, оскільки це:

  1. спробуйте спілкуватися з директором, зачекайте 3 секунди, час очікування
  2. спробуйте спілкуватися з директором ще раз, зачекайте 6 секунд, час очікування
  3. спробуйте спілкуватися з директором ще раз, зачекайте 12 секунд, час очікування
  4. спробуйте спілкуватися з партнером, який перебуває у відмові, переконайтеся, що він не вдався, тому не працюйте в програмі.

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

Рішення полягає в тому, щоб встановити велике значення тайм-ауту у вашій лінії зв'язку, ми використовуємо 60 секунд, щоб бути безпечними.

Ура


0

Цікаво, чи не виконуються умови автоматичного відмови на час ваших тестів? Зокрема - якщо база даних не синхронізована з дзеркалом (перевірити стан дзеркального відображення від sys.database_mirroring) у момент відмови ТА / АБО, якщо свідок та дзеркало не підключені на той час (тест через пінг між ролями, що беруть участь).

Також у вас може виникнути ситуація, коли ваш партнер та дзеркало не пов'язані один з одним - але партнери та дзеркальні бази даних все ще підключаються до свідка незалежно. У такому випадку свідок не бачить нічого поганого (а значить, і жодної аварії). Але ви згадали, що ви відключили сам сервер, тому це звучить менш вірогідно.

Або ви говорите про те, що помилка в підсумку трапляється, але ваше повторне підключення не вдається? У цьому випадку час виявлення та відмовлення змінюється залежно від того, яким принципом не вдалося і загального часу для відновлення дзеркала.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.