2010-10-11 4 views
1

Вот небольшой фон, в настоящее время у меня естьКластеризация Memcache для сеансов php?

  • 3 веб-серверов
  • один сервер БД, который также принимает для кэша памяти PHP сессий для 3 веб-серверов.

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

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

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

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

ответ

1

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

1

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

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

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

Так что в этом случае вам не нужно беспокоиться о том, «как идти о убедившись, что Memcache на всех серверах, имеет ту же информацию для сессий»

+0

Но как добавить серверы в пул, если im использует php.ini для обработки моих сеансов? –

+0

О, извините, тогда я не получил это от вопроса. Меня смутило ваше добавление о «memcached-library» и «repcached» - вот почему я думал, что вы используете не встроенную поддержку. Тогда я думаю, что лучшим решением является реализация вашего пользовательского обработчика сеанса с использованием 'session_set_save_handler()', это пустяковая задача, я уверен, что вы это знаете. И в вашей реализации обработчика сеанса вы можете использовать пул. – zerkms

+0

При использовании session_set_save_handler() php все еще генерирует идентификатор сеанса для каждого пользователя? и я бы просто закодировал свой собственный обработчик сеанса для записи информации на все серверы memcache? –

2

я не уверен, у вас есть то же ожидание memcache, который были у его дизайнеров.

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

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

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

+0

«Распространение выполняется клиентским кодом» --- на самом деле. прочитайте мой ответ. – zerkms

+2

Да, это так. Каждый экземпляр memcached не имеет никаких знаний и не знает о других экземплярах, которые у вас запущены. Выбор этого экземпляра выполняется клиентской библиотекой. Я знаю: я посмотрел на несколько и отладил ту, которую я в конце концов решил использовать. Настройка пула выполняется * каждый раз, когда страница выполняется *, потому что так работает PHP. – staticsan

+0

Итак, как вы думаете, мой лучший выбор - переносить мои сеансы на базу данных mysql и просто кластеризовать? –

Смежные вопросы