Сессии Отказоустойчивость с 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 в пуле не работает, я получаю следующая ошибка:

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, клиентской библиотекой и сервером.

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

Лучший, Юджин

Используйте расширение 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

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

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

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

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

 memcache.hash_strategy consistent 

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