Отказоустойчивость сеансов реплицированной базы данных PHP

#php #mysql #session #failover #high-availability

#php #mysql #сеанс #отказоустойчивость #высокая доступность

Вопрос:

У меня есть 2 сервера, доступных для перехода на другой ресурс. База данных реплицируется (MySQL) как Master-Master, так что каждый сервер запускает копию полного стека. Я вижу, что таблица сеансов обновляется, когда я нахожусь на одном сервере, и после проверки запросов я вижу, что отправляется тот же PHPSESSID. Но, когда я меняю URL-адреса или переключаюсь на вспомогательный компьютер, мой сеанс прерывается, и мне приходится повторно входить в систему.

То же значение PHPSESSID отправляется на вторичном сервере, но сеанс не распознается. Привязывает ли Apache / PHP сеанс к этому конкретному блоку? Если да, то как я могу заставить их распознать сеанс, который уже есть в базе данных?

Ответ №1:

Примечание: Перенесено из «РЕДАКТИРОВАТЬ» в ответ, чтобы отметить как отвеченный

На самом деле найдено решение. «Проблема» заключается в исправлении Suhosin для защиты установки PHP. Suhosin поддерживает настраиваемые параметры шифрования данных сеанса на основе ключа шифрования, а также DocRoot приложения, поскольку у сервера восстановления был другой DocRoot, не было шансов, что зашифрованные данные будут прочитаны.

Я отредактировал suhosin.ini, чтобы добавить общий ключ шифрования, и отключил опцию шифрования DocRoot, и сеансы являются общими, как и ожидалось.

Решение с помощью: http://rommelsantor.com/clog/2011/02/06/php-shared-session-encoding-solution /

Ответ №2:

Если вы используете $_SESSION , то это привязано к этому серверу. Вы должны использовать cookie для отслеживания идентификаторов сеанса, а затем сопоставлять его с сеансом в БД.

Комментарии:

1. @drowe: Просмотрите эту функцию PHP: php.net/manual/de/function.session-set-save-handler.php

2. Я использую $ _SESSION, и у меня есть значение cookie в PHPSESSID, которое соответствует идентификатору в базе данных. Но, когда PHP пытается использовать данные сеанса, это приводит к сбоям. Какая часть этого привязана к конкретному серверу? И могу ли я переопределить это, чтобы один сервер распознал данные сеанса от другого?

3. Вам следует прочитать о том, как работают сеансы. Сеансы в PHP работают путем предоставления клиентам токена через cookie, а затем сохранения данных в $ _SESSION локально на диске. Когда клиент подключится снова, он воссоединит токен сеанса с данными, хранящимися на диске.

4. @JohnD — Данные сеанса хранятся не на диске, а в базе данных, которая реплицируется. Токен в файле cookie правильно передается между первичным и вторичным серверами — и вторичный сервер правильно считывает данные сеанса из базы данных, но затем (я полагаю) PHP считает это недопустимым и очищает его.

5. $ _SESSION в PHP сохраняется на диске.