Nginx кеш, общий для нескольких серверов

9

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

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

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

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

Ответы:

1

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

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

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

macbert
источник