Сколько веб-серверов имеет StackOverflow / ServerFault?
Если ответ «больше, чем один», то достигает ли он Session Stickiness при опросе DNS?
Сколько веб-серверов имеет StackOverflow / ServerFault?
Если ответ «больше, чем один», то достигает ли он Session Stickiness при опросе DNS?
Ответы:
Большие веб-сайты могут быть «сбалансированы по нагрузке» на нескольких машинах. Во многих установках с балансировкой нагрузки пользователь может подключиться к любому из базовых компьютеров во время сеанса. Из-за этого существует ряд методов, позволяющих многим машинам совместно использовать пользовательские сеансы.
Выбор метода будет зависеть от стиля балансировки нагрузки, а также от доступности / емкости внутреннего хранилища:
Информация о сеансе сохраняется только в файлах 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 . Сожалею.
Вы можете установить печенье.
Вы можете вычислить хэш удаленного IP-адреса (на простейших удаленных хостах с нечетными номерами переходить на сервер A, хосты с четными номерами переходить на сервер B).
Похоже, вы также можете сделать это через некоторые значения, которые остаются с исходной системой, если вы используете туннель ssl.
Как правило, для каждого из перечисленных механизмов требуется «обратный прокси-сервер» или какой-либо балансировщик нагрузки. Этот балансировщик нагрузки принимает трафик и затем направляет его на тот сервер, на котором изначально был сеанс, на основе одного из вышеуказанных критериев.
Я не уверен, однако, что вы подразумеваете под "опрос DNS"
а) Вы можете хранить информацию о сеансе в файле cookie пользователя. См. Защищенные файлы cookie без сохранения состояния, которые не хранят данные на стороне сервера, но сохраняют состояние сеанса http://www.cl.cam.ac.uk/~sjm217/papers/protocols08cookies.pdf . б) Вы можете изменить внутреннее хранилище сессии на базу данных или memcached. Чтобы устранить единственную точку отказа, вы можете установить репликацию базы данных или несколько узлов memcached. Обратите внимание, что memcached рекомендуется в таких установках, где потеря пользовательского состояния в сеансе не является большой ошибкой и не делает его очень несчастным. Для случаев, когда сохранение состояния жизненно важно, используйте базы данных. И PHP, и Django, и Rails позволяют разработчику создавать собственные бэкенды сессий.