Отказоустойчивость сессий с PHP-memcache против memcached - PullRequest
12 голосов
/ 23 февраля 2012

Коллеги!

Я использую 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 все еще работает на втором сервере и отличнодоступ с веб-сервера:

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

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

Best, Eugene

Ответы [ 3 ]

7 голосов
/ 24 февраля 2012

Я хотел бы поблагодарить всех, кто участвовал в этом вопросе, ответ таков: в действительности 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) имела только 8-й (Уведомление) уровень. Фактически движок просто информирует вас о том, что один из серверов недоступен (что логично, иначе как вы узнаете?), А затем успешно подключается ко второму серверу и использует его.

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

7 голосов
/ 24 февраля 2012

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

Плагин 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

0 голосов
/ 14 июля 2013

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

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

memcache.hash_strategy  consistent

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

...