Недавно наше веб-приложение на PHP стало недоступным в течение нескольких минут после того, как один из наших узлов Memcached умер (мы используем Memcachier в качестве поставщика Memcached).
Это был наш user.ini
конфигурация (Heroku использует user.ini
как место, где вы определяете свою конфигурацию), которая работала, но, по-видимому, не поддерживала аварийное переключение:
session.save_handler=memcached
session.save_path=${MEMCACHIER_SERVERS} # I understand this is redundant, but I just kept it as-is because I didn't write the original user.ini
session.save_path="PERSISTENT=SFSESSID ${MEMCACHIER_SERVERS}"session.gc_maxlifetime=1209600
session.gc_probability=1
memcached.sess_binary=1
memcached.sess_sasl_username=${MEMCACHIER_USERNAME}
memcached.sess_sasl_password=${MEMCACHIER_PASSWORD}
Наш новый user.ini
конфигурация, которая предназначена для обеспечения возможности восстановления после отказа
session.save_handler=memcached
session.save_path="PERSISTENT=SFSESSID ${MEMCACHIER_SERVERS}"session.gc_maxlifetime=1209600
session.gc_probability=1
memcached.sess_sasl_username=${MEMCACHIER_USERNAME}
memcached.sess_sasl_password=${MEMCACHIER_PASSWORD}
memcached.sess_binary=1
memcached.sess_number_of_replicas=1
# I also tried memcached.sess_consistent_hash=1, to no avail
MEMCACHIER_SERVERS
env var выглядит так: 123.45678.us-east-1.heroku.prod.memcachier.com:11211,123.45678.us-east-1.heroku.prod.memcachier.com:11211
, Я думаю, что это означает, что у нас есть 2 узла.
Проблема, которую мы получаем с новой конфигурацией, заключается в тайм-аутах и множестве ошибок, связанных с функциями сеанса PHP (session_start()
, session_write_close()
).
Почему это происходит?
Помните, что мы вообще не используем Memcached внутри нашего PHP-кода, а только как механизм хранения сессий.
Я пытался связаться со службой поддержки Memcachier, но представитель заказчика мог предоставить только рекомендованный код PHP (который нам не нужен).
Поскольку срок действия награды истек, и вопрос скоро будет закрыт, я собираюсь продолжить с предложением @ jdotjdot и переключиться с Memcachier на дополнение MemcachedCloud.
Других решений пока нет …