none
RDS HA, невозможно завершить сеанс пользователя при потере сетевого соединения одного из серверов. RRS feed

  • Вопрос

  • Прошу помощи уважаемого сообщества.
    Уже месяц не могу найти решение и ввести сервера в "продакшн".

    Имеется лабораторная среда RDS HA из двух виртуальных серверов Windows Server 2012 R2, все RDS роли установлены на обоих серверах.
    Делал все по статьям:
    https://www.microsoftpressstore.com/articles/article.aspx?p=2346349&seqNum=4
    https://blogs.msdn.microsoft.com/rds/2012/06/27/rd-connection-broker-high-availability-in-windows-server-2012/
    https://habrahabr.ru/sandbox/49629/

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

    Имеется ли какая-то возможность завершить зависший сеанс, чтобы пользователь мог войти на другой сервер? И если это нормальное поведение RDS HA, в чем смысл такой отказоустойчивости\доступности?

    Благодарю за возможный ответ.












    • Изменено Gorokhovsky 28 марта 2016 г. 12:23
    28 марта 2016 г. 12:16

Все ответы

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

    Зачем это нужно:

    Представим ситуацию что одна нода теряет сеть с интервалами в 5 минут и находит соответственно 

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

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

    Попробуйте так же рекомендации из этого обсуждения 

    https://social.technet.microsoft.com/Forums/windowsserver/en-US/6b020f13-dbdc-4387-9277-caccd5e95924/how-to-close-clear-rd-connection-broker-sessions?forum=winserverTS

    The opinion expressed by me is not an official position of Microsoft


    • Изменено Vector BCOModerator 28 марта 2016 г. 20:37
    • Предложено в качестве ответа Avendil 29 марта 2016 г. 7:49
    • Отменено предложение в качестве ответа Gorokhovsky 30 марта 2016 г. 9:26
    28 марта 2016 г. 20:31
    Модератор
  • Спасибо за развернутый ответ!
    Извиняюсь, что долго не писал - к сожалению с Windows Phone 8.1 нет возможности отвечать здесь.

    По ссылке, что вы порекомендовали "Please see the following guide for more information:
    http://www.microsoft.com/en-us/download/details.aspx?id=29006" нет файла. Да и обсуждение никаких мыслей, кроме как переустанавливать ферму HA не дало.

    Подскажите пожалуйста, как элементарно выгнать пользователя (он там уже месяц сидит:) с неработающего сервера? Удалением из коллекции проблему не решить, отключение\завершения сеанса - выдает ошибку "unable to disconnect session N".

    Представим вышло из строя комплектующее сервера, нужно время (допустим несколько часов) на его замену. Как в таком случае поступать?
    • Изменено Gorokhovsky 30 марта 2016 г. 7:06
    30 марта 2016 г. 7:01
  • Позвольте полностью развею ваши идеи. Если делаешь отключение (power off) сервера на котором висит пользователь, то его сеанс так же зависает, пока сервер не включишь. То есть ни о каких открытых программах, документах и т.д. речи быть не может. Пользователи должны просто переключиться на рабочий сервер, пускай и с потерями (авария есть авария).

    30 марта 2016 г. 9:31
  • как второму серверу узнать о том что произошел poweroff?

    уберите брокер из схемы и настройте 2012 сервера по инструкции от 2008 получите желаемое


    The opinion expressed by me is not an official position of Microsoft


    30 марта 2016 г. 10:26
    Модератор
  • Так для чего им база в SQL нужна? Так и должен узнать второй сервер об отсутствии первого. Не для этого ли? High Availability заключается в том, что только "новые" пользователи могут подключиться к рабочему серверу... А шума то с RDS HA. Предлагаю совместно разобраться с вопросом, найти способ, скрипт и т.д., чтобы не разрушая ферму "выкидывать" зависших пользователей с неработающего сервера. Буду благодарен за любые идеи, даже неподдерживаемые.

    • Изменено Gorokhovsky 30 марта 2016 г. 10:50
    30 марта 2016 г. 10:48
  • Так для чего им база в SQL нужна? Так и должен узнать второй сервер об отсутствии первого. Не для этого ли? High Availability заключается в том, что только "новые" пользователи могут подключиться к рабочему серверу... А шума то с RDS HA. Предлагаю совместно разобраться с вопросом, найти способ, скрипт и т.д., чтобы не разрушая ферму "выкидывать" зависших пользователей с неработающего сервера. Буду благодарен за любые идеи, даже неподдерживаемые.

    база sql нужна для того что бы оба сервера знали где регались пользователи, раньше эту роль можно было кластеризировать но в случае падения основной ноды были косяки у живых пользователей при логоф\логоне 

    сейчас если ваш пользователь со второй ноды выйдет он на вторую и попадет

    если у вас в ферме серверов 2 эта схема может выглядеть непрозрачно но представьте что у вас серверов 10, в таком случае на одном сервере получите зависших пользователей но на остальных 9 все будут работать как и раньше

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


    The opinion expressed by me is not an official position of Microsoft

    30 марта 2016 г. 10:57
    Модератор
  • Буду очень признателен. Не проблема, могу добавить еще несколько серверов в ферму. Так собственно и планировалось. Так же рассматривали разместить сервера на разных территориях. И в случае выхода из строя сервера на территории А, пользователи переключаются на сервер находящийся на территории Б.
    30 марта 2016 г. 11:04
  • Посмотрите так же соседнее обсуждение возможно вам чем то пригодится

    https://social.technet.microsoft.com/Forums/ru-RU/a8fc935e-95c3-40b7-82d6-60056e839c82/-rds-c-?forum=WS8ru#959c91eb-7b91-44c9-ae64-f36d4994e49e


    The opinion expressed by me is not an official position of Microsoft

    30 марта 2016 г. 11:18
    Модератор
  • Спасибо за разъяснение идеи работы данного решения.

    Но мне неясен такой вопрос: что делать в такой ситуации - 

    один из серверов фермы с некоторым количеством работающих пользователей, выйдет из строя на неопределенное время, либо совсем выйдет из строя и его придется либо застрелить, либо восстановить из резервной копии.

    Все это время пользователи захлопнувшиеся на этом сервере будут ждать и не смогут работать?

    Вариант аварийного отключения сессий должен быть обязательно и я уверен, что это недоработка инженеров Microsoft. Могли хотя бы PS CmdLet какой-то сделать.

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


    • Изменено den1049 30 марта 2016 г. 12:55 опечатка
    30 марта 2016 г. 12:55
  • У вас как администратора есть право кильнуть сессию

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

    Собиру ферму смогу сказать что то более конкретно

    У вас обновы на серверах стоят?


    The opinion expressed by me is not an official position of Microsoft

    30 марта 2016 г. 13:54
    Модератор
  • Конечно, все обновления установлены.

    30 марта 2016 г. 13:59
  • Какой командой выкинуть пользователя? И с какого сервера выполнять команду с работающего брокера?
    • Изменено Gorokhovsky 30 марта 2016 г. 18:25
    30 марта 2016 г. 14:08
  • Через GUI переключал активный брокер на работающий сервер, в столбце справа вижу активную сессию как на скриншоте сверху, кликаю на ней ПКМ, нажимаю disconnect и получаю "unable to disconnect session 0". И эта проблема не данной фермы, а любой, встречаюсь с RDS HA не в первые.
    30 марта 2016 г. 14:16
  • В продолжение разговора, хочу приложить скриншоты где видно, что нет возможности завершить зависшую сессию никаким доступным способом, ни через PowerShell ни через GUI. И даже перезагрузка оставшегося рабочего брокера не решает проблему. Т.е. для того, чтобы отключить зависших пользователей необходимо разобрать ферму?! Есть ли какие-нибудь специалисты, которые смогут прокомментировать данный вопрос? Технология RDS HA не работает, ни о какой доступности речи быть не может! Проблема всплывает на соседних форумах, но все разводят руками. Ни у кого сервера не ломаются? Программы работаю без ошибок? Жду ответа технических специалистов Microsoft.

    1 апреля 2016 г. 9:14
  • К сожалению руки до эксперимента не дошли, но есть такие соображения

    1 удалять сервер из коллекции бессмысленно так как вы видите перед собой работу брокеров а брокеры хранят информацию в базе

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


    The opinion expressed by me is not an official position of Microsoft


    4 апреля 2016 г. 6:51
    Модератор
  • О базе до этого я и упомянул. Собственно, коллега den1049, который писал выше нашел способ, как с помощью SQL выкидывать пользователей со сломанного брокера. Посоветовавшись с коллегами, пришли к выводу, что RDS HA просто не доработана. Если кто-то столкнется с проблемой, открывайте базу в SQL Management Studio, ищите таблицу с пользователями RDP и дропайте их.
    4 апреля 2016 г. 10:04
  • Это можно делать в том числе и скриптом

    Запушить запрос в sql  не сложно


    The opinion expressed by me is not an official position of Microsoft

    4 апреля 2016 г. 16:35
    Модератор
  • Поменяйте активный RD Broker, обновите список пользователей. 
    4 апреля 2016 г. 20:25
    Отвечающий
  • Выше в обсуждении сказано, что это не помогает! Как и не помогает удаление неактивного брокера (скриншоты выше).
    4 апреля 2016 г. 21:17
  • Да, я прочитал, но Вы зачем-то делаете "дисконнект" пользователю которого нет, повторюсь - обновите список пользователей.
    5 апреля 2016 г. 3:24
    Отвечающий
  • Извиняюсь, что долго не отвечал. Вы сами пробовали делать то, что говорите? Я пробовал и ни раз. Вообще, если логично подумать, то при удалении неработающего брокера активным делается соответственно работающий и список пользователей обновляется. Но я не поленился сделать то, что Вы предлагаете и как ожидалось итог тот же.


    Собственно не работает аварийное отключение пользователей. Надеюсь разработчики заметят это раньше, чем возникнет проблема у кого-то из пользователей.
    • Изменено Gorokhovsky 6 апреля 2016 г. 8:58
    6 апреля 2016 г. 8:56
  • Абсолютно аналогичная ситуация! Решилась простым способом! Разнесите роли следующим образом: session host отдельно, web-access,gateway,broker -на другие машинки!

    Вырубаю сервер, спустя 2-3 минуты брокер сам отрубает зависшие сеансы с нужного session host. Пользователи могут перелогинится и их направят на другой session host.

    В схеме где всего 2 сервера и все роли на них, да корректно не работает!

    • Предложено в качестве ответа AlekseyKl 5 октября 2016 г. 9:24
    6 апреля 2016 г. 12:39
  • Сервера денег стоят, если разносить получается дорого. Хотелось бы чтобы работало так, как заявлено. Вот, если кому то нужно рабочие команды, для дропа сессий:

    Команда SQL для дропа сессии (Брокер lab-srv-app-02, база в MS SQL lab-app, пользователь которого выкидываем admin):

     

    DELETE

    FROM [lab-app].[rds].[Session]

    WHERE TargetId IN (

    SELECT [Id]

    FROM [lab-app].[rds].[Target]

    WHERE [Netbios]='LAB-SRV-APP-02'

      )

     

     

    Все с указанного ('LAB-SRV-APP-02')сервера

    Можно и по пользователям

     

    DELETE

    FROM [lab-app].[rds].[Session]

    WHERE UserName='admin'

     

     

    Это пример, как выполнить SQL команду из CMD либо PS

     

    "C:\Program Files\Microsoft SQL Server\110\Tools\Binn\SQLCMD.EXE" -S localhost\sqlexpress -i "C:\Backup_WeighmanSystem.sql"

    • Предложено в качестве ответа Chelbsik 6 апреля 2016 г. 13:54
    6 апреля 2016 г. 13:11
  • Да согласен дороже!

    Но с дропом сессий из SQL БД тоже вариант рабочий, но не автоматический! А здесь упал сервер, даже если нету админа на месте люди сами перелогиняться! В общем решает необходимый уровень доступности!

    6 апреля 2016 г. 13:18
  • На 3м сервере (например ад)создаете шедульную задачу которая раз в 5 минут сервера пинает пингом и дропает сессии на том сервере который не ответил...

    The opinion expressed by me is not an official position of Microsoft

    6 апреля 2016 г. 13:28
    Модератор
  • Как вариант можно и так!

    Но время автономности снижается на чуть-чуть!

    6 апреля 2016 г. 13:37
  • Точно такая же проблема. К сожалению, конфигурация из двух серверов со всеми ролями не работает.
    6 апреля 2016 г. 13:56