Распространенные проблемы в Разработке невеб-Корпоративных приложений С поддержкой кластеров

Я должен переместиться, Windows основывал многопоточное приложение (который использует глобальные переменные, а также RDBMS для устройства хранения данных) к NLB (т.е. стабилизатор сетевой нагрузки) кластер. Общие архитектурные проблемы, которые сразу приходят на ум,

  • Глобальные переменные (которые оба читаются записанный/) должны будут быть перемещены в совместно используемую память. Каковы лучшие практики здесь? Действительно ли там что-нибудь доступно в Windows Clustering API для управления такими вещами?

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

5
задан Amro 2 July 2012 в 12:40
поделиться

3 ответа

Сначала я отвечу на часть вопроса о постоянном соединении, так как это проще. Все хорошие решения по балансировке нагрузки сети (включая встроенную в Windows Server службу Microsoft NLB, а также включая устройства балансировки нагрузки, такие как F5 BigIP) имеют возможность "приклеивать" отдельные соединения от клиентов к определенным узлам кластера на время соединения. В NLB от Microsoft это называется "Single Affinity", в то время как другие балансировщики нагрузки называют это "Sticky Sessions". Иногда есть предостережения (например, NLB от Microsoft прерывает соединения, если к кластеру добавляется новый член, хотя одно соединение никогда не переносится с одного хоста на другой).

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

Большинство кластерных приложений, которые я видел, будут хранить общее состояние (даже общее, нестабильное состояние, как глобальные переменные) в СУБД. В основном это неудобно. Для максимальной производительности можно также использовать базу данных в памяти . Но простота использования СУБД для всех разделяемых состояний (переходных и длительных), плюс использование существующих инструментов СУБД для высокой доступности, как правило, срабатывает для многих сервисов. Совершенство СУБД на порядок медленнее, чем глобальные переменные в памяти, но если общее состояние небольшое, вы все равно будете считывать данные из кэша СУБД, а если вы делаете сетевой прыжок для чтения/записи данных, то разница относительно меньше. Вы также можете добиться большой разницы, оптимизируя схему базы данных для быстрого чтения/записи, например, удаляя ненужные индексы и используя NOLOCK для всех запросов на чтение, где точная, до миллисекундная точность не требуется.

Я не говорю, что СУБД всегда будет лучшим решением для общего состояния, только то, что улучшение времени доступа в общее состояние обычно не является способом, с помощью которого приложения, балансирующие нагрузку, получают свою производительность - вместо этого, они получают производительность, удаляя необходимость синхронного доступа (и, особенно, запись в). в общем состоянии по каждому запросу. Это вторая вещь, которую я отметил выше: изменение приложения для уменьшения зависимости от общего состояния.

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

Для более сложных случаев, приложения могут переключаться с пессимистической валюты (предварительно проверив наличие ресурса) на Оптимистическую валюту (предполагая, что он доступен, а затем отказаться от работы позже, если вы закончили, например, продавая один и тот же товар двум разным клиентам!).

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

Я бы не стал утруждать себя использованием MSCS (Microsoft Cluster Service) в вашем сценарии. MSCS - это решение обхода отказа, что означает, что оно хорошо держит односерверное приложение высоко доступным, даже если один из узлов кластера выходит из строя, но вы не получите масштабируемости и простоты, которые вы получите от настоящей службы, балансирующей нагрузку. Я подозреваю, что у MSCS есть способы разделения состояния (на общем диске), но они требуют установки кластера MSCS, который включает установку обхода отказа, использование общего диска, и прочую сложность, которая не подходит для большинства приложений, балансированных по нагрузке. Лучше всего использовать базу данных или специализированное решение в области памяти для хранения общего состояния.

7
ответ дан 13 December 2019 в 22:11
поделиться
  1. Конкурентоспособность (Check out Apache Cassandra, et al)
  2. Скорость возникновения легких вопросов (если вы едете по стране или за границу, вы захотите интенсивно использовать транзакции)
  3. Резервное копирование и дедупликация (Такие компании, как FalconStor или EMC могут помочь в этой ситуации в распределенной системе. Я бы не стал недооценивать необходимость консультации здесь)
1
ответ дан 13 December 2019 в 22:11
поделиться

Что касается постоянного соединения, посмотрите правила порта , потому что правила порта определяют, какой порт tcpip обрабатывается и как.

MSDN :

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

В приложении asp.net постоянство состояния сеанса обеспечивается только тогда, когда включен параметр привязки клиентов; NLB направляет все TCP-соединения с одного IP-адреса клиента на один и тот же узел кластера. Это позволяет поддерживать состояние сеанса в памяти хоста;

Параметр сродства клиента гарантирует, что соединение всегда будет маршрутизироваться на сервере, на котором оно было установлено изначально; тем самым поддерживая состояние приложения.

Поэтому я считаю, что то же самое произойдет и с вашим многопоточным приложением на базе Windows, если вы используете параметр affinity.

  1. Балансировка сетевой нагрузки Рекомендации
  2. Веб-фермы с Служба балансировки сетевой нагрузки в Windows Server 2003 может помочь вам понять
2
ответ дан 13 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: