AWS ELB в качестве бэкенда для Varnish Accelerator

Я работаю над широким развертыванием на AWS, которое требует повышенного времени работы и переменных нагрузок в течение дня. Очевидно, это идеальный вариант использования для ELB (Elastic Load Balancer) и автоматического масштабирования.

Однако мы также полагаемся на лак для кэширования вызовов API. Мой первоначальный инстинкт был структурировать стек так, чтобы лак использовал ELB в качестве бэкенда, который, в свою очередь, затрагивал группу приложений.

Varnish -> ELB -> AppServers

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

Однако, читая вокруг, похоже, что люди делают это, поэтому мне интересно, какие существуют обходные пути? Возможно, скрипт для периодической перезагрузки vcl?

В случае, когда это действительно просто не очень хорошая идея, есть идеи о других решениях?

3 ответа

Это абсолютно возможно, но нужно несколько шагов, чтобы все заработало! То, как мы делаем это здесь, когда нам нужна такая конфигурация:

  • Создать VPC. Вы должны сделать это в VPC, потому что вам нужно создать в них подсети.

  • Создайте одну подсеть в каждой зоне доступности, экземпляры которой будут зарегистрированы в ELB. Вы должны подсеть так, чтобы у вас было небольшое количество IP-адресов в каждой подсети, так как каждый IP-адрес станет служебным. (В настоящее время мы используем подсети, которые /26)

  • Начните создавать бэкэнд DNS Director в своем VCL-лаке. Добавьте в 3 подсети, которые вы создали выше. ( https://www.varnish-cache.org/docs/3.0/reference/vcl.html)

  • Задайте настройку хоста в бэкэнде DNS Director как имя хоста, которое должен увидеть лак. (Например, если ваша служба переднего плана называется, скажем, front-end-service.subdomain.example.com, поместите front-end-service.example.com в качестве параметра Host в VCL.)

  • Установите параметр суффикса в DNS Director на то, что вы можете разрешить. Продолжая приведенный выше пример, вы можете легко использовать "-varnish.example.com" в качестве суффикса. Когда запрос достигает лака, лак просматривает заголовок HTTP Host, и, если имя совпадает с тем, что имеет лак в настройке заголовка DNS-директора VCL для параметра Host, лак добавляет суффикс и выполняет поиск DNS для имени хоста, которое является результат объединения содержимого заголовка Host с суффиксом. Таким образом, в этом примере поиск DNS будет выполняться лаком для хоста с именем "front-end-service.subdomain.example.com-varnish.example.com"

  • Создайте свой бэкэнд-балансировщик нагрузки и прикрепите его к каждой подсети, которую вы создали.

  • Задайте запись DNS для результата объединения как CNAME для имени DNS, которое amazon предоставляет для вашего loadbalancer.

  • Запустите лак, при желании посмотрите на лакистат, чтобы проверить количество бэкэндов.

  • Проверьте свои настройки, выдав

    curl -H "Хост: front-end-service.subdomain.example.com" http://varnish-server-hostname.example.com/whatever-path

  • Посмотрите, как поступает запрос с varnishlog, чтобы убедиться, что все работает.

Может быть полезно отметить, что AWS рекомендует иметь подсеть с как минимум 20 неиспользуемыми IP-адресами, если вы собираетесь разместить балансировщик нагрузки в этой подсети. (См. http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/UserScenariosForVPC.html).

Мы сделали это для недавнего проекта, который нуждался в ELB для спецификации требований, но мы обеспокоены тем, как это масштабируется с точки зрения простоты управления, и рассматриваем подходы, основанные на обнаружении услуг, наряду с чем-то вроде автоматического обновления VCL, плюс автоматизированное VCL развернуть через что-то вроде агента Varnish ( https://github.com/varnish/vagent2)

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

Ура!

Часть цели ELB состоит в том, чтобы пережить отказы хоста. Даже с автоматическим масштабированием и CloudWatch, если нужно заменить мертвый экземпляр, вы наблюдаете, возможно, несколько минут простоя.

Рекомендую:

[Front End ELB] -> [Varnish] -> [Back End ELB] -> [AppServers]

Я знаю, что вы хотите максимально использовать преимущества кэширования, но вам действительно следует распределить нагрузку по всем зонам доступности. Это означает наличие равного количества экземпляров в зоне A, B и C для региона (районов), в котором находится ваш стек (таким образом, 3x Varnish). Это, конечно, будет стоить дороже, но даст вам возможность выжить во всех отключениях AZ *. Сокращение этой стоимости будет означать, что в какой-то момент вам, вероятно, придется понизить время простоя. Это ваше решение, но, по крайней мере, вы можете принять это обоснованное решение.

Имейте две группы безопасности, одну для Varnish и одну для AppServers. Настройте каждый так, чтобы только связанный ELB мог получить к нему доступ через соответствующий порт.

Для конфигурации Varnish установите для DNS-директора низкий TTL. Установите его равным (или половине) TTL CNAME, который Amazon предоставляет для внутреннего ELB. Этого должно быть достаточно, чтобы Varnish оставался в курсе событий.


* И если вы хотите получить максимальную доступность. используйте Route53 с многозонной избыточностью по нескольким азам.

Лак действительно может работать как балансировщик нагрузки. Тебе стоит попробовать Varnish -> AppServers,

Просто определите каждый сервер приложений как бэкэнд в директории в конфигурации Varnish.

Вы даже можете добавить зонды для проверки доступности бэкэнда, попыток переключения на другой сервер при сбое во время процесса запроса и т. Д.

Где находится ваш экземпляр Varnish? ASW тоже? Вы можете попробовать хэш-директор Varnish и разместить Varnish на тех же серверах, что и приложения. Каждый экземпляр будет обрабатывать запросы, которые он должен обрабатывать, и перенаправлять других в правый бэкэнд. Каждый уникальный URL-адрес будет кэшироваться только на 1 (доступном) сервере, а ваша кэш-память будет умножена на количество экземпляров Varnish, а количество пропусков кэша будет ограничено.

Другие вопросы по тегам