Денис Болтиков
Мысли вслух
блог дениса болтикова

Главная > 2007 > Использование memcached для ускорения работы высоконагруженных проектов

 

 

Использование memcached для ускорения работы высоконагруженных проектов

Использование memcached для ускорения работы высоконагруженных проектов

Memcached (читается мемкЭшид) - это система кэширования различных объектов в оперативной памяти. Позволят значительно снизить нагрузку на базу или файловую систему и ускорить работу сайта, за счет того, что работа с памятью быстрее чем с базой или файлами. Насколько я помню была разработана для LJ, а сейчас применяется практически на всех проектах с большим количеством пользователей. Запускается отдельным сервером. Если вы собираетесь делать свой стартап, то советую обратить на эту технологию пристальное внимание.

Для PHP есть специальный PECL-модуль (то есть он не поставляется вместе с PHP, надо отдельно скачивать и компилировать). Думаю также есть готовые модули для Perl, Python (Django), Ruby(RoR) и других языков.

В API самого мемкеша есть только базовые функции: выбор сервера, коннект и дисконект, добавление, удаление, обновление и получение объекта, инкримент и дикримент. Для каждого объекта устанвливается время жизни, от 1 секунды до бесконечности. При переполнение памяти более старые объекты автоматически удаляются. Для PHP также есть уже готовые библиотеки для работы с мемкешем, которые дают дополнительную функциональность.

Базовый алгоритм работы с мемкешем следующий - обращается к мемкеш-серверу за объектом, если он есть то берем его. Если нет, то обращаемся к базе данных (или где там еще у вас могут хранится данные), формируем объект, выдаем его пользователю и добавляем в мемкеш, чтобы мы могли прочитать его при следующем обращение.

В мемкеше имеет смысл хранить только часто запрашиваемые данные. Если какой то объект запрашивается у вас раз в неделю, то скорее всего лучший использовать файловый кеш. Хотя это также зависит и от архитектуры проекта.

Пример использования мемкеша есть в одной из моих предыдущих заметок.

P.S. Пару ссылок на разные интересные посты.
Михаил Туренко нашел способ проверять свободен домен или нет через sms.

Ильшат Саетов расказыват о своем опыте общения с сотрудниками и роботами хостинг-провайдера Arbatek. Смех и слезы. Но быть их клиентами я после такого не захочу.

Сергей Кадаков дает пару советов начинающим стартапщикам.

Ещё по теме:

 

Написано Октябрь 10, 2007


Комментарии

Alexander - октября 10, 2007 15:44
Вот! Об этом можно и подробнее. Очень интересно было бы почитать о том, как вы ускоряете НГС. Как-то у меня очень интересовались этими способами ;)

Денис Болтиков - октября 10, 2007 15:51
Задавай вопросы. На мелкие отвечу тут, на более объемные отдельными постами.
Если кратко, то
а) оптимизация php-кода
б) оптимизация sql-запросов
в) оптимизация структуры баз данных
г) кеширование данных в memcached
д) кеширование sql запросов
е) вынос статики (картинки, css) на отдельный легкий сервер (без php и прочих модулей)
ж) использование кластеров веб-серверов, баз данных
з) использование nginx вместо апача

Майк - октября 10, 2007 20:22
Было бы здорово почитать развернутый пост по каждому из этих пунктов (ну кроме разве что первого).

Денис Болтиков - октября 10, 2007 20:28
2Майк
со временем будет :) про мемкеш достаточно развернуто? или может чего не хватает?

Денис Болтиков - октября 10, 2007 20:29
Или лучше разбирать на живых примерах?

Майк - октября 10, 2007 20:42
По-моему, про мемкэш говорить особо нечего. А вот про оптимизацию структуры баз данных можно много чего написать.

Денис Радченко - октября 10, 2007 20:50
Денис Болтиков, был бы раз, если бы вы привели маленький пример. Как вы думаете, доработать форум, чтобы он использовал memcached + mysql ?

Денис Болтиков - октября 10, 2007 22:02
2Денис Радченко
Завтра посмотрю, что мы у себя у себя делали, еще дополнительно подумаю и напишу.

Anton - октября 11, 2007 02:39
Не хватает пары конкретных примеров, что в этот memcached можно пихать. Честно говоря, не представляю, где он может пригодится. Приведенный пример не нравится: для такой примитивной задачи такая сложная система используется.

Денис Болтиков - октября 11, 2007 08:54
2Anton
В мемкеш помещаются динамически генерируемые, но при это постоянные на какой-то срок, данные для одного пользователя или группы.
Например в этом блоге это может быть блогролл, блок последние посты, последние комментарии, рубрики, массив комментариев для каждого поста, сами посты. В итоге мы избавляемся практически от всех запросов к базе данных, что значительно увеличит возможную нагрузку на сайт (кол-во одновременных запросов). В данный момент это не актульно, так как тут бывает всего по 100 человек в день, но есть проекты для которых это важно. Там сидит по 2000—3000 человек онлайн и каждый запрос к базе очень-очень важен. По собственному опыту скажу, при неправельнной работе с базой и не использовании мемкеша проблема могут начаться уже при полторы сотне пользователей онлайн.
Про проверку онлайн. Я бы не сказал что это простая задача. Она дается значительную нагрузку на базу при большом кол-ве пользователей онлайн, так как проверка и обновление данных происходит при каждом хите. И моя идея, которую я сейчас реализую на своей работе, была высоко оценена, так как несколько десятков тысяч тысяч запросов к базе можно будет сделать кешируемыми + часть данных за кешировать + улучшить функционал некоторых разделов.

Anton - октября 11, 2007 11:51
Про примеры насчет блога понял, спасибо. Но я не настолько увлекаюсь динамикой, предпочитаю генерацию статики. ;)
Про проверку онлайн. Я бы не сказал что это простая задача.
Это ОЧЕНЬ простая и примитивная задача. И решается совсем другим способом. Знакомы с FastCGI?!

Денис Болтиков - октября 11, 2007 13:20
динамикой, предпочитаю генерацию статики
В веб-сервисах, где выводится персонализированая информация сильно статику не погенерируешь. Страницу все равно надо собирать из кусочков.
Это очень простая? Расскажи каким образом ее можно решить :)
С FastCGI знаком. Это интерфейс для передачи запросов от веб-сервера к внешним программам. Особенность его в том, что fastcgi-программа не перезапускается каждый раз, а ее процесс сохраняется и ему передаются запросы от веб-сервера. Плюс fastcgi-gпрораммы могут быть запущены не только на том сервере, где расположен веб-сервер, но и на другом.

Денис Болтиков - октября 11, 2007 13:36
2Anton
Почитал твой ***
Полезная информация для новичков, жаль что мало. Продолжение будет?

Как сделать сайт, который не упадет, или техническая сторона стартапа : Денис Болтиков - октября 11, 2007 18:12
[...] пост: Использование memcached. Там уже развернулась интересная [...]

Anton - октября 11, 2007 19:27
fastcgi-программа не перезапускается каждый раз, а ее процесс сохраняется
Вот и пускай в этом скрипте хранятся в массиве или хэше данные про последнюю активность юзера. Обычный массив цифр намного проще, чем memcached. :) К уже готовому проекту это прикрутить обычно сложнее, чем memcached. Но если делать с нуля и помнить про этот прием... ;)
Насчет *** — продолжение обязательно будет, но как скоро, увы, не знаю.

Vyazovoi - октября 12, 2007 01:01
такой вопрос.
имеем низкопроизводительный сервер (и памяти мало и проц слабый), на нем апач2 + myqsl.
Сабж мне непоможет, переписывать приложение по другую БД нет времени и желания, но может есть чтото вместо апач2? Подумываю потестить на первом апаче. Конкретно тотже lighthttpd как поддерживает php? Есть ли проблемы совместимости с скрипатми написанными для связки apache+php5?

Пост на конкурс “Раскрути свой блог” : Денис Болтиков - октября 13, 2007 14:21
[...] стартапов и первый обзорный пост на эту тему про memcached увеличило кол-во подписчиков процентов на [...]

Блог юного спортсмена - разработчика » Архив блога » memcached - октября 14, 2007 14:01
[...] Оригинал Оставить комментарий RSS Комментариев Назад: Одноклассники.ru [...]

Зубрик - октября 24, 2007 02:31
А если ситуация что есть NFS сервер к которому прикручено 20 клиентов, которые работают с файлами оттуда (без базы данных) постоянно, и пишут в одни и те же файлы постоянно, при этом фронт-енд работает либо на nginx либо на подобном — memcached может быть полезен хоть каким-то боком?
Зубрик.

Денис Болтиков - октября 24, 2007 14:19
На первый взгляд никак. Более подробно модем по электропочте пообщаться.

alfa - октября 27, 2007 22:50
memcached штука отличная, мы используем переписаный PEAR DB, который позволяет не задумываться над написанием конструкций memcached запросов, просто делая обычный SELECT и передавая параметр кэшировать или нет

Денис Болтиков - октября 27, 2007 22:53
Я хочу поискать библиотеку, которая позволяет сохранять как в файлы, так и в мемкеш, в зависимости от настроек.

alfa - октября 28, 2007 01:39
Имхо быстрее сделать свою, когда занялись вопросом быстроты pear db, то выкидывание из него всего лишнего, оставление функций getOne, getRow, getAll и поддержка DB_FETCHMODE_ASSOC дало ускорение работы с мускулом на этапе коннекта и работы более чем в 10 раз. Собственно сам класс стал весить 4020 байт :) это с комментариями, функциями работы с мемкешем и т.п., думаю если померить обычные DB.php и PEAR.php, можно призадуматься.

TYUS - июля 17, 2008 13:16
Денис, куда же вы пропали, постоянно читал ваш блог, надеялся еще увидеть инфу о мемкеше

Max - июля 31, 2008 02:03
PEAR DB действительно тяжеловат. Я как альтернативу ему начал использовать DbSimple. У него уже кстати есть функция полезная.
$DB = DbSimple_Generic::connect($dsn);
// Set caching function
$DB->setCacher('myCacher');
// Define caching function.
function myCacher($key, $value) {
// Если $value !== null, то следует записать его в кэш с ключом $key.
// Если $value === null, то следует вернуть значение кэша с ключом $key.
}
Дописать функцию для работы с memcache`м или файлами думаю не сложно будет.
Библиотеку можно найти тут: dklab.ru/lib/DbSimple/manual.html#cont35

 

Денис Болтиков

Архив

Сайт создан в 2007 г. © Блог Дениса Болтикова | Seoded.ru — Создание сайта