Сколько веб-серверов у StackOverflow / ServerFault?
Если ответ «более одного», то достигается ли Прилипчивость сеанса при опросе DNS?
Большие веб-сайты могут быть «сбалансированы по нагрузке» на нескольких машинах. Во многих настройках с балансировкой нагрузки пользователь может подключиться к любой из серверных машин во время сеанса. Из-за этого существует несколько методов, позволяющих многим машинам совместно использовать сеансы пользователя.
Выбранный метод будет зависеть от используемого стиля балансировки нагрузки, а также от доступности / емкости внутреннего хранилища:
Информация о сеансе хранится только в файлах cookie: Информация о сеансе (а не только идентификатор сеанса) хранится в файле cookie пользователя. Например, файл cookie пользователя может содержать содержимое его корзины покупок. Чтобы пользователи не могли подделать данные сеанса, вместе с файлом cookie может быть предоставлен HMAC. Этот метод, вероятно, наименее подходит для большинства приложений:
Балансировщик нагрузки всегда направляет пользователя на один и тот же компьютер: Многие балансировщики нагрузки могут устанавливать свои cookie сеанса, указывая, с какой серверной машины пользователь делает запросы, и направлять их на эту машину в будущем. Поскольку пользователь всегда направлен на одну и ту же машину, совместное использование сеанса между несколькими машинами не требуется. Это может быть полезно в некоторых ситуациях:
Общая серверная база данных или хранилище ключей / значений: Информация о сеансе хранится в бэкэнд-базе данных, к которой все веб-серверы имеют доступ для запроса и обновления. Браузер пользователя хранит файл cookie, содержащий идентификатор (например, идентификатор сеанса), указывающий на информацию о сеансе. Вероятно, это самый чистый метод из трех:
В целом, большинство динамических веб-приложений выполняют несколько запросов к базе данных или запросов к хранилищу ключей / значений, поэтому база данных или хранилище ключей / значений является логическим местом хранения данных сеанса.
Если ваш вопрос заключается в том, как поддерживать сеансы на нескольких интерфейсных веб-серверах, то обычно ответ заключается в использовании централизованной базы данных. Вместо того, чтобы полагаться на экземпляры веб-сервера для отслеживания файлов сеансов в локальных файловых системах, вы должны записать идентификаторы сеансов и данные в центральную БД, и вместо этого все веб-серверы будут извлекать данные оттуда.
Использование nemcached кажется хорошим решением, о котором не упоминал @David Pashley
Это означает наличие удаленного экземпляра memcached, совместно используемого всеми серверами, и использование расширения memcache PECL, которое предоставляет собственный обработчик сеанса.
Требуется всего лишь изменить два параметра в конфигурации php!
Вот хороший учебник http://www.dotdeb.org/2008/08/25/storing-your-php-sessions-using-memcached/
IIRC, в DotNetRocks # 440 они сказали один серверный период. Не знаю, так ли это до сих пор.
Изменить: на самом деле это было Hanselminutes # 134. Сожалею.
Вы можете установить cookie.
Вы можете вычислить хэш удаленного IP-адреса (в простейшем случае удаленные хосты с нечетными номерами переходят на сервер A, а хосты с четными номерами - на сервер B).
Похоже, вы также можете сделать это с помощью некоторых значений, которые остаются в исходной системе, если вы используете туннель ssl.
Обычно для каждого из вышеперечисленных механизмов требуется «обратный прокси-сервер» или какой-либо балансировщик нагрузки. Этот балансировщик нагрузки принимает трафик, а затем направляет его на тот сервер, на котором изначально был сеанс, на основе одного из вышеуказанных критериев.
Я не совсем понимаю, что вы имеете в виду под "опросом DNS".
а) Вы можете хранить информацию о сеансе в пользовательских файлах cookie. См. Файлы cookie без сохранения состояния, которые не хранят никаких данных на стороне сервера, но сохраняют состояние сеанса http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . б) Вы можете изменить внутреннее хранилище сеанса на базу данных или memcached. Чтобы исключить единую точку отказа, вы можете настроить репликацию базы данных или несколько узлов memcached. Обратите внимание, что memcached рекомендуется в таких настройках, где потеря состояния пользователя в сеансе не является большой ошибкой и не делает его очень несчастным. В случаях, когда сохранение состояния жизненно важно, используйте базы данных. И PHP, и Django, и Rails позволяют разработчику писать собственный бэкэнд сеанса.