Подтвердить что ты не робот

Сессии Отказоустойчивость с PHP-memcache против memcached

Коллеги!

Я запускаю php 5.3 (5.3.8) с клиентской библиотекой memcache (2.2.6) (http://pecl.php.net/package/memcache) для работы с сервером memcached. Моя цель состоит в том, чтобы иметь решение для переключения на отказ в сеансе, а именно:

  • Поддержка только собственных php-сессий (без пользовательских обработчиков)
  • Немного memcached серверов в пуле

Я ожидаю, что в случае отказа одного из серверов memcached, php попытается использовать второй сервер в пуле [будет успешно подключаться к нему и стать счастливым], однако, когда первый сервер memcached в пуле будет недоступен я 'm получает следующую ошибку:

Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111)

в то время как соответствующие настройки php:

session.save_handler memcache
session.save_path tcp://10.0.10.111:11211?persistent=1&weight=1&timeout=1&retry_interval=10, tcp://10.0.10.110:11211?persistent=1&weight=1&timeout=1&retry_interval=10

и настройки memcache (пока я думаю, что он близок к стандарту):

Directive   Local Value
memcache.allow_failover 1
memcache.chunk_size 8192
memcache.default_port   11211
memcache.default_timeout_ms 1000
memcache.hash_function  crc32
memcache.hash_strategy  standard
memcache.max_failover_attempts  20

Memcached все еще работает на втором сервере и отлично доступен с WEB-сервера:

telnet 10.0.10.110  11211
Trying 10.0.10.110...
Connected to 10.0.10.110 (10.0.10.110).
Escape character is '^]'.
get aaa
END
quit
Connection closed by foreign host.

Итак, другими словами, вместо последовательного запроса на все перечисленные серверы он сбой после неудачной попытки подключения первого сервера в очереди. Наконец, я понимаю, что есть выпуски доступной клиентской библиотеки 3.0.x, однако она не выглядит слишком надежной для меня, поскольку она все еще находится в бета-версии.

Пожалуйста, совет, как я могу получить желаемое поведение со стандартным PHP, клиентской библиотекой и сервером.

Спасибо большое!

Бест, Евгений

4b9b3361

Ответ 1

Я хотел бы поблагодарить всех, кто принимал участие на этот вопрос, ответ заключается в следующем: в действительности кэше (не Memcache d) в качестве обработчика сеанса поддерживает разделенные запятой серверы как session.save_path, кроме того, это поддерживает переход на другой ресурс. Ошибка, упомянутая выше Session start failed. Original message: session_start(): Server 10.0.10.111 (tcp 11211) failed with: Connection refused (111), имела только 8-й уровень (уведомление). На самом деле движок просто информирует вас о том, что один из серверов недоступен (что логично, иначе как вы узнаете?), А затем успешно подключается ко второму серверу и использует его.

Таким образом, все недоразумения были вызваны слабыми документами, недочетами memcache/memcached и параноидальными (E_ALL) настройками моего обработчика ошибок. Тем временем проблема была решена путем игнорирования уведомлений, относящихся к ошибке Connection refused (111) в контексте установления сеанса

Ответ 2

Используйте расширение Memcached. Обратите внимание, что для PHP есть два модуля memcache. Один называется Memcache, другой называется Memcached. Да, это запутанно, но правда в любом случае.

Плагин Memcache поддерживает те сложные URL, которые вы используете, с идентификатором протокола (tcp) и параметрами (постоянство и т.д.), а плагин Memcached поддерживает пулы подключений.

Документация, которую вы упомянули в комментариях выше (http://www.php.net/manual/en/memcached.sessions.php), касается расширения Memcached, а не Memcache.

Обновление: Некоторые интересные слова: https://serverfault.com/questions/164350/can-a-pool-of-memcache-daemons-be-used-to-share-sessions-more-efficiently

Ответ 3

Вы должны изменить стратегию хэша

Измените свою конфигурацию на

memcache.hash_strategy  consistent

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