Как настроить глобальную балансировку нагрузки с помощью Digital Ocean DNS и Nginx?

ОБНОВЛЕНИЕ. См. приведенный ниже ответ на решение, которое я в конечном итоге установил на AWS.

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

Цель

Предлагать моим пользователям высокодоступные услуги путем маршрутизации всех подключений к ближайшему «кластеру» серверов в SFO, Нью-Йорке, LON и, в конечном итоге, в Сингапуре.

Кроме того, в конечном итоге я хотел бы автоматизировать обслуживание этого, написав демона, который может отслеживать, масштабировать и лечить любой из серверов в системе. Или я объединю разные сервисы для достижения тех же целей автоматизации. Сначала мне нужно выяснить, как это сделать вручную.

Стек

  1. Ubuntu 14.04
  2. Nginx 1.4.6
  3. node.js
  4. MongoDB от Compose.io (ранее MongoHQ)

Структура глобального домена

Когда я все настрою, мой домен будет выглядеть примерно так:

**GLOBAL**
global-balancing-1.myapp.com
global-balancing-2.myapp.com
global-balancing-3.myapp.com

**NYC**
nyc-load-balancing-1.myapp.com
nyc-load-balancing-2.myapp.com
nyc-load-balancing-3.myapp.com

nyc-app-1.myapp.com
nyc-app-2.myapp.com
nyc-app-3.myapp.com

nyc-api-1.myapp.com
nyc-api-2.myapp.com
nyc-api-3.myapp.com

**SFO**
sfo-load-balancing-1.myapp.com
sfo-load-balancing-2.myapp.com
sfo-load-balancing-3.myapp.com

sfo-app-1.myapp.com
sfo-app-2.myapp.com
sfo-app-3.myapp.com

sfo-api-1.myapp.com
sfo-api-2.myapp.com
sfo-api-3.myapp.com

**LON**
lon-load-balancing-1.myapp.com
lon-load-balancing-2.myapp.com
lon-load-balancing-3.myapp.com

lon-app-1.myapp.com
lon-app-2.myapp.com
lon-app-3.myapp.com

lon-api-1.myapp.com
lon-api-2.myapp.com
lon-api-3.myapp.com

А затем, если есть какое-либо напряжение на каком-либо слое, в любом данном регионе, я могу просто запустить новую каплю, чтобы помочь: nyc-app-4.myapp.com, lon-load-balancing-5.myapp.com и т. Д.

Текущая методология работы

  • Весь трафик получают (минимум) три из global-balancing серверов. Эти серверы сбалансированы "круговым перебором DNS", как показано в этой (откровенно запутанной) статье: Как настроить циклическую балансировку нагрузки DNS.

  • Используя модуль Nginx GeoIP и MaxMind GeoIP Data источник любого данного запроса определяется вплоть до $geoip_city_continent_code.

  • Уровень global-balancing затем направляет запрос на наименее подключенный сервер на уровне load-balancing соответствующего кластера: nyc-load-balancing-1, sfo-load-balancing-3, lon-load-balancing-2 и т. Д. Этот уровень также представляет собой (минимальное) трио капель.

  • Затем региональный уровень load-balancing направляет запрос на наименее подключенный сервер в приложении или уровне API: nyc-app-2, sfo-api-1, lon-api-3 и т. Д.

Подробности о кунг-фу Nginx можно найти в этом руководстве: Villiage Idiot: настройка Nginx с GSLB / обратным прокси на AWS. Более общая информация о балансировке нагрузки Nginx доступна здесь и здесь.

Вопросы

Где разместить global-balancing серверы?

Мне кажется странным, что я бы либо поместил их все в одном месте, либо распространил этот слой по всему земному шару. Скажем, например, я поместил их всех в Нью-Йорке. Затем кто-то из Франции попадает в мой домен. Запрос пойдет из Франции в Нью-Йорк, а затем будет перенаправлен обратно в LON. Или, если я помещу по одному в SFO, NYC и LON, то не все же возможно, что пользователь из Торонто (Parkdale, представляет) мог отправить запрос, который в конечном итоге перейдет в LON, но будет перенаправлен обратно в Нью-Йорк?

Перенаправляются ли последующие запросы на тот же IP-адрес?

Например, если пользователь из Торонто отправляет запрос, который, как определяет уровень global-balancing, должен направляться в Нью-Йорк, будет ли следующий запрос из этого источника отправляться непосредственно в Нью-Йорк, или же это все еще удача розыгрыша, что он попадет на ближайший global-balancing сервер (В данном случае - Нью-Йорк).

А как насчет сеансов?

Я настроил Nginx для использования директивы ip_hash;, чтобы он направлял пользователь к той же app или api конечной точке (процесс узла, в моем случае), но как глобальная балансировка повлияет на это, если вообще повлияет?

Есть примеры DNS?

Я не совсем специалист по DNS (в настоящее время я пытаюсь выяснить, почему мои записи CNAME не разрешаются), но я быстро учусь, когда мне предоставляется надежный пример. Кто-нибудь проходил этот процесс раньше и может предоставить образец того, как выглядят записи DNS для успешной настройки?

А как насчет SSL / TLS?

Нужен ли мне сертификат для каждого сервера или только для трех global-balancing серверов, поскольку это единственный общедоступный шлюз?

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


person AJB    schedule 05.09.2014    source источник
comment
Как бы то ни было, у меня почти идентичная установка, и я прошел несколько путей с решением проблемы. Мне любопытно, какие головные боли у вас были, когда вы расширяли свое глобальное развитие в Digital Ocean. Если хотите, напишите мне на адрес [email protected].   -  person Brad    schedule 05.09.2014
comment
@Brad Я только что отправил тебе электронное письмо.   -  person adrianTNT    schedule 08.02.2020


Ответы (4)


Цель: предлагать моим пользователям высокодоступные услуги путем маршрутизации всех подключений к ближайшему «кластеру» серверов в SFO, Нью-Йорке, LON и, в конечном итоге, в Сингапуре.

Затем уровень глобальной балансировки направляет запрос на наименее подключенный сервер ...

Если я правильно читаю вашу конфигурацию, вы фактически проксируете свои глобальные балансировщики к балансировщикам в каждом регионе. Это не соответствует вашей цели по маршрутизации пользователей в ближайший регион.

Я знаю три способа получить то, что вы ищете:

  1. 30-кратное перенаправление
    Ваши глобальные балансировщики получают HTTP-запрос, а затем перенаправляют его на группу серверов в или рядом с регионом, из которого, по их мнению, исходит запрос, на основе IP-адреса. Похоже на то, что вы пытались настроить. Этот метод имеет побочные эффекты для некоторых приложений, а также увеличивает время, необходимое пользователю для получения данных, поскольку вы добавляете массу накладных расходов. Это имеет смысл только в том случае, если ресурсы, на которые вы перенаправляете, очень большие, а локальный региональный кластер сможет обслуживать гораздо более эффективно.

  2. Anycast (использование маршрутизации BGP)
    Это то, что крупные игроки, такие как Akamai, используют для своих CDN. По сути, в Интернете есть несколько серверов с одним и тем же маршрутизируемым IP-адресом. Предположим, у меня есть серверы в нескольких регионах, и у них есть IP-адрес 192.0.2.1. Если я нахожусь в США и пытаюсь подключиться к 192.0.2.1, а кто-то в Европе пытается подключиться к 192.0.2.1, вероятно, мы будем перенаправлены на ближайший сервер. При этом используется собственная маршрутизация Интернета для поиска наилучшего пути (в зависимости от состояния сети) для трафика. К сожалению, просто использовать этот метод нельзя. Вам нужен собственный номер AS и физическое оборудование. Если вы найдете поставщика VPS, который позволяет вам получить часть своего блока Anycast, дайте мне знать!

  3. Geo-DNS
    Некоторые поставщики DNS предоставляют услуги, которые часто продаются как Geo-DNS. У них есть множество DNS-серверов, размещенных на произвольных адресах, которые могут направлять трафик на ваши ближайшие серверы. Если клиент запрашивает европейский DNS-сервер, он должен вернуть адрес серверов вашего европейского региона, а не некоторых других регионов. Есть много вариантов сервисов Geo DNS. Другие просто поддерживают базу данных гео-IP и возвращают сервер для региона, который, по их мнению, ближе, точно так же, как метод перенаправления, но для DNS до того, как будет сделан HTTP-запрос. Обычно это хороший вариант по цене и простоте использования.

Перенаправляются ли последующие запросы на тот же IP-адрес?

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

А как насчет сеансов?

Именно поэтому вам нужна такая липкость. Когда дело доходит до данных сеанса, вам нужно будет найти способ поддерживать все ваши серверы в актуальном состоянии. На самом деле это не всегда гарантировано. Как вы с этим справитесь, зависит от вашего приложения. Можете ли вы сохранить экземпляр Redis или что-то еще, чтобы все ваши серверы надежно поражались со всего мира? Вам действительно нужны данные сеанса в каждом регионе? Или у вас могут быть основные серверы приложений, работающие с данными сеанса, в одном месте?

Любые примеры DNS?

Задайте для них отдельные вопросы. У всех успешная установка выглядит по-разному.

А как насчет SSL / TLS?

Если вы проксируете данные, только ваши глобальные балансировщики должны обрабатывать HTTPS. Если вы перенаправляете, то все серверы должны его обработать.

person Brad    schedule 05.09.2014
comment
Замечательный ответ, @Brad. Это проливает свет на мою проблему. Основываясь на вашем ответе, я думаю, что вижу, что у меня есть дополнительный балансирующий слой и что региональный слой load-balancing может быть встроен в слой global-balancing. Затем я бы использовал 30x для перенаправления трафика, что, как я полагаю, сделало бы IP-адрес конечной точки «липким» для исходящего IP-адреса. Таким образом, без использования Geo-DNS или чего-либо еще, первый запрос для любого данного сеанса может закончиться неудачным длинным переходом от DNS Round Robin, но после перенаправления он затем «автоматически» перейдет на ближайший сервер. - person AJB; 05.09.2014
comment
Мне нужно будет поработать над деталями любого данного 30-кратного редиректа и того, как DNS-серверы общаются друг с другом в целом. - person AJB; 05.09.2014
comment
В настоящее время мои серверы приложений и API запускают Redis локально. На самом деле я столкнулся с этой проблемой глобальной балансировки, когда начал думать о централизации данных сеанса на собственном уровне redis. Спасибо за информацию о SSL / TLS. Это отличная новость о методе 30x, очень дорого для сертификатов. В любом случае, я возьму все это на себя и, надеюсь, дойду до эксперимента в ближайшие пару дней. Я буду держать вас в курсе того, что узнаю. У меня есть идея, возможно, написать руководство по этому вопросу, и я всегда могу использовать отзывы тех, кто делал это раньше. Ваше здоровье. - person AJB; 05.09.2014
comment
Хммм, я не думаю, что многое из того, что я сказал в своем ответе, застряло. Перенаправления происходят на уровне HTTP. Записи DNS не могут ничего перенаправить, но DNS-сервер может выбрать возврат определенного IP-адреса для поиска. На этом этапе нет гарантии, что клиент всегда будет подключаться к одному и тому же IP-адресу. Можно очистить кеш DNS и выполнить другой поиск с другим результатом. Что делает их липкими, так это прокси-балансировщик нагрузки, который проверяет удаленный адрес и / или cookie ... но трафик должен сначала попасть на балансировщик нагрузки. - person Brad; 05.09.2014
comment
Для этого перенаправления помните, что вы фактически отправляете клиента на новый URL-адрес. Это может иметь для вас значение, а может и не иметь. Для своих целей я создаю серверы интернет-радио. Клиенты обычно не знают, что это за конечный URL, поэтому я могу перенаправлять в течение всего дня без негативных последствий. - person Brad; 05.09.2014
comment
Привет, Брэд, просто хотел рассказать тебе, где я сейчас. Я перешел от DO DNS к Route53, чтобы воспользоваться преимуществами множества «политик маршрутизации», которые они предлагают: Latency, GeoIP, Failover. Нет смысла заново изобретать колесо (даже если это весело и познавательно), а цены на Route53 приемлемы для услуги. Теперь я пытаюсь понять, как вообще избавиться от уровня балансировки нагрузки. Я перемещаю свои сеансы в централизованное хранилище Mongo (или redis), а затем собираюсь перенаправить порт 80/443 на порт моего узла, чтобы попытаться использовать Route53 для завершения SSL. Я обновлю еще раз. - person AJB; 06.09.2014
comment
@AJB Полезно знать. В последний раз я изучал Route 53, и мне показалось, что он не поддерживает ни одну из этих политик, за исключением сред AWS. Разве это уже не так? - person Brad; 07.09.2014
comment
То же самое и сейчас: простой, взвешенный, с задержкой, переключением при отказе и геолокацией для любой конечной точки AWS или внешнего IP-адреса. docs.aws.amazon.com/Route53/latest/DeveloperGuide/. Они также теперь предлагают проверки здоровья. И 33 POP. Так что, кажется, неплохая сделка, но мне придется продолжить исследования. Я планирую обновить этот ответ со всеми моими выводами за последние 72 часа, но сначала я должен продолжить тестирование на Heroku и Appfog. Ага, думаю, после всего этого я перестал работать с PaaS. Дороже, но, учитывая всю сложность работы, это похоже на лучшую идею. - person AJB; 07.09.2014
comment
А теперь я работаю в OpenShift и, похоже, именно здесь я приземлюсь, чтобы получить все, что мне нужно (по очень разумной цене). Немного скалистое начало, но теперь, когда у меня есть мои морские ноги, это выглядит неплохо для OpenShift. Еще тестирование ... - person AJB; 10.09.2014
comment
@AJB Интересно. Я мало изучал предложения OpenShift, но для моих целей (работы с большим количеством мультимедиа) я очень привязан к доступу к полной системе, основанной на Debian. Я надеюсь, что это сработает для вас! - person Brad; 11.09.2014
comment
И очевидно, что OpenShift - тонущий корабль, поэтому я объехал, чтобы убедиться, что иду живописным маршрутом, прожигал Пиватол, и теперь я серьезно подумываю о том, чтобы оставаться стабильным с AppFog. Как единственный PaaS, который предлагает GA (вообще) в сочетании с агрессивной моделью ценообразования и философией «NoOps», которая почти кажется достаточно подлинной, чтобы пить Kool-Aid, это могло бы быть правильным решением моей проблемы. В настоящее время ждем ответа о том, как они будут обрабатывать глобальное завершение SSL с высокой доступностью, кроме своего текущего решения: blog.appfog.com/how-to-load-balance-your-app-around-the-world - person AJB; 12.09.2014
comment
Благодаря AppFog и Elastic Beanstalk теперь я получаю то, что мне нужно, с помощью AWS OpsWorks. - person AJB; 18.09.2014
comment
@AJB 30 облачных провайдеров по всему миру? Вы должны где-нибудь серьезно задокументировать свой опыт. :-) - person Brad; 18.09.2014
comment
Ха. Отличное название! Я планирую это. Получил много заметок. Рабочие названия, которые у меня были, были Down the PaaS-Hole We Go! или глобальная высокая доступность по пивному бюджету. Хотя мне нравится твоя. В любом случае OpsWorks, кажется, находит правильный баланс между автоматизацией и настройкой, так что, надеюсь, это конец моей ураганной поездки, и я скоро смогу изложить свои выводы. Я пришлю его вам, как только у меня будет готовый черновик. - person AJB; 19.09.2014
comment
Это отличная тема, и я хотел бы узнать больше о ваших технических настройках и опыте по ней. Пожалуйста, включите ссылку и здесь. :) - person Tan Hong Tat; 23.09.2014
comment
Привет, @TanHongTat, ниже я добавил ответ, в котором описывается результат всех моих экспериментов. Я остановился на обзоре различных поставщиков PaaS, которые я использовал в ходе экспериментов, но представил довольно исчерпывающий обзор решения, которое, наконец, сработало в моем случае. - person AJB; 15.12.2014
comment
@ Брэд, я люблю слышать о том, как это соотносится с той настройкой, которая у вас есть. Ваше здоровье. - person AJB; 15.12.2014
comment
Облачный провайдер, предлагающий бесплатную услугу Anycast: buyvm.net. - ›Вы должны купить 3 виртуальные машины (во всех регионах), тогда вы сможете использовать anycast. - person Berndinox; 24.09.2017
comment
Спасибо @Brad за потрясающий ответ. У меня есть вопрос, вы могли бы мне помочь. У меня есть 3 виртуальные машины на DO, и я использую облачный DNS GCP для получения любой передачи, но мне нужно добавить привязку сеанса, поскольку в бэкэнде есть код сокета firebase, и он срабатывает 3 раза, что плохо. Как я могу добиться липкости сеанса, чтобы он настраивался только один раз? - person kapoorji; 09.03.2019
comment
@kapoorji Я думаю, что в наши дни вы можете сделать это с помощью встроенного балансировщика нагрузки Digital Ocean. - person Brad; 09.03.2019
comment
@Brad Встроенный балансировщик нагрузки в Digital Ocean разрешен только в одном регионе, например 1 балансировщик нагрузки во всех экземплярах в SF, но я работаю в нескольких регионах. - person kapoorji; 09.03.2019

Рабочее решение

За последние несколько месяцев у меня была безумная гонка, чтобы разобраться во всей настройке Global-HA. Тонны удовольствия, и я, наконец, остановился на установке, которая работает очень хорошо и не похожа на ту, о которой говорилось в предыдущем вопросе.

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


Обзор

В итоге я переместил все свое развертывание на AWS. Мне нравится Digital Ocean, но откровенная реальность такова, что AWS на световые годы опережает их (и всех, на самом деле), когда дело доходит до услуг, предлагаемых под одной крышей. Мои ежемесячные расходы немного выросли, но как только я закончил настройку и оптимизацию, я остановился на решении, которое стоит около 75 долларов в месяц на регион для самого базового развертывания (2 экземпляра за ELB). А новый регион можно развернуть и развернуть примерно за 30 минут.


Глобальная балансировка

Я быстро обнаружил (благодаря ответу @Brad выше), что попытка развернуть мой собственный глобальный балансирующий слой DNS безумна. Было чертовски весело выяснять, как работает такой слой, но, если не считать того, что я сяду в самолет и поскреб костяшки пальцев, установив оборудование на миллионы долларов по всему миру, было бы невозможно свернуть мою собственный.

Когда я наконец понял, что искал, я нашел своего нового лучшего друга: AWS Route 53. Он предлагает надежную сеть DNS с примерно 50 с лишним узлов по всему миру и возможностью выполнять некоторые действительно крутые трюки с маршрутизацией, такие как определение местоположения маршрутизация, маршрутизация на основе задержки (что довольно круто) и записи псевдонима AWS, которые «автоматически» направляют трафик в другие сервисы AWS, которые вы будете использовать (например, ELB для балансировки нагрузки).

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

Я оставлю вам делать домашнюю работу по другим провайдерам: www.f5.com, www.dyn.com, www.akamai.com, www.dnsmadeeasy.com. В зависимости от ваших потребностей, для вас может быть лучшее решение, но это очень хорошо работает для меня.


Сеть доставки контента

Route 53 очень хорошо интегрируется с AWS Cloudfront. Я настраиваю корзину S3, которую использую для хранения всех статических медиафайлов, которые будут загружать мои пользователи, и настроил распространение Cloudfront на источник из моей корзины media.myapp.com S3. Есть и другие провайдеры CDN, так что делайте покупки. Но Cloudfront получает довольно хорошие отзывы, и его легко настроить.


Балансировка нагрузки и завершение SSL

В настоящее время я использую AWS Elastic Load Balancer для балансировки нагрузки между экземплярами моих приложений, которые находятся в Auto-Scaling Group. Запрос сначала принимается ELB, после чего SSL прерывается, и запрос передается экземпляру в группе Auto-Scaling.

ПРИМЕЧАНИЕ. Одно важное предостережение для ELB заключается в том, что, по иронии судьбы, он не очень хорошо справляется с массивными всплесками. ELB может занять до 15 минут, чтобы инициировать событие масштабирования для себя, создавая тем временем 500 таймаутов. Предполагается, что устойчивый, постоянный рост трафика обрабатывается достаточно хорошо, но если вы столкнетесь с резким скачком, он может вас подвести. Если вы знаете, что вас ударит, вы можете «позвонить заранее», и AWS разогреет ваш ELB для вас, что довольно нелепо и противоречит сути AWS, но я полагаю, что они либо работают над или игнорирование этого, потому что это не такая уж большая проблема. Вы всегда можете запустить свой собственный HAProxy или Nginx load- балансирующий слой, если ELB у вас не работает.


Группа автоматического масштабирования

В каждом регионе есть ASG, который запрограммирован на масштабирование, когда нагрузка превышает определенный показатель:

IF CPU > 90% FOR 5 MINUTES: SCALEUP
IF CPU < 70% FOR 5 MINUTES: SCALEDN

Я еще не испытал комбинацию ELB / ASG. Это немного ниже моего списка дел, но я знаю, что есть много других, использующих эту настройку, и, похоже, у нее нет серьезных проблем с производительностью.

На мой взгляд, конфигурация Auto-Scaling Group немного запутана. На самом деле это трехэтапный процесс:

  1. Создайте AMI, настроенный по своему вкусу.
  2. Создайте конфигурацию запуска, в которой используется созданный вами AMI.
  3. Создайте группу автоматического масштабирования, которая использует созданную вами конфигурацию запуска, чтобы определить, какой AMI и тип экземпляра запускать для любого данного события SCALEUP.

Для обработки конфигурации и развертывания приложения при запуске любого экземпляра вы используете «Данные пользователя» для ввода сценария, который будет запускаться после запуска любого данного экземпляра. Возможно, это худшая номенклатура в истории времени. Как "Пользовательские данные" описывают сценарий запуска, знает только автор. Во всяком случае, именно сюда вы вставляете скрипт, который обрабатывает все ваши apt-gets, mkdirs, git clones и т. Д.


Экземпляры и внутренняя балансировка

Я также добавил дополнительный «внутренний балансировочный уровень» с помощью Nginx, который позволяет мне «упаковать» все мои приложения на Node.js (app.myapp.com, api.myapp.com, mobile.myapp.com, www. myapp.com и т. д. myapp.com) на каждом экземпляре. Когда экземпляр получает запрос, переданный ему от ELB, Nginx обрабатывает маршрутизацию запроса на правильный порт Node.js для любого данного приложения. Что-то вроде контейнеризации бедняков. Это дает дополнительное преимущество, заключающееся в том, что каждый раз, когда одному из моих приложений необходимо взаимодействовать с другим (например, когда app. нужно отправить запрос на api.), это делается через localhost:XXXX, а не через сеть AWS или сам Интернет.

Эта настройка также максимизирует использование моих ресурсов, устраняя любую простаивающую инфраструктуру, если уровень приложения, который она размещает, получает небольшой трафик. Это также избавляет от необходимости иметь комбинацию ELB / ASG для каждого приложения, что позволяет сэкономить больше денег.

Нет никаких ошибок или предостережений, с которыми я столкнулся при использовании такого рода настройки, но есть один обходной путь, который должен быть на месте в отношении проверки работоспособности (см. Ниже).

Также есть приятное преимущество в том, что все экземпляры имеют роль IAM, что означает, что ваши кредиты AWS" запекаются "для каждого экземпляра при рождении и доступны через ваши переменные ENV. А AWS «автоматически» меняет ваши кредиты за вас. Очень безопасно, очень круто.


Проверки работоспособности

Если вы пойдете по пути вышеописанной настройки, упакуйте все свои приложения в одну коробку и запустите внутренний балансировщик нагрузки, тогда вам нужно создать небольшую утилиту для обработки Проверки работоспособности ELB. Я создал дополнительное приложение под названием ping.myapp.com. А затем я настроил свои проверки работоспособности ELB для отправки любых проверок работоспособности на порт, на котором работает мое приложение ping, например:

Ping Protocol: HTTP
Ping Port:     XXXX
Ping Path:     /ping

Это отправляет все проверки работоспособности моему маленькому помощнику ping, который, в свою очередь, обращается к localhost:XXXX/ping во всех приложениях, находящихся в экземпляре. Если все они вернут ответ 200, мое приложение ping затем вернет ответ 200 на проверку работоспособности ELB, и экземпляры будут жить еще 30 секунд.

ПРИМЕЧАНИЕ. Не используйте автоматические проверки работоспособности, если вы используете ELB. Используйте проверки работоспособности ELB. Это немного сбивает с толку, я думал, что это одно и то же, но это не так. У вас есть возможность включить одно или другое. Выбирайте ELB.


Уровень данных

Одна вещь, которая явно отсутствует в моей настройке, - это уровень данных. Я использую Compose.io в качестве поставщика управляемого уровня данных и развертываю его на AWS, поэтому у меня очень низкая задержка между уровнями моего приложения и моими данными. слой. Я провел предварительное расследование того, как бы развернуть свой уровень данных в глобальном масштабе, и обнаружил, что это очень сложно - и очень дорого - поэтому я выбросил его из своего списка как проблему, которую еще не нужно решать. В худшем случае я буду запускать свой уровень данных только на востоке США и наращивать оборудование. Это не самое худшее в мире, поскольку мой API - это строго данные JSON по сети, поэтому средний ответ относительно крошечный. Но я вижу, что это становится узким местом в очень большом, глобальном масштабе - если я когда-нибудь доберусь туда. Если у кого-то есть какие-либо материалы по этому слою, я хотел бы услышать, что вы хотите сказать.


Та-Да!

Глобальная высокая доступность при ограниченном пивном бюджете. Мне потребовалось всего 6 месяцев, чтобы понять это.

Мне нравится слышать любые предложения или идеи от любого, кто это читает.

person AJB    schedule 15.12.2014
comment
Очень здорово, рад видеть, что у вас все работает! За последние 6 месяцев я тоже прибегал к AWS для одного приложения, но убегал от него ради хлеба с маслом. В AWS для моего приложения Node.js я использовал Elastic Beanstalk. У приложения там очень простые требования. Он использует S3 для данных и выводит данные клиентам через HTTP. Но даже это оказалось настоящей проблемой из-за ограничений способа настройки Beanstalk. Если бы мне пришлось делать это снова и снова, Docker был бы моим помощником для любого приложения Beanstalk, но на самом деле это не относится к вашей ситуации. - person Brad; 15.12.2014
comment
Что касается проверки вашего здоровья, взгляните на это: github.com/STRML/node-toobusy Я настоятельно рекомендую встроить эту проверку работоспособности в ваше приложение (если это имеет смысл в вашем случае). Таким образом, если что-то слишком увязнет (с точки зрения Node.js), вы можете сообщить об этом балансировщику нагрузки. У меня были ситуации, когда Node.js просто привязан к вводу-выводу, оставляя обычную проверку работоспособности свободной, чтобы сказать, что все в порядке, хотя на самом деле это не так. Тест цикла событий может вам помочь, а может и не помочь, но на него стоит обратить внимание. - person Brad; 15.12.2014
comment
Для моего приложения, в котором я заново изобретаю балансировку нагрузки ... Я подобрал новое бизнес-условие, требующее этого. У меня есть несколько клиентов с избыточной пропускной способностью, поэтому я могу разрабатывать сценарии, в которых они размещают для меня ящик в обмен на сниженные цены или бесплатные услуги, как и Skype. В этой ситуации мне нужна большая гибкость и нужно встроить проверки качества в уровень приложения. Скорость тоже важна. В настоящий момент, если один из моих серверов выходит из строя, трафик перестает маршрутизироваться на него в течение ~ 100 мс. Это работает для меня, но не для всех. - person Brad; 15.12.2014
comment
Ага. Docker - это тоже следующий шаг для меня, но моя девушка не пускает меня до тех пор, пока я не запущу. И, скорее всего, я буду использовать ECS, который еще даже не запущен, так что, вероятно, это произойдет через 12-18 месяцев в будущем. На данный момент это работает и стабильно, так что я собираюсь с ним работать. Я также нашел Elastic Beanstalk Restrictive. Возможно, лучше использовать версию Dockerized, но мне никогда не удавалось просто «просто запустить какое-либо приложение» на ней. - person AJB; 15.12.2014
comment
Буквально 95% времени на разработку моего проекта было потрачено на то, чтобы возиться с .ebextensions, а затем ждать, пока Amazon загрузит все это, просто чтобы сказать мне, что это не удалось, без объяснения причин. Когда все стало зеленым, я подумал, что я вышел из леса ... а потом я просто понял, что мои проблемы скрыты от глаз. :-) - person Brad; 15.12.2014
comment
Ага, скрыт от глаз, почти не имеет возможности выполнять диагностику или отладку. Очень неприятный инструмент для работы. Это время ~ 100 мс, чтобы пометить мертвый узел, очень быстро. Сейчас мне 30, и я знаю, что это будет «несколько проблематично». Просто еще не дошел до того пункта в списке, где я его решаю. - person AJB; 15.12.2014
comment
Честно говоря, это действительно зависит от того, как происходит отключение. TCP-соединения могут буквально зависать в течение нескольких дней, если вы им позволите. Если процесс прерывается, соединение прерывается сразу же, и сервер управления немедленно об этом узнает. Если кто-то споткнется о кабель, пройдет около 10 секунд, прежде чем сервер управления узнает, что соединение было разорвано. В моем случае через это управляющее соединение регулярно отправляются данные, что помогает быстро обнаруживать разъединения. Если его не было, всегда есть TCP keepalive, который теперь можно настроить в Node.js. - person Brad; 15.12.2014

Вы можете использовать Anycast для своего веб-сервиса бесплатно при использовании бесплатного плана Cloudflare.

person Artem Andreenko    schedule 23.12.2014

Digital Ocean теперь поддерживает балансировку нагрузки на самих серверах. Его очень легко настроить, и он отлично работает! Избавляет вас от необходимости добавлять ненужные компоненты, такие как nginx (если вы хотите использовать только для балансировки нагрузки).

У нас были проблемы с использованием загрузки файлов SSL с помощью nginx на сервере Digital Ocean, однако после обновления Digital Ocean мы удалили nginx и теперь используем функцию балансировки нагрузки Digital Ocean, и она работает так, как нам нужно!

person Sean _space    schedule 01.03.2017
comment
Я не уверен, почему кто-то проголосовал против этого. Проголосуйте, чтобы уравновесить это. И да, я тоже это видел. DO делает большие успехи и в конечном итоге наверстает упущенное. Надеюсь, что раньше, чем позже, я лучше отдам им свои деньги. - person AJB; 09.08.2018
comment
Возможно, они хотели получить более подробную информацию о том, как войти в цифровой океан, а затем перейти к разделу «Сеть» - ›Балансировщики нагрузки -› Создать балансировщик нагрузки! Да, сейчас большая часть нашей инфраструктуры переведена на DO, чем больше денег вложит сообщество, тем быстрее и продвинутее будут эти функции! - person Sean _space; 10.08.2018
comment
Балансировка нагрузки DO по-прежнему выполняется только для одного региона, это обратная сторона. - person Kenny Grant; 05.11.2018
comment
с CloudFare и DigitalOcean можно достичь того же или лучшего результата по более доступным ценам. У AWS нет бесплатного обеда, и у него ДЕЙСТВИТЕЛЬНО есть свои плюсы. еще одно преимущество CloudFare в том, что вы можете обращаться к другим поставщикам, например, к OVH. - person Gurjinder Singh; 18.03.2021