Рекомендации по архитектуре для сайта ASP.NET с балансировкой нагрузки

StackOverflow https://stackoverflow.com/questions/613568

Вопрос

ОБНОВЛЕНИЕ 21 мая 2009 г.

Я тестировал метод №2 с использованием одного сетевого ресурса.Это приводит к некоторым проблемам с Windows Server 2003 под нагрузкой:

http://support.microsoft.com/kb/810886

завершить обновление

Я получил предложение по созданию веб-сайта ASP.NET, который работает следующим образом:

Аппаратный балансировщик нагрузки -> 4 веб-сервера IIS6 -> БД SQL Server с отказоустойчивым кластером

Вот в чем проблема...

Выбираем, где хранить веб-файлы (aspx, html, css, изображения).Было предложено два варианта:

1) Создайте идентичные копии веб-файлов на каждом из 4 серверов IIS.

2) Поместите одну копию веб-файлов в общий сетевой ресурс, доступный для четырех веб-серверов.Корневые веб-сайты на четырех серверах IIS будут сопоставлены с одним общим сетевым ресурсом.

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

Для сравнения: это веб-сайт, который в настоящее время посещается примерно 20 миллионами человек в месяц.На недавнем пике он получал около 200 обращений в секунду.

Пожалуйста, дайте мне знать, если у вас есть конкретный опыт работы с такой настройкой.Спасибо за вклад.

ОБНОВЛЕНИЕ 5 марта 2009 г.

Чтобы прояснить мою ситуацию: «развертывания» в этой системе происходят гораздо чаще, чем в типичном веб-приложении.Веб-сайт — это интерфейс для CMS бэк-офиса.Каждый раз, когда контент публикуется в CMS, новые страницы (aspx, html и т. д.) автоматически передаются на действующий сайт.Развертывания в основном осуществляются «по требованию».Теоретически этот толчок может произойти несколько раз в течение минуты или более.Поэтому я не уверен, что было бы практично развертывать по одному веб-серверу за раз.Мысли?

Это было полезно?

Решение

Я бы разделил нагрузку между 4 серверами. Это не так много.

Вы не хотите ни единой точки разногласия ни при развертывании, ни той единственной точки отказа в производстве.

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

Мы использовали эту стратегию в ферме более 200 веб-серверов, и она отлично работала для развертывания без прерывания обслуживания.

Другие советы

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

Развертывание ваших веб-ресурсов в любом случае автоматизировано (верно?), поэтому делать это несколькими способами не составляет большого неудобства.

Если это сложнее, чем вы предполагаете, возможно, что-то вроде DeltaCopy будет полезно для синхронизации этих дисков.

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

В IIS6 и 7 сценарий использования единого сетевого ресурса на N подключенных компьютерах веб-серверов / приложений явно поддерживается. MS провела множество тестов, чтобы убедиться, что этот сценарий работает хорошо. Да, кеширование используется. С сервером с двумя сетевыми картами, один для общедоступного Интернета и один для частной сети, вы получите действительно хорошую производительность. Развертывание пуленепробиваемое.

Стоит потратить время на его тестирование.

Вы также можете оценить поставщика виртуальных путей ASP.NET, который позволил бы вам развернуть один ZIP-файл для всего приложения. Или, используя CMS, вы могли бы обслуживать контент прямо из базы данных контента, а не из файловой системы. Это представляет некоторые действительно хорошие варианты для управления версиями.

VPP для ZIP через #ZipLib .

VPP для ZIP через DotNetZip .

В идеальной ситуации высокой доступности не должно быть единой точки отказа.

Это означает, что одно поле с веб-страницами — нет-нет.Проведя работу по обеспечению высокой доступности для крупной телекоммуникационной компании, я бы первоначально предложил следующее:

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

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

  • У нас было бы восемь серверов (в то время у нас было больше денег, чем можно было бы ткнуть палкой).Когда придет время перехода, четыре автономных сервера будут настроены на использование новых данных.
  • Затем балансировщик высокой доступности будет изменен для использования четырех новых серверов и прекращения использования старых серверов.Это сделало переключение (и, что более важно, обратное переключение, если мы забились) очень быстрым и безболезненным процессом.
  • Только когда новые серверы проработают какое-то время, мы сможем рассмотреть возможность следующего переключения.До этого момента четыре старых сервера находились в автономном режиме, но были готовы на всякий случай.
  • Чтобы получить тот же эффект с меньшими финансовыми затратами, вы можете иметь дополнительные диски, а не целые дополнительные серверы.Восстановление будет не таким быстрым, поскольку вам придется выключить сервер, чтобы снова вставить старый диск, но оно все равно будет быстрее, чем операция восстановления.

Я отвечал за разработку игрового веб-сайта, который посещал 60 миллионов человек в месяц. То, как мы это сделали, было вариантом № 1. Пользователь имел возможность загружать изображения и тому подобное, и они были помещены на NAS, который был разделен между серверами. Это сработало довольно хорошо. Я предполагаю, что вы также делаете кэширование страниц и так далее, на стороне приложения дома. Я бы также развернул по требованию новые страницы на всех серверах одновременно.

То, что вы получаете от NLB с 4IIS, вы теряете с BottleNeck с сервером приложений.

Для масштабируемости я рекомендую приложения на внешних веб-серверах.

Здесь, в моей компании, мы реализуем это решение.Приложение .NET во внешних интерфейсах и сервер приложений для Sharepoint + кластер SQL 2008.

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

с уважением!

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

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

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

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

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

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

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

Используйте инструмент развертывания, в котором процесс развертывается по одному, а остальная часть системы продолжает работать (как сказал Муфака). Это проверенный процесс, который будет работать как с файлами содержимого, так и с любым скомпилированным фрагментом приложения (развертывание которого приводит к перезапуску процесса asp.net).

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

Обновление: о вопросах в комментарии. Это индивидуальное решение, основанное на моем опыте работы с тяжелыми / длинными процессами, для которого требуется контролировать скорость их обновления. У меня не было необходимости использовать этот подход для сценариев развертывания, поскольку для такого динамического контента я обычно использую комбинацию БД и кеша на разных уровнях.

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

Изменения в БД будут сделаны в процессе публикации, опять же, вам просто нужно знать, где находится информация о необходимых изменениях, и позволить процессу / инструменту публикации обработать ее. Что касается того, что использовать для очереди, то основные из них, которые я использовал, - это msmq и пользовательская реализация с информацией на сервере sql. Очередь предназначена только для контроля скорости обновлений, поэтому вам не нужно ничего специально ориентированного на развертывание.

Обновление 2: убедитесь, что изменения в вашей БД обратно совместимы. Это действительно важно, когда вы отправляете изменения в реальном времени на разные серверы.

Предполагая, что ваши серверы IIS работают под управлением Windows Server 2003 R2 или выше, обязательно посмотрите Репликация DFS . Каждый сервер имеет свою собственную копию файлов, которая устраняет узкое место в общей сети, как многие другие предупреждали. Развертывание так же просто, как копирование ваших изменений на любой из серверов в группе репликации (при условии топологии полной сетки). Репликация позаботится обо всем остальном автоматически, в том числе используя дистанционное дифференциальное сжатие, чтобы отправлять только дельты файлов, которые были изменены.

Мы очень рады использовать 4 веб-сервера, каждый с локальной копией страниц, и SQL Server с отказоустойчивым кластером.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top