2009-10-13 4 views
2

Можно ли подключить несколько веб-серверов к кластеру SQL Server и поддерживать сеанс пользователя?Как сохранить состояние на нескольких веб-серверах?

Я думал о различных подходах. Тот, который предлагает сайт Microsoft, должен использовать response.redirect для «правильного» сервера. Хотя я могу понять аргументы в пользу этого, похоже, это недальновидно.

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

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

ответ

2

Некоторые опции:

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

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

Вы можете использовать SQL-сервер для управления сеансом.

Проверьте это на сервере. https://serverfault.com/questions/19717/load-balanced-iis-servers-with-asp-net-inproc-session

+0

* * балансир нагрузки? Как вы уберетесь от этой единственной точки отказа? Если балансировка нагрузки умирает, то что? * Есть ли там реальный способ избежать этого или нет? – BobTheBuilder

+0

Что касается использования SQL-сервера для управления сеансом, не приведет ли это к проблемам собственной масштабируемости? т. е. необходимо захватить пользовательские данные из базы данных на каждом обновлении страницы? – BobTheBuilder

+0

Я фактически не использовал SQL-сервер для управления, поэтому я не могу говорить о масштабируемости. У меня не было бы только одного LB - у меня было бы минимум 2 и, возможно, до 5 (2x prod, 2x test, 1x dev) – Chuck

0

Хотя вы можете использовать «липкие» сеансы в вашем балансировщике нагрузки, более оптимальным путем является использование вашего сеанса на сервере состояний вместо InProc. В этот момент все ваши веб-серверы могут указывать на один и тот же государственный сервер и совместно использовать сеанс.

http://msdn.microsoft.com/en-us/library/ms972429.aspx MSDN есть много, чтобы сказать по теме: D

UPDATE:

Государственного Сервер сервис на Windows Server коробках, но да, это создает единую точку отказа.

Кроме того, вы можете указать сериализацию сеанса на SQL Server, который не был бы единственной точкой отказа, если бы вы ее обработали.

Я не уверен, насколько «тяжелая» рабочая нагрузка для государственного сервера, есть ли у кого-либо еще какие-либо показатели?

+0

Будет ли один «государственный» сервер не вводить не только одну точку отказа, но также означает, что он также работает для каждого запроса страницы на всех ваших серверах? Как вы обошли эту проблему? – BobTheBuilder

0

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

+0

Мы тоже об этом думали, и на самом деле можем пойти по этой дороге, поэтому я не хочу этого слышать. Просто я еще не готов принять это решение. Я хотел все варианты на столе, чтобы я мог принять обоснованное решение. Я думал, что это будет полезно и для других разработчиков. – BobTheBuilder

2

Я беру здесь из своего опыта Java App Servers, некоторые из которых имеют очень сложные алгоритмы балансировки.

Разумное общее предположение заключается в том, что «Сессионная Affinity» предпочтительнее балансировать каждый запрос. Если мы выделяем первоначальный запрос для каждого пользователя с некоторым уровнем знаний о рабочей нагрузке (или даже на случайной основе), и население приходит и уходит, мы получаем разумное поведение. Помните, что цель состоит в том, чтобы дать каждому пользователю хороший опыт, чтобы не оказаться равномерно используемым сервером!

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

+0

Хорошо, так что это приводит к вопросам о распространении состояния сеанса, если исходный сервер должен был выйти из строя или выйти из строя. Есть ли какая-либо передовая практика для достижения этой цели? – BobTheBuilder

+0

+1, Отличный ответ (ИМО), имел почти то же самое вещество сам. – AnthonyWJones

+1

@BobTheBuilder: Один из вариантов - нет, возьмите его на подбородок и двигайтесь дальше. Серьезно, если критически важно, чтобы пользователь не потерял то, что в противном случае мы считали бы volitile, если сервер сработает, объект Session не подходит для этих данных. – AnthonyWJones

Смежные вопросы