Как сохранить пользовательские запросы на одном сервере при использовании IIS NLB? - PullRequest
7 голосов
/ 15 мая 2009

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

Ответы [ 6 ]

17 голосов
/ 15 мая 2009

Нашел это и решил поделиться с другими:

Используйте функцию привязки клиента. Когда привязка клиента включена, балансировка сетевой нагрузки направляет все TCP-соединения на один и тот же хост кластера. Это позволяет поддерживать состояние сеанса в памяти хоста. Вы можете включить привязку клиента в диалоговом окне Добавить / изменить правила порта в Диспетчере балансировки сетевой нагрузки. Выберите привязку Single или Class C, чтобы гарантировать, что только один хост кластера будет обрабатывать все соединения, которые являются частью одного сеанса клиента. Это важно, если приложение сервера, запущенное на хосте кластера, поддерживает состояние сеанса (например, файлы cookie сервера) между соединениями. Дополнительные сведения о сходстве балансировки сетевой нагрузки см. В справке в оснастке «Балансировка сетевой нагрузки».

3 голосов
/ 15 мая 2009

Я думаю, что вы ищете Sticky Sessions. Sticky сессии реализуются вашим балансировщиком нагрузки. Возможно, вам потребуется настроить внешний балансировщик нагрузки (BIG-IP, HAProxy и т. Д.), Который может выполнять липкие сеансы.

1 голос
/ 15 мая 2009

Вы можете сделать это легко, если никто из ваших клиентов не использует распределенную систему прокси:

В protieries кластера NLB, на вкладке «правила порта» вы можете выбрать «режим фильтрации» и сходство: Вы не можете выбрать «нет», потому что у вас нет центральных сессий. Но «простой» будет перенаправлять каждого пользователя на один и тот же сервер, если IP-адрес остается прежним. Если вы, например, AX-прокси-серверы Antiiapte, тогда «класс C» может быть безопасным выбором (хотя, возможно, и немного уменьшит балансировку нагрузки), поскольку одна и та же сеть класса C направляется на один и тот же сервер.

Я полагаю, что это легко реализуется MS так, что оба хоста знают, какой ip четный или нечетный или какой триплет сети класса C четный или нечетный, и распределяет нагрузку всегда одинаково в зависимости от IP адрес

0 голосов
/ 15 мая 2009

Просто чтобы добавить ответ Ллойда, вы все равно должны избегать использования сессии в среде с балансировкой нагрузки. Вся цель использования сессии - избежать вызовов базы данных; если вы сохраняете данные сеанса обратно в базу данных, вы обычно ничего не получаете.

Причина в том, что: 1. теперь вам нужно сделать 2 вызова базы данных для каждой загрузки страницы (извлечь и сохранить) и 2. что теперь данные должны пройти через границы сериализации / десериализации. В большинстве случаев это оказывается более дорогой операцией, чем просто получение данных, с которых вы хотели начать.

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

0 голосов
/ 15 мая 2009

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

Я знаю (используя его таким образом) Cherokee поддерживает IPHash-прокси, но я уверен, что есть и другие.

0 голосов
/ 15 мая 2009

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

...