Кластеризация Memcache для сеансов php?

Вот небольшая предыстория, в настоящее время у меня есть

  • 3 веб-сервера
  • один сервер db, на котором также размещается memcache для сеансов php для 3 веб-серверов.

У меня есть конфигурации php на 3 серверах, чтобы указать на сервер memcache для сеансов. Он работал нормально, пока не было создано много соединений для чтения и т. Д., Что затем вызвало тайм-ауты соединения.

Поэтому в настоящее время я рассматриваю кластеризацию memcache на каждом веб-сервере для сеансов, и меня беспокоит только то, как убедиться, что memcache на всех серверах имеет одинаковую информацию для сеансов.

Кто-то направил меня на http://github.com/trs21219/Memcached-Library, потому что я использую codeigniter, но как мне объединить мои сеансы php с этим, поскольку memcache выглядит как хранилище ключей и значений? Заранее спасибо.

Кто-нибудь проверял http://repcached.sourceforge.net/ и работает ли он?


person William    schedule 11.10.2010    source источник


Ответы (3)


Мы обнаружили БОЛЬШОЕ преимущество использования MongoDB вместо MySQL для большинства вещей, включая обработку сеансов. Это намного быстрее, намного меньше, намного проще. Мы сохраняем MySQL для нужд транзакций, но теперь все остальное переходит в Mongo. Мы отнесли memcache к простому кэшированию страниц и других данных, которые не имеют критического значения, есть они там или нет, что-то вроде smarty.

person FYA    schedule 17.02.2011

Я не уверен, что у вас такие же ожидания от memcache, как у его разработчиков.

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

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

По моему опыту, сеансы PHP на самом деле не подходят для этого. База данных может легко поддерживать многие тысячи сеансов PHP с едва заметным трафиком, но вам нужно много хранилища памяти для поддержки того же числа: 50 КБ на сеанс и 5000 сеансов означают около 256 МБ, а затем все остальные данные, которые вы хотите поместить туда. Недостаточно памяти, и вы получаете множество необъяснимых выходов из системы (поскольку memcache отбрасывает данные сеанса при нехватке памяти) и, следовательно, множество раздраженных пользователей, которым приходится снова и снова входить в систему.

person staticsan    schedule 11.10.2010
comment
Распространение осуществляется клиентским кодом --- не на самом деле. прочитай мой ответ. - person zerkms; 12.10.2010
comment
Да это оно. Каждый экземпляр memcached ничего не знает и не может узнать о других запущенных вами экземплярах. Выбор экземпляра осуществляется клиентской библиотекой. Я знаю: я просмотрел несколько и отладил тот, который в конце концов решил использовать. Настройка пула выполняется каждый раз при выполнении страницы, потому что так работает PHP. - person staticsan; 12.10.2010
comment
Итак, как вы думаете, что мне лучше всего перенести мои сеансы в базу данных mysql и просто сгруппировать? - person William; 12.10.2010
comment
Пользовательский обработчик сеанса не сложен. См. php.net/manual/en/function.session. -set-save-handler.php для получения дополнительной информации; комментарии, кажется, охватывают все подводные камни. Два основных: инициализация пользовательского обработчика до первого session_start() и принудительное закрытие сеанса до закрытия обработчика базы данных. - person staticsan; 12.10.2010
comment
Кстати, только что видел: 50к за сеанс?!?!?! Посмотрел некоторые мои проекты: максимальный размер моих сессий 400 байт. Средний - 250-300байт. - person zerkms; 12.10.2010
comment
Несколько лет назад я присматривал за интранет-приложением, которому нужно было поместить в сеанс множество данных. 50k было на высокой стороне, но это часто приближалось. Если бы я писал это сейчас, сомневаюсь, что вложил бы туда так много. - person staticsan; 12.10.2010
comment
Да, проблема здесь в том, что сервер БД не поддерживает большое количество открытых портов. - person William; 12.10.2010
comment
Для этого вы можете сделать две вещи: 1. уменьшить wait_timeout до реалистичного значения (значение по умолчанию в MySQL чрезвычайно высокое). 2. поднимите max_connections в соответствии с фактическим трафиком. - person staticsan; 12.10.2010
comment
Спасибо за информацию, и wait_timeout закроет все эти tcp-соединения, которые я вижу в статусе time_wait? - person William; 12.10.2010
comment
Это закроет их гораздо раньше, да. - person staticsan; 13.10.2010

Нет необходимости использовать сторонние библиотеки для организации «кластера» memcached.

http://ru.php.net/manual/ru/memcached.addserver.php

Просто используйте эту функцию, чтобы добавить несколько серверов в пул, после чего данные будут храниться и распределяться по этим серверам. Сервер для хранения/получения данных для конкретного ключа будет выбран в соответствии с параметром согласованного распределения ключей.

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

person zerkms    schedule 11.10.2010
comment
Но как мне добавить серверы в пул, если я использую php.ini для обработки своих сессий? - person William; 12.10.2010
comment
О, тогда извините - я не понял этого из вопроса. Меня смутило ваше дополнение о memcached-library и repcached - вот почему я подумал, что вы используете не нативную поддержку. Тогда я думаю, что лучшим решением будет реализовать свой собственный обработчик сеанса с помощью session_set_save_handler(), это простая задача, я уверен, что вы это знаете. И в вашей реализации обработчика сеанса вы, безусловно, можете использовать пул. - person zerkms; 12.10.2010
comment
При использовании session_set_save_handler() php по-прежнему генерирует идентификатор сеанса для каждого пользователя? и могу ли я просто написать свой собственный обработчик сеанса для записи информации на все серверы memcache? - person William; 12.10.2010
comment
Вы просто реализуете небольшой набор функций и даете им session_set_save_handler() баллов. После этого - вы работаете с сессиями как обычно: session_start() для начала и $_SESSION['blabla'] = 'foobar'; для взаимодействия. Таким образом, код, использующий сеансы, не нужно переписывать. - person zerkms; 12.10.2010
comment
Та ссылка выше была мертва. Работал в: php.net/manual/en/memcached.addserver.php - person Jim Munro; 08.03.2013