Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
Каким должен быть стандартный правильный способ определения failover переключения на другой нод AlwaysOn SQL кластера, для того чтобы запустить запрос еще раз из клиентского кода в частности на ADO.NET? Microsoft в этом случае закрывает конекшн и требует сделать повтор из клиентского кода. Но дело в том, что не все исключения от SQL должны запускать повтор: таймауты, пользовательский исключения из хранимых процедур, фатальные ошибки как DDL и тому подобное, никогда не должны. Вопрос в том как определить что исключение связано именно с failover событием для того чтобы уйти на повтор? Пока ничего лучшего, чем проверять статус коннекта на Broken и Closed после каждого ExecuteReader мы не придумали. Существует ли рекомендуемый Microsoft пример такого кода, best practices?
15 апр 17, 00:19    [20403943]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Ну, навскидку: запоминать имя сервера @@servername, после обрыва коннекта переподключаться и переспрашивать имя сервера -- если имя поменялось, то был failover.

Сообщение было отредактировано: 15 апр 17, 21:51
15 апр 17, 12:57    [20404347]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
Спасибо. Но вообще вопрос в том на что ориентироваться чтобы либо запускать повтор команды, либо пробросить exception наверх, если он никак не связан с failover. Если переспрашивать имя сервера, то с тем же успехом можно и попытаться повторить всю команду, если конечно атомарность транзакций не будет нарушена.

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

То есть получается что нет никаких специфических кодов ошибок для определения failover и единственный способ - проверить не закрылся ли коннект после ExecuteReader, и если закрылся, просто переоткрыть коннект и запустить запрос еще раз?

Вообще мне казалось что Майкрософт должен был бы рекомендовать правильный пример кода обработки повтора для failover. Но я пока не смог найти. Вообще это должна быть тема изъезженная вдоль и поперёк. Вы не встречали ничего подобного?
19 апр 17, 04:05    [20412969]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
aleks2
Guest
Valeriyr
Спасибо. Но вообще вопрос в том на что ориентироваться чтобы либо запускать повтор команды, либо пробросить exception наверх, если он никак не связан с failover. Если переспрашивать имя сервера, то с тем же успехом можно и попытаться повторить всю команду, если конечно атомарность транзакций не будет нарушена.

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

То есть получается что нет никаких специфических кодов ошибок для определения failover и единственный способ - проверить не закрылся ли коннект после ExecuteReader, и если закрылся, просто переоткрыть коннект и запустить запрос еще раз?

Вообще мне казалось что Майкрософт должен был бы рекомендовать правильный пример кода обработки повтора для failover. Но я пока не смог найти. Вообще это должна быть тема изъезженная вдоль и поперёк. Вы не встречали ничего подобного?


Осподи! Сколько бессмысленных слов.

1. Если коннект закрылся - откуда возьмется "специфический код ошибки"?
2. Дошло?
3. Только переподключившись можно узнать, что ты подключился уже к другому серверу.
19 апр 17, 07:35    [20413027]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
aleks2,

aleks2
Осподи! Сколько бессмысленных слов.


Вы наверное junior developer, который думает что все знает и все вокруг идиоты? Где та молодая шпана... (c) Удачи, правда, завидую вашему оптимизму. Желаю не растерять этот молодой задор и не потерять себя на этом пути Камикадзе (зачеркнуто) програмизма.

Специфические коды ошибок берутся из SqlException, представляете? В случае перекидывания на другой нод кластера AlwaysOn, SqlConnection закрывается внутри ADO.NET провайдера, потом выбрасывается SqlException, невороятно, да?

Прошу прощения конечно за костноязычность.

Ладно, все равно от вас тут толку мало. Вот нашел всякие стратегии по Transient Errors хоть и для Azure, буду изучать. Почему то не могу найти ничего подобного для AlwaysOn. Но похоже во многом одно и то же.

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-connectivity-issues
19 апр 17, 17:28    [20415910]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Valeriyr, гуглили по словам alwayson connection string?
19 апр 17, 17:50    [20416020]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Valeriyr
Специфические коды ошибок берутся из SqlException, представляете? В случае перекидывания на другой нод кластера AlwaysOn, SqlConnection закрывается внутри ADO.NET провайдера, потом выбрасывается SqlException, невороятно, да?
Не различите вы на стороне клиента, по какой причине прибит коннект. При фейловере (а вернее, когда реплика теряет статус NORMAL, там еще есть ситцуаций разных), сервер просто закрывает коннект на своей стороне не уведомляя об этом клиента. Я вообще не уверен, что протокол общения сервера и клиента содержит в себе физическую возможность такого уведомления.
19 апр 17, 18:00    [20416066]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Гавриленко Сергей Алексеевич
Я вообще не уверен, что протокол общения сервера и клиента содержит в себе физическую возможность такого уведомления.

А самое главное - это и не требуется!
19 апр 17, 18:02    [20416078]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
Сорри, я наверное не так выразился. Мне не нужно по большому счёту определять именно переключение кластера. Нам нужно обеспечить отказоустойчивость. При переключении alwayson, как и мироринга Майкрософт прерывает текущую команду и пробрасывает exception наверх, и дальше друзья девелоперы обрабатывайте как знаете, то есть переоткрыаайте коннект и делайте повтор. То есть нужно различать ошибки при которых перезапрос сервера может помочь, и failover это частный случай такой ошибки, и ошибки фатальные или юзерские при которых переспрашивать не надо. Тайм-аут запроса скорее всего не надо повторять чтобы не уложить сервер, а может и надо в других случаях. Дедлок виктим наверное надо. Raiseerror из хранимой не надо повторять. А network anavailable и т д включая переключение кластера главным образом обязательно надо.

В этом доке по ажуру разводится целая классификация transient errors, то есть таких после которых повтор может помочь, разных стратегий retry и даже application blocks для этих стратегий от 2013 года.

Вообщем я хотел найти правильный пример кода который позволяет обеспечить отказоустойчивость в случае AlwaysOn. У нас уже есть компонент для mirroring который проверяет не закрылся ли коннект после выполнения команды и делает ретрай. Похоже это будет работать и в случае AlwaysOn. Но в этом доке они ещё дальше идут и проверяют конкретные коды ошибок. Вообщем в идеале хотелось бы найти правильный рекомендованный пример кода как отправную точку, поскольку этих ситуаций туча, они возникают в реалтайм, поэтому плохо воспроизводятся и могут проявляться в бох знает каких комбинациях.
19 апр 17, 18:50    [20416256]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
buser,

bidet
Valeriyr, гуглили по словам alwayson connection string?


Блин, молодежь, не смешно ни разу.
19 апр 17, 19:01    [20416289]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37050
Valeriyr,

Вы все усложняете. Делайте рейтрай, скажем, три раза в любой непонятной ситуации.
Тем более, определить факт фейловера очень просто, я вам написал уже как.

А искать или ждать бест практис от МС -- это такое. "Не сотворите кумира" (с), бгг, думайте своей головой (тем более, вы тут демонстрируете, что вам чуть больше лет, чем молодежи, этот навык должен быть уже развит).

Сообщение было отредактировано: 20 апр 17, 01:59
20 апр 17, 01:52    [20416970]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
Гавриленко Сергей Алексеевич,

Это не от возраста зависит, а от отношения к задачам и коллегам. На себе все это проходил. И мне всего лишь чуть за 40. И я же сказал что искренне завидую.

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

Спасибо за идею. Хоть толком ответа найти и не удалось. Будем ставить alwayson, тестировать сначала очевидные кейсы, может от Ажуры что-то подойдет.
20 апр 17, 03:28    [20416993]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
Valeriyr
Member

Откуда:
Сообщений: 7
Ладно, как то неудачно закончилось мое второе пришествие на sql.ru. Лет 10 назад мне этот форум представлялся по другому.
Бывайте, попытаю счастья на англоязычных ресурсах. Извиняйте если чем задел.
20 апр 17, 03:41    [20416996]     Ответить | Цитировать Сообщить модератору
 Re: Помогите правильно подключиться к AlwaysOn  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
Valeriyr, удачи! Если что найдете, в чем я сомневаюсь - поделитесь здесь :)
20 апр 17, 11:09    [20417779]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить