
При запуске терминального сервера все понимают, что нужно сделать его надежным. От форс-мажоров никто не застрахован. Может «умереть» по причине износа какое-то железо, может отключиться электропитание. Кроме того, нужно подстраховаться от возможных выходов из строя различных программных компонентов, от перегрузок, связанных с перебросом всех запросов, например, на один брокер.
Меня зовут Дмитрий Руссу, я старший системный инженер в Orion soft. В этой статье я расскажу, как развернуть систему терминального доступа в отказоустойчивой конфигурации, опишу необходимые компоненты и настройки для решения этой задачи.
Чтобы система работала в отказоустойчивом режиме, нужно зарезервировать все компоненты, которые использует терминальный сервер. В стандартной архитектуре их шесть:
Терминальный сервер;
Шлюз, через который к нему получают доступ пользователи;
Служба каталога для авторизации пользователей;
Брокер подключений;
СУБД, используемые в системе;
Сервер балансировки.
Нужно обеспечить отказоустойчивость всех этих компонентов, но в этой статье мы поговорим пока что о тех, для которых мы провели наиболее детальные тесты. Если у вас возникнет интерес к построению отказоустойчивой конфигурации для других компонентов, пишите в комментариях — расскажем в одной из следующих статей нашего блога.
Собираем стенд
Чтобы проверить, как все это будет работать, мы собрали тестовый стенд со всеми этими компонентами и внезапно для системы отключали их. На схеме показано, как происходит дублирование инфраструктуры терминального доступа. Группа LDAP обеспечивает авторизацию пользователей в домене, брокеры устанавливают необходимые для работы соединения, через шлюзы происходит подключение пользователей, а в группе СУБД происходит хранение всей важной информации с дублирование. Балансировщики нагрузки распределяют потоки запросов, исходя из количества доступных ресурсов в группах.

Чтобы собрать такой стенд, в качестве балансировщика нагрузки мы выбрали HAProxy, развернули кластер PostgreSQL, установили и объединили в группу пару брокеров Termit, задублировали шлюзы и контроллеры доменов, создали группу терминальных серверов с резервированием.
СУБД
Для развертывания кластера PostgreSQL мы воспользовались проектом PostgreSQL High-Availability Cluster, который позволяет автоматизированно с помощью Ansible развернуть кластер PostgreSQL на основе patroni, etcd и vip-manager.

Балансировка
Мы будем использовать балансировщик типа HAProxy. Для этого необходимо прописать вручную адреса используемых шлюзов. Также HAProxy позволяет собрать статистику движения трафика.
Брокеры
Их нужно устанавливать по одному. Подробнее про пошаговую установку основного брокера можно почитать здесь, а про установку дополнительного — здесь. После подключения каждого брокера вы сможете увидеть соответствующее изменение на странице статистики HAproxy.

При включении нового сервера его статус меняется с «DOWN» на «UP» в разделах termit_servers, termit_servers_https и termit_servers_8443_https. Этот переход подтверждает успешное добавление сервера в систему балансировки нагрузки, обеспечивая увеличение ее отказоустойчивости и распределение нагрузки между доступными серверами для обработки запросов.
Терминальные серверы
Для установки терминальных серверов нужно выполнить преднастройку каждого сервера — указать некоторые параметры, установить Java или OpenJDK и X2Go Server, а также дополнительные сервисы, специфичные для разных ОС. После этого — запустить специальные скрипты для загрузки агентов.
Для достижения отказоустойчивости терминальных серверов нужно объединять их в группы. Тут нужно учитывать, что терминальные серверы объединяются только по одинаковым ОС. Linux можно объединить только с Linux, а Windows только с Windows.
Шлюзы
Чтобы балансировать шлюзы удаленного доступа, мы снова используем HAProxy. Если расписать задачу по этапам, то нужно:
Развернуть Docker, установить на 2 ВМ openssh-server и настроить доступы к СУБД. По шагам этот процесс расписан здесь;
Внести правки на HAProxy для настройки балансировки подключений к шлюзам.
Если будете делать это сами, обратите внимание: чтобы использовать HAProxy для TCP (SSH) балансировки, нужно будет сменить порт SSH по умолчанию, иначе невозможно будет подключиться к серверу HAProxy. Также нужно будет поправить конфигурационный файл, чтобы мы могли отслеживать статистику работы балансировщика шлюзов. Если все сделать правильно, в окне статистики будет видно, что оба шлюза работают.

LDAP-каталоги
Если вы создаете отказоустойчивую конфигурацию «с нуля», то вам нужно будет настроить HA для LDAP.
Устанавливаем LDAP на 2 сервера;
Настраиваем балансировку (достаточно будет механизма round robin на основе DNS-записей).
Настройка Termit
Termit использует информацию о пользователях, группах и их связи из LDAP-каталогов. Чтобы провести тест, мы предварительно создали в AD группы для ролей и приложений, а также завели сервисную учетную запись. В домене было создано подразделение termitusers (те, кто имеет доступ к системе Termit), которое синхронизируется с Termit. Все созданные пользователи и группы хранятся там. Для дальнейшей работы нужно просто настроить параметры этой синхронизации.
Вообще вы можете настроить несколько типов ролей в Termit.
Администраторы могут полностью контролировать систему, например, управлять серверами, пользователями и приложениями;
Служба поддержки может просматривать настройки, информацию о серверах и сессиях в разделе «Обзор», журнал событий и список сессий, а также завершать сессии и блокировать пользователей. Выполняет функцию L1 технической поддержки;
Пользователи обладают правами на запуск приложений и скачивание клиента Termit, используя учетную запись из LDAP-каталога.
Для нашего эксперимента достаточно будет только роли пользователя. Поэтому мы добавляем только одну группу категории «Пользователи».
Создание серверов
Создание серверов — задача достаточно рутинная. Для установки используется специальный скрипт. Подробная инструкция, как его применить, лежит здесь. Выполнив все шаги инструкции, вы получите команду для установки агентов. Достаточно запустить ее на сервере, чтобы запустить установку Termit-агента.

Далее нужно сформировать группу серверов, чтобы они могли работать в отказоустойчивом режиме. Сделать это достаточно просто — нужно поднять два сервера и провести настройку сессий, то есть добавить их в одну и ту же группу, которую мы назвали HA Group.

После этого нужно будет опубликовать приложения, задав им основные параметры, а также определив тех пользователей, которые будут иметь доступ к ним.
Наконец, после всех этих действий нужно установить клиента на том устройстве, с которого будет обеспечен доступ к системе. Для этого нужно перейти на портал Termit, войти в учетную запись и загрузить клиента.
Проверяем отказоустойчивость
А теперь — самое интересное. Давайте создадим разные условия, когда у нас отключается тот или иной компонент, и проверим, как все будет работать.
Отключаем один брокер. На странице статистики видно, что все запросы пошли через второй.

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

Кстати, в соответствующем разделе четко видно, что один брокер «упал».

База данных
Если мы отключаем мастер-ноду базы данных (FQDN машины – orion-db01.termit.lab), пробуем создать группу терминальных серверов на портале администрирования СТД Termit, что свидетельствует о надежности кластера и его способности к бесперебойной работе в случае сбоя одной из нод. Выполнение команды patronictl list дает следующее:

Это значит, что после выключения мастер-ноды (orion-db01) роль мастера была успешно переназначена на ноду orion-db02, которая стала новым мастером, а нода orion-db03 перешла в режим синхронного резерва. Кластер остается работоспособным и продолжает обеспечивать отказоустойчивость, несмотря на выход из строя одной из нод.
Отказ всех брокеров
Если последовательно отключить все брокеры, терминальные серверы продолжают работать.

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

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

При перезапуске сессии она стартует на доступном сервере. Все в порядке.

Шлюзы
При отключении одного из шлюзов сессии, идущие через него, переходят в статус «отключено».

На странице статистики HAProxy видим, что статус «UP» присвоен только одному из двух шлюзов, а значит, все сессии попадают через балансировщик нагрузки на него.

То есть балансировщик начинает работать только с «живым» шлюзом.
LDAP
И последнее, что мы проверим — отключение LDAP.

Когда доступен хотя бы один из двух серверов, все работает. Пользователи могут успешно обращаться к порталу администрирования и использовать десктопные клиенты, также происходит синхронизация LDAP с активным контроллером.
Вывод
Тестирование отказоустойчивости компонентов (брокеров, базы данных, терминальных серверов, шлюзов и LDAP) показало:
Способность обеспечивать стабильную работу даже при сбоях и отключении отдельных узлов, так как система успешно переключается на доступные ресурсы;
Готовность системы к работе в различных сценариях: отключение серверов, сбои в работе отдельных компонентов, и прочие аномальные ситуации, возникающие в процессе эксплуатации;
Готовность к работе в динамичной и требовательной среде. Внедрение Termit позволяет минимизировать риски простоев и обеспечить бесперебойную работу корпоративных приложений.
С помощью приведенных инструкций вы сможете собрать такую схему самостоятельно. Если по ходу чтения появились дополнительные вопросы, задавайте. Стабильной всем работы!