Сценарии высокой доступности служб Windows и подход к проектированию

Скажем, у меня есть автономная служба Windows, работающая на сервере Windows. Как убедиться, что он высокодоступен?

1). Какие все рекомендации по уровню дизайна вы можете предложить?

2). Как сделать его высокодоступным, как первичный / вторичный, например, решения кластеризации, доступные в настоящее время на рынке

3). Как решать сквозные проблемы в случае каких-либо сценариев переключения при отказе

Если вы можете придумать что-то еще, пожалуйста, добавьте его сюда ..

Примечание. Вопрос касается только окон и служб Windows, постарайтесь соблюдать это правило :)


person asyncwait    schedule 07.04.2010    source источник
comment
Не могли бы вы поделиться информацией о том, чем занимается ваша служба? Стратегии высокой доступности могут варьироваться в зависимости от того, что вы пытаетесь сделать.   -  person Justin Grant    schedule 30.04.2010
comment
Джастин, меня интересуют очень тривиальные службы Windows, такие как прослушивание сокетов или опрос / запись данных в некоторые базы данных / плоские файлы и т. Д.   -  person asyncwait    schedule 02.05.2010


Ответы (3)


Чтобы служба хотя бы работала, вы можете настроить диспетчер служб Windows на автоматический перезапуск службы в случае сбоя (см. Вкладку «Восстановление» в свойствах службы). Дополнительные сведения доступны здесь, включая пакетный сценарий для установки этих свойств - Перезапустить службу Windows в случае сбоя

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

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

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

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

На самом деле это лишь верхушка айсберга, но я надеюсь, что это даст вам идеи для начала дальнейших исследований.

Microsoft Clustering Service (MSCS)

person mdma    schedule 06.05.2010

Если вы разберете проблемы, которые пытаетесь решить, я думаю, вы, вероятно, сами дадите несколько ответов. Как упомянул Джастин в комментарии, ответа на этот вопрос нет. Это полностью зависит от того, что делает ваш сервис и как его используют клиенты. Вы также не указываете никаких подробностей о взаимодействии клиент-сервер. HTTP? ПТС? UDP? Другой?

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

1) Что вы будете делать, если служба или сервер выйдет из строя?

  • Как насчет запуска нескольких экземпляров вашей службы на разных серверах?

2) Хорошо, но как теперь клиенты узнают о множестве услуг?

  • Вы можете жестко закодировать список для каждого клиента (не рекомендуется)
  • Вы можете использовать циклический перебор DNS для отклонения запросов по всем из них.
  • Вы можете использовать устройство балансировки нагрузки.
  • У вас может быть отдельная служба, которая знает обо всех других службах и может направлять клиентов к доступным службам.

3) А что, если выйдет из строя одна служба?

  • Знают ли клиентские приложения, что делать, если служба, к которой они подключены, выходит из строя? В противном случае их необходимо обновить, чтобы справиться с этой ситуацией.

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

person Joe Doyle    schedule 05.05.2010

Если служба не предоставляет интерфейс для подключения клиентов, вы можете:

  • Транслировать или показывать сообщение «Я жив» или сигнализировать базе данных / реестру / tcp / независимо от того, что вы живы

  • Имейте вторую службу (монитор), которая проверяет эти сигналы «Я жив» и пытается перезапустить службу, если она не работает.

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

person Community    schedule 06.05.2010