Умное кеширование. Как жить при высоких нагрузках.

_RVK_

Новичок
Умное кеширование. Как жить при высоких нагрузках.

Нагрузка на ресурс >100 000 хостов (3-4 млн. хитов) в сутки. Соответственно живем только засчет наличия кеширования. Требование заказчика состоит в том что бы кеширование убрать вообще, или сделать его незаметным для пользователя. То есть при обновлении данных в БД, пользователь должен видеть изменения сразу. Это в идиале.

На данный момент кеширование используется смартевое. Но данный способ кеширования имеет ряд недостатков:

1. Нужен тяжелый смарти.
2. Нужна дополнительная логика в коде.
3. Кеш хранится непосредственно на диске. Так как морд много, экземпляров кеша столько же.

Если при существующей нагрузке отключить кеширование, то в первую очередь упадет муська. Таким образом первоочередная задача снизить нагрузку на СУБД.

Как результат мозгового штурма, появились две концепции.
1. Кешировать данные. Хрананить в мемкеше.
2. Кешировать HTML. Хранить на кеширующем сервере.

Первый вариант(теоретически) снизит нагрузку на MySQL, но нагрузка на остальные сервера не упадет.
Второй вариант снизит нагрузку на все сервера, кроме фаловых. Но он сложнее в реализации. В этом случае хотелось бы что бы пользователю отдавался всегда готовый HTML с сервера, и при этом не дергался лишний раз апач и PHP. Как раз здесь понимание наиболее размытое.

Мне бы хотелось сдесь обсудить возможные варианты решения данной проблемы.
 

Rammstein

PHPClub::News
Может просто пересмотреть механизм кэширования?

1) Кэшировать блоками (скорее всего уже так и есть)
2) Каждому кэшнутому блоку данных присваивать тэги (см. ZF), например, имя таблицы; далее при изменении таблицы, сносить всё что имеет тэг с именем данной таблицы. Таким образом, данные всегда будут свежими.

При больших нагрузках и сложных запросах, ИМХО, лучше PostgreSQL использовать.

-~{}~ 27.10.06 18:27:

Считаю, что смарти слишком много на себя берёт.
 

StUV

Rotaredom
_RVK_
то в первую очередь упадет муська
смените субд ;)

сколько у вас зеркал со статикой/картинками и по какому принципу контент обновляется на зеркалах после изменений в базе ?
 

Alexandre

PHPПенсионер
ранее использовал кеширование смарти и был им недоволен, по этом,
я решил (еще решаю) вопрос следующим образом:
кеширование разбил на два вида
- оперативное
- дисковое

Оперативное кеширование - храню в мемкеше
Дисковое, аналог смартивского кеширования

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

сборка блока происходит либо по крону, либо по запросу... можно оставить смарти.

сборка страницы из блоков происходит быстрым шаблонизатором, типа ctpp, php_templates или фишеровским blitz.
 

_RVK_

Новичок
при изменении таблицы, сносить всё что имеет тэг с именем данной таблицы. Таким образом, данные всегда будут свежими.
Это сложно, из за того что обновление данных происходит на одном сервере, а кеш хранится на нескольких, но других серверах. Сказать всем им прибить кеш непросто. Да и при этом в случае 5 морд, будет выполнено 5 одинаковых запросов, пока новый кеш не появится на всех 5-ти.

При больших нагрузках и сложных запросах, ИМХО, лучше PostgreSQL использовать.
Вопрос о смене субд не рассматривается.

-~{}~ 27.10.06 14:48:

сборка страницы из блоков происходит быстрым шаблонизатором, типа ctpp, php_templates или фишеровским blitz.
А если например, SSI?
 

BeGe

Вождь Апачей, блин (c)
_RVK_ если обновления только на одном сервер муськи, а выборка данных на разных - почему не сделать репликацию ?
 

Alexandre

PHPПенсионер
А если например, SSI?
SSI я не рассматривал, надо подумать, хотя наврядли,

сервер передает управление пхп скрипту, который анализирует запрос и
смотрик - какие блоки участвуют в формированинии...

далее, вытаскивается из того или иного кеша часть HTML страницы и отдается master скрипту или вызывается соответствующий обработчик формирования HTML страницы.

master скрипт просто собирает HTML - блоки, возвращаемые соответствующими классами.

Как применить схему SSI в описаннцю - я не знаю...
 

Rammstein

PHPClub::News
Может кто ссылки подкинет по теме? Меня вопрос распределения нагрузки тоже интересует.
 

_RVK_

Новичок
Как применить схему SSI в описаннцю - я не знаю...
Просто сегодня была расмотрена следующая схема.

Участники:

1. Прокси сервер с SSI шаблоном.
2. Кеширующий сервер.
3. Сервера с Apache+PHP

- Пользователь делает запрос на прокси, который берет необходимый SSI шаблон, состоящий из блоков.
- Блоки тянутся с Кеширующего сервера, который смотрит, есть ли у него необходимый кеш.
- Если кеша нет, запрос отдается дальше на один из серверов, для генерации соответствующего блока.
- Результат забирается, кешируется и отдается прокси.
- При изменении данных, после UPDATE, пребивается соответсвующий кеш на кеширующем сервере, что заставит его запросить обновленный блок.
 

Rammstein

PHPClub::News
Почему именно блоки гонять между серверами, а не объекты модели? Впоследствии передавать только ID, а если объект с таким ID не найдётся на слейве, то он запрашивает его с мастера. Я над подобным размышлял, но как сказал уже, речь шла об экономии трафика.
 

StUV

Rotaredom
Блоки тянутся с Кеширующего сервера
у нас при апдейте на мастер хосте генерится кеш и "публикуется" на зеркала
т.е. - если контент "не успеет" скопироваться на зеркало, то стянется с мастера как в описанном варианте
но как правило статика быстро публикуется
 

_RVK_

Новичок
у нас при апдейте на мастер хосте генерится кеш и "публикуется" на зеркала
Тоже думали о том что бы генерить кеш сразу при апдейте базы, но для нас такой вариант не катит, потому что вариантов показа 1 только страницы очень много (3 види представления списка + 4 вида сортировки * несколько тысяч страниц). Полный объем кеша смарти сейчас несколько гигабайт.

Именно по этому кешировать нужно только по запросу.
 

Alexandre

PHPПенсионер
Полный объем кеша смарти сейчас несколько гигабайт.
у меня 4 Гб был...
сейчас дисковый кеш меньше гига. Как вариант, Думаю вместо дискового кеша подцепить DB4.

притом, если кто смотрел, чтоиз себя представляет кеш смарти.... там генерится куча мусора.
 

moxnatiy

Новичок
Alexandre

Про твои 4 гига я увидел. Я у Ромы спросил.
Несколько гигабайт кеша смарти это куча говнокода. Интересен обьем нужной информации.
 
Сверху