Как я могу развернуть масштабируемый надежный кластер haproxy на Amazon EC2?

25

Нам нужны более продвинутые функциональные возможности, чем обеспечивает ELB (в основном проверка L7), но не совсем очевидно, как справиться с такими вещами, как сердцебиение и высокая доступность с чем-то вроде haproxy с использованием EC2. Существует высокая вероятность того, что нам потребуется 3 или более узлов haproxy в кластере, поэтому простое сердцебиение между двумя узлами не сработает.

Похоже, что наличие слоя «heartbeat'd» перед узлами haproxy было бы правильным путем, возможно, с использованием IPVS, но обработкой изменений конфигурации при изменении кластера EC2 (либо путем преднамеренных изменений, таких как расширение, либо непреднамеренных, например, потеря Узел EC2) кажется нетривиальным.

Предпочтительно, чтобы решение охватывало по меньшей мере две зоны доступности.

В ответ на вопрос: Нет, сессии не липкие. И да, нам понадобится SSL, но теоретически это может быть полностью обработано другой установкой - мы можем направлять трафик SSL в другое место, чем трафик не-SSL.

Дон Макаскилл
источник
Я исследую, как выполнять развертывание канареек с медленно растущим процентом трафика, направляемого на новую версию программного обеспечения, и мне очень интересно, где вы в конечном итоге это сделали. Вы в конечном итоге попробовали какие-либо предложения Джеспера?
Иэн

Ответы:

14

Хорошо, я никогда не создавал решение для балансировки нагрузки AWS с трафиком на уровнях SmugMug, а просто подумав о теории и услугах AWS, пришла пара идей.

В первоначальном вопросе не хватает нескольких вещей, которые имеют тенденцию влиять на дизайн распределения нагрузки:

  1. Липкие сеансы или нет? Очень предпочтительно не использовать липкий сеанс, а просто позволить всем балансировщикам нагрузки (LB) использовать циклический выбор (RR) или случайный выбор бэкэнда. Выбор RR или случайный внутренний интерфейс прост, масштабируем и обеспечивает равномерное распределение нагрузки при любых обстоятельствах.
  2. SSL или нет? Независимо от того, используется ли SSL или какой процент запросов обычно влияет на распределение нагрузки. Часто предпочтительнее прекратить SSL как можно раньше, чтобы упростить обработку сертификатов и сохранить загрузку ЦП SSL от серверов веб-приложений.

Я отвечаю с точки зрения того, как обеспечить высокий уровень доступности слоя балансировки нагрузки . Сохранение серверов приложений HA выполняется с помощью проверок работоспособности, встроенных в ваши балансировщики нагрузки L7.

Хорошо, пара идей, которые должны работать:

1) «Путь AWS»:

  • Первый уровень, в самом начале, использует ELB в режиме L4 (TCP / IP).
  • Второй уровень, используйте экземпляры EC2 с вашим балансировщиком нагрузки L7 (nginx, HAProxy, Apache и т. Д.).

Преимущества / идея: Балансировщики нагрузки L7 могут быть довольно простыми AMI EC2, все они клонированы из одного AMI и используют одну и ту же конфигурацию. Таким образом, инструменты Amazon могут удовлетворить все потребности HA: ELB контролирует балансировщики нагрузки L7. Если L7 LB умирает или перестает отвечать, ELB и Cloudwatch вместе порождают новый экземпляр автоматически и переносят его в пул ELB.

2) «DNS круговой прием с отслеживанием пути:»

  • Используйте базовый циклический перебор DNS, чтобы получить грубое распределение нагрузки по паре IP-адресов. Скажем так, вы публикуете 3 IP-адреса для вашего сайта.
  • Каждый из этих трех IP-адресов представляет собой эластичный IP-адрес AWS (EIA), связанный с экземпляром EC2, с балансировщиком нагрузки L7 по вашему выбору.
  • Если L2 EC2 LB умирает, совместимый пользовательский агент (браузер) должен просто использовать вместо этого один из других IP-адресов .
  • Настройте внешний сервер мониторинга. Контролируйте каждый из 3 EIP. Если пользователь перестает отвечать на запросы, используйте инструменты командной строки AWS и некоторые сценарии, чтобы перенести EIP в другой экземпляр EC2.

Преимущества / идея: Совместимые пользовательские агенты должны автоматически переключаться на другой IP-адрес, если он перестает отвечать на запросы. Таким образом, в случае сбоя это может повлиять только на 1/3 ваших пользователей, и большинство из них не должны ничего замечать, так как их UA молча переключается на другой IP. А ваш внешний блок мониторинга заметит, что EIP не отвечает, и исправит ситуацию в течение пары минут.

3) DNS RR для пар серверов HA:

По сути, это предложение самого Дона о простом биении между парой серверов, но упрощенном для нескольких IP-адресов.

  • Используя DNS RR, опубликуйте несколько IP-адресов для службы. Следуя приведенному выше примеру, скажем, вы публикуете 3 IP-адреса.
  • Каждый из этих IP-адресов направляется на пару серверов EC2, всего 6 экземпляров EC2.
  • Каждая из этих пар использует Heartbeat или другое решение HA вместе с инструментами AWS, чтобы поддерживать активный IP-адрес в активной / пассивной конфигурации.
  • В каждом экземпляре EC2 установлен балансировщик нагрузки L7.

Преимущества / идея. В полностью виртуализированной среде AWS на самом деле не так просто рассуждать о сервисах L4 и режимах отработки отказа. Упрощая одну пару идентичных серверов, сохраняя всего 1 IP-адрес, становится проще рассуждать и тестировать.

Вывод: опять же, я на самом деле не пробовал ничего этого в производстве. По моему интуитивному ощущению, вариант с ELB в режиме L4 и саморегулируемые экземпляры EC2 в качестве L7 LB, кажется, наиболее соответствуют духу платформы AWS, и где Amazon, скорее всего, будет инвестировать и расширяться в дальнейшем. Это, вероятно, будет моим первым выбором.

Джеспер М
источник
1
Так что я люблю подход № 1, это направление, к которому я стремился, но есть еще несколько интересных моментов, не последним из которых является то, что ELB не очень хорошо справляется с отказом целого AZ (то, что у нас уже произошло ). Простое, но неприятное «решение» состоит в том, чтобы настроить гапрокси за ELB на пересечение AZ (возможно, с резервным кластером в другом AZ), поэтому, если хотя бы один haproxy работает в каждом AZ, у нас все будет хорошо. Но это только минимизирует, а не устраняет проблему. Есть идеи по поводу этой проблемы?
Дон Макаскилл
@ Дон Макаскилл: Я знаю, что у AWS было несколько крупных простоев, но добиться большего, чем надежность AZ, в AWS сложно. Переход к мульти-AZ операции внешнего интерфейса может быть первым шагом к мульти-AZ операции всего стека, и это целый чайник змей ...
Jesper M
@Don MacAskill: Одним из вариантов может быть разрешение DNS с учетом геоданных, например DynDNS Dynect -> ELB + L7 LB внутри одного AZ, с другим ELB + L7 в режиме горячего резервирования в другом AZ. (Помимо гео-осведомленности, у Dynect также есть несколько проверок работоспособности.) У DynDNS отличный послужной список для бесперебойной работы, но даже в этом случае добавление гео-ориентированной DNS является еще одним SPOF. Мне неясно, имеет ли Dynect + балансировка нагрузки в 2 AZ более продолжительное время безотказной работы, чем один AWS AZ. См. Это для обзора того, что я имею в виду, без баз данных нескольких AZ: dev.bizo.com/2010/05/improving-global-application.html
Jesper M
@ Дон Макаскилл: Еще одна вещь - имейте в виду, что один экземпляр ELB может охватывать несколько AZ. Он не может охватывать регионы EC2 . Но если допустимо просто использовать ELB для L7 LB в двух AZ в одном и том же регионе, это будет самым простым ... Вы писали: «ELB плохо обрабатывает весь AZ, возможно, вы уже знаете больше, чем Я делаю.
Jesper M
Да, если ELB охватывает несколько AZ и имеет какой-то сбой, когда он не может получить доступ ни к одному из внутренних узлов в AZ (они перегружены, отключены, возвращая 503 с, что угодно), конечные пользователи видят эти ошибки - это не так т перенаправить на другой АЗ. Я надеюсь, что это запланировано, но это уже укусило нас.
Дон Макаскилл
2

Если вы не выполняете липкие сеансы или используете стиль tomcat / apache (добавьте идентификатор узла к sessionid, а не сохраняйте состояние в LB), то я бы использовал ELB перед группой гапрокси. В ELB встроена проверка работоспособности, так что вы можете контролировать хакрокси и выводить любые из них из пула. Гораздо меньше для настройки, чем отказ от сердцебиения.

Что касается распространения изменений, у меня нет отличного ответа. Puppet отлично подходит для начальной конфигурации и внесения изменений, но для добавления / удаления узлов вам требуется более быстрый отклик, чем 30-минутный интервал опроса.

Бен Дженкс
источник
1
Это хорошее решение (и хороший вопрос!). Вы можете использовать Amazon SNS для оперативного распространения изменений конфигурации. Вам нужна система уведомлений для добавления / удаления узлов из конфигурации haproxy.
Рафик Маниар
Другой вариант управления внутренними серверами (на которые перенаправляет haproxy) - каждый внутренний сервер отправляет либо все haproxies, либо сервер конфигурации с периодической регистрацией (30 секунд или около того). Если кто-то умирает, он быстро становится незарегистрированным (и в любом случае haproxy должен это заметить); если появляется новый, он автоматически приводится во вращение. Это, очевидно, то, что делает Netflix.
Бен Дженкс
1

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

JamesRyan
источник
Да, Puppet на EC2 делает управление кластером довольно простым. Просто создайте микроэкземпляр и используйте его как своего кукловода.
Том О'Коннор
1
Мы используем Puppet в наших центрах обработки данных, но еще не пробовали EC2. Является ли марионетка EC2-ориентированной, так что она может находить узлы, используя ec2-description-instances или что-то еще, и автоматически конфигурировать / реконфигурировать на основе этого вывода? И как бы вы справились с внезапным уходом марионетки?
Дон Макаскилл
Почему это внезапно уходит?
Том О'Коннор
Он не поддерживает EC2, но вы можете настроить его так, чтобы новые узлы были помечены для подписи при запуске и использовать сценарий внешних узлов для их описания. Я написал несколько Python для этого с SimpleDB (внешние узлы) и SQS (очередь подписания запросов для новых узлов); разработчик Ubuntu написал сценарии с использованием S3: ubuntumathiaz.wordpress.com/2010/04/07/…
Бен Дженкс
Если марионетка уходит внезапно, она просто не запускает манифест, то есть оставляет узлы в любом состоянии, в котором они находятся.
Бен Дженкс