Потенциальная проблема при использовании обработчика сохранения сессии memcache в PHP - PullRequest
1 голос
/ 31 декабря 2010

У меня есть два веб-сервера с балансировкой нагрузки, и я использую обработчик сохранения сеанса memcache с путем сохранения, указывающим на два сервера memcache.Он настроен с избыточностью сеанса, установленной на два (количество серверов memcache).Таким образом, PHP записывает данные сеанса на оба сервера memcache, и когда я отключаю один из серверов, кажется, что все работает нормально, поскольку данные сеанса записываются на оба сервера memcache.

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

РЕДАКТИРОВАТЬ: я использую версию 2.2.6 пакета memcache PECL.

Ответы [ 3 ]

2 голосов
/ 31 декабря 2010

Это во многом связано с тем, как на самом деле распространяется memcache .По сути, вы инициализируете клиента списком из одного или нескольких серверов, которые он может использовать.Когда вы выполняете запись, данные отправляются только на один сервер, а не на все.

Клиент отвечает за хеширование ключа кэша, чтобы определить, к какому серверу он должен подключиться, как для чтения, так и для записи - тот же принципв виде хеш-таблицы, определяющей, в каком сегменте, вероятно, находится данный ключ. Некоторым memcache клиентам может быть предоставлена ​​информация о весе и т. д., чтобы сделать их решение более точным.инициализировать клиента двумя серверами, а затем отключить один из них.Если вы реконфигурируете (например, закомментируете) список серверов, то вы эффективно изменяете эту стратегию хеширования на лету, и она несовместима с той, которая используется для определения места хранения данных.Когда вы возвращаете другой сервер обратно, клиент повторно включает его в вычисление хэша, и затем , что становится несовместимым с тем, как данные были сохранены.

Типичный обходной путь для этого, который я видел, состоит в том, чтобы попытаться избежать изменения числа (или порядка) фактически запущенных экземпляров memcached , обычно путем подготовки нескольких резервных копий.Это могут быть узлы с меньшими ресурсами, работающие на том же компьютере, что и ваши другие экземпляры, если они вам нужны - и они даже не нуждаются в оперативном резерве, если вы вызываете их при изменении конфигурации memcache.

Очевидно, что если вы используете memcache для хранения «важных» данных, таких как информация о сеансе, которые не сохраняются в других местах, то вам больше важна поддержка такого рода целостности, чем если бы вы былина самом деле просто использовать его в качестве одноразового кэша, который, в худшем случае, на некоторое время повлияет на вашу производительность.Это действительно компромисс.

Стоит прочитать:

0 голосов
/ 15 июня 2012

Попробуйте использовать согласованную стратегию хеширования, используя следующий параметр php.ini:

memcache.hash_strategy = постоянного

Это позволяет добавлять или удалять серверы из пула, не вызывая ключидля переназначения на другие серверы.

http://blog.fedecarg.com/2008/12/24/memcached-consistent-hashing-mechanism/

0 голосов
/ 21 июля 2011

Согласно странице PECL Memcache, опция ini session_redundancy была доступна только с версии 3.0.0

http://pecl.php.net/package/memcache/3.0.0

Попробуйте загрузить последнюю версию и установить ее (pecl install / path / to / tgz) и посмотреть, по-прежнему ли вы получаете ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...