Простое решение по борьбе со сбросом всего кеша в memcached

в 16:41, , рубрики: Debian, highload, memcached, кеширование, системное администрирование, метки: , , ,

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

В целом реализация простая и ничего кардинально нового в себе не несет, просто подсказка для тех, кто не знает как это сделать.

В чем собственно проблема?

У нас есть сервер с кешем в 8Gb в memcached, постоянно под нагрузкой. Если мы сотрем весь кеш — сервер может не выдержать и отправить пару тысяч пользователей в 504 Gateway Timeout, а у тех кому повезет и он получит страницу — всё будет тормозить. Нам нужно увеличить объем кеша до 16Gb «налету». Для этого нужно перезапустить memcached с новой опцией. После перезагрузки memcached кеш будет пуст.

Допущения

Наше web-приложение понимает работу с несколькими memcached серверами.

Решение

Надо построить архитектуру так, чтобы не пришлось сбрасывать сразу весь кеш. Разобьём наш кеш в 8Gb на 16 memcached процессов, каждый держит в себе по 512MB кеша. Как я говорил выше, наше приложение умеет с ними работать.

В debian это можно реализовать так:

vi /etc/memcached.conf #меняем 8Gb на 512M
mv /etc/memcached.conf /etc/memcached_0.conf
cp /etc/memcached_0.conf /etc/memcached_1.conf
cp /etc/memcached_0.conf /etc/memcached_2.conf
cp /etc/memcached_0.conf /etc/memcached_3.conf
# и так столько раз чтобы было 16 конфигов
killall -9 memcached
/etc/init.d/memcached start
Starting memcached: memcached_0.
Starting memcached: memcached_1.
Starting memcached: memcached_2.
....

Делать это надо заранее, до того как Вам понадобилось быстро увеличивать кеш. Или уж раз на то пошло, то в момент самой минимальной нагрузки. Я считаю это «архитектурным» решением и делаю с самого начала, еще при начальной настройке сервера.

Теперь, когда нам нужно увеличить объём кеша, мы правим конфиги всех наших memcached конфиг и напишем туда 1024M вместо 512M. Как только мы поправили 16 конфигов, перезапускаем первый memcached сервер (только первый!!!). В Debian это будет делаться так:

root@vps2001:~# /etc/init.d/memcached restart 0
Restarting memcached: memcached_0.

Теперь смотрим за графиком занятости кеша и нагрузкой «на приложение» (у кого-то будет напрягаться php, у кого-то база, у кого-то еще что-то). Когда нагрузка спадает до нормальной, а кеш становиться более менее занятым, мы перезапускаем второй memcached сервер:

root@vps2001:~# /etc/init.d/memcached restart 1
Restarting memcached: memcached_1.

Снова ждем восстановления кеша и так делаем все N раз, сколько у нас memcached серверов.

Чего же мы добились таким шаманством

Мы добились того, что нагрузка увеличилась не в N раз одномоментно, а в N/16 в моем случае. Вы можете сделать сколько Вам нужно memcached процессов и терять ровно ту часть кеша которая допустима, опять-таки в моем случае это 1/16.

Автор: piromanlynx

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js