Как создать веб-ферму ASP.NET?

Я ищу информацию о том, как создать веб-ферму ASP.NET, то есть как заставить приложение ASP.NET (изначально предназначенное для работы на одном веб-сервере) работать на 2, 3 , 10 и т.д. серверов?

Мы создали веб-приложение, которое отлично работает, когда, скажем, есть 500 пользователей одновременно. Но теперь нам нужно заставить его работать для 10 000 пользователей (одновременно работающих с веб-приложением).

Поэтому нам нужно настроить 20 веб-серверов и сделать что-то так, чтобы 10 000 пользователей могли работать с веб-приложением, набрав «www.MyWebApp.ru» в своих веб-браузерах, хотя их запросы будут обрабатываться. 20 веб-серверами без их ведома.

1) Существует ли специальное стандартное программное обеспечение для создания веб-фермы ASP.NET?

2) Или мы должны создать веб-ферму сами, передавая запросы между разными веб-серверами вручную (с использованием ASP.NET / C #)?

Я нашел очень мало информации о веб-фермах ASP.NET и масштабируемости в Интернете: в большинстве случаев статьи о масштабируемости рассказывают, как оптимизировать приложение ASP.NET и заставить его работать быстрее. Но я не нашел примера веб-приложения ASP.NET в стиле «Hello world», работающего на 2 веб-серверах.

Было бы здорово, если бы кто-нибудь мог разместить ссылку на статью или, что лучше, рассказать о своем собственном опыте в ASP.NET «веб-фермерстве» и решении проблем масштабируемости.

Спасибо, Михаил.


person Mikhail Glukhov    schedule 29.11.2009    source источник
comment
Я опоздал, но здесь описана хорошая отправная точка: docs.microsoft.com/en-us/iis/web-hosting/   -  person Ralph    schedule 05.07.2019


Ответы (4)


1) Есть ли специальное стандартное программное обеспечение для создания веб-фермы ASP.NET?

No.

2) Или мы должны сами создать веб-ферму, передавая запросы между разными веб-серверами вручную (с использованием ASP.NET / C #)?

No.

Чтобы построить веб-ферму, вам понадобится какая-то форма балансировки нагрузки. Примерно для 8 серверов вы можете использовать балансировку сетевой нагрузки (NLB), встроенную в Windows. Для более чем 8 серверов следует использовать аппаратный балансировщик нагрузки.

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

  1. Управление состоянием (файлы cookie, ViewState, состояние сеанса и т. Д.)
  2. Кеширование и аннулирование кеширования
  3. Загрузка базы данных (управление циклами приема-передачи, разбиение на разделы, дисковая подсистема и т. Д.)
  4. Управление пулом приложений (WSRM, сброс пула, разбиение на разделы)
  5. Развертывание
  6. Мониторинг

Если это может быть полезно, я освещаю многие из этих вопросов в своей книге: Сверхбыстрый ASP.NET: создавайте сверхбыстрые и сверхмасштабируемые веб-сайты с помощью ASP.NET и SQL Server.

person RickNZ    schedule 30.11.2009
comment
Большое спасибо, Ричард! А мы постараемся поискать информацию в вашей книге! - person Mikhail Glukhov; 30.11.2009
comment
Ричард, Википедия говорит, что NLBS предназначена для .. приложений без сохранения состояния (en.wikipedia.org/wiki/Network_Load_Balancing_Services < / а>). Эта информация верна или нет? Наше приложение абсолютно статично! - person Mikhail Glukhov; 30.11.2009
comment
Утверждение технически верно, но также вводит в заблуждение. Сам HTTP считается протоколом без сохранения состояния. Первое, что происходит на высоком уровне, - это то, что каждый входящий запрос от клиентов может быть направлен на любой из ваших веб-серверов. Эта функция выполняется NLB или аппаратным балансировщиком нагрузки. Чтобы любой сервер мог обрабатывать каждый запрос, состояние вашего приложения не может храниться на одном веб-сервере; он должен либо каким-то образом следовать запросу (например, ViewState), либо включаться в заголовки HTTP (файлы cookie), либо храниться в серверной базе данных. - person RickNZ; 30.11.2009

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

Вы также можете использовать циклический перебор DNS, но на 20 серверах, предположительно в 1 центре обработки данных, я не вижу смысла идти на такие безумные меры. Если у вас несколько центров обработки данных, об этом определенно стоит подумать (поскольку NLB не очень хорошо работает между центрами обработки данных).

Вы также должны быть уверены, что если пользователь меняет серверы, они не теряют свой сеанс. Самый простой способ - использовать базу данных состояния сеанса (настраивается в файле web.config, или вы можете сделать это на уровне сервера в конфигурациях IIS). Если вы не используете сеансы, просто отключите их в директиве Pages файла web.config и закончите. Вы также можете использовать сервер состояния сеанса, но у меня нет опыта в этом.

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

Надеюсь, это поможет.

person fyjham    schedule 29.11.2009
comment
Спасибо за ваш ответ! Затем мы начнем искать информацию о NLB и других вещах, которые вы упомянули в своем ответе. - person Mikhail Glukhov; 30.11.2009

Если вы сохраните свой сервер без состояния, это будет легко с хорошим маршрутизатором, который реализует некоторый протокол round-Robbin (который отправляет каждый вызов единственному опубликованному IP-адресу сервера на другой веб-сервер).

если он не без состояния (например, если требуется вход в систему или ssl), то вам нужно сохранить каждый сеанс на одном сервере.

Вот некоторая информация о маршрутизации запросов приложений MS - вы получите все там:

Балансировка нагрузки IIS

person Dani    schedule 29.11.2009
comment
Закрепленные соединения (необходимые для сохранения каждой сессии на одном сервере) в лучшем случае следует рассматривать как временный взлом; они не масштабируются и могут вызвать целый ряд проблем, включая трудности с планированием емкости, потерю соединений в случае сбоев сервера и т. д. - person RickNZ; 30.11.2009

Я бы не рекомендовал №2. Вам будет намного лучше с балансировщиком нагрузки.

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

Также проверьте использование в вашем коде переменных Application и Cache. Они будут разными на каждом веб-сервере. Если эти значения статичны, возможно, у вас нет проблем. Но если они могут измениться, вы можете получить разные значения на каждом веб-сервере.

Раньше была проблема с ViewState в 1.x, , как описано здесь . Я не уверен, существует ли эта проблема.

Затем необходимо внести некоторые изменения в машинный ключ в web.config, как описано в здесь.

person DOK    schedule 29.11.2009