Вопрос: Кэш Nginx, разделяемый между несколькими серверами


У нас есть 8 серверов REST-ish API с Nginx, использующих FastCGI с PHP-FPM для обработки запросов. В настоящее время мы используем кеширование Nginx FastCGI (такие директивы, как fastcgi_cache_path). Это означает, что ответы API кэшируются, но для каждого сервера имеется отдельный кеш.

Есть ли хороший способ совместного использования кеш-памяти среди всех восьми серверов?

Мы рассмотрели использование Redis как общего хранилища, но для доступных модулей требуются изменения приложений. В некоторых случаях мы можем захотеть кэшировать ответы вне нашего контроля (через HTTP для внешних API). В идеале была бы доступна замена для встроенного кэширования Nginx для ответов FastCGI и HTTP.


9
2018-03-25 15:33


Источник


Почему вы не выполняете кеширование не на уровне интерфейса (Nginx), а на backend-слое (приложение PHP)? - hangover
@hangover Я не вижу причин переделывать колесо. Кэш Nginx работает хорошо и быстро. Если мы сможем избежать накладных расходов на выполнение запросов через приложение, мы можем сохранить все хорошо и быстро. Nginx отвечает на запросы кэширования для нас менее чем за 5 миллисекунд. Запуск нашего PHP-приложения, даже для обеспечения кэшированного ответа, будет, вероятно, в 10 раз медленнее. Теперь кеширование Nginx хорошо работает для нас, нам просто нужно распространять этот кеш среди многих серверов. - Brad
хорошо, чем вы можете попробовать использовать сторонний Nginx SRCache модуль для хранения кэшированного содержимого в выделенном Memcached od Redis. - hangover
@Brad Это взломанно, поэтому я не буду рассматривать его как ответ: в настоящее время у нас есть сценарий ночного запуска, который использует rsync между каталогами кеша nginx на наших серверах, чтобы каждый из них обновлялся с последними файлами кеша из всех остальных. Сценарий заканчивается изящным перезапуском nginx и проверкой успеха. Как я уже сказал, он взломан, но он работает на нас с высокой пропускной способностью. - mVChr
@mVChr Интересно. Вы пытались запустить rsync или подобное непрерывно? В конце концов, для моего использования, я в конечном итоге получил работу Redis, но это не позволяет использовать очень большой кеш, поскольку вся коллекция Redis должна быть в памяти. 16GB быстро заполняется в моем приложении. - Brad


Ответы:


Кажется, есть довольно новое сообщение в блоге https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-1/ об этом проблема. Этот первый пример может быть полезен, если вы запускаете более двух серверов кеширования nginx.

Особенно вторая часть сообщения звучит интересно для моего текущего случая использования, где я хочу автоматически пересказывать измененные элементы в свои кеши.

Он должен работать с версией NGINX с открытым исходным кодом. В основном это работает путем проксирования запроса, каскадированного через каждый сервер NGINX (Nginx-Cache1-> NGinx-Cache2-> Origin-Server), каждый сервер кэшируется из соответствующего восходящего потока, и при желании также можно создать кластер HA. https://www.nginx.com/blog/shared-caches-nginx-plus-cache-clusters-part-2/


1
2018-03-06 15:27