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

обновление: см. ответ, который я предоставил ниже для решения, которое я в конечном итоге создал на AWS.

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

Цель

предложите высок-доступное обслуживание к моим потребителям путем направлять все соединения к ближайший "кластер" серверов в SFO, NYC, LON и, в конечном итоге, в Сингапуре.

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

Стек

  1. Ubuntu 14.04
  2. Nginx 1.4.6
  3. узел.js
  4. MongoDB от сочинять.Ио (Бывший Монгок)

Глобальная Разбивка Домена

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

**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, etc...

Текущей Рабочей Методология

  • (минимум) трио global-balancing серверы получают весь трафик. Эти серверы DNS Round-Robin сбалансированный, как показано на рисунке (откровенно запутанная) статья:как настроить круговую загрузку DNS Балансировка.

  • С помощью Nginx GeoIP Модуль и MaxMind GeoIP Data происхождение любого запроса определяется вплоть до этот $geoip_city_continent_code.

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

  • областного load-balancing layer затем направляет запрос на least connected сервер в слое приложения или api:nyc-app-2, sfo-api-1, lon-api-3, etc...

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

вопросы

куда я положил global-balancing сервера?

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

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

насчет сессий?

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

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

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

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

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

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

4 ответов


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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


обзор

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


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

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

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

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

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


Сеть Доставки Контента

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


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

в настоящее время я использую AWS эластичный балансировщик нагрузки чтобы сбалансировать нагрузку на мои экземпляры приложений, которые живут в Группа Автоматического Масштабирования. Запрос сначала получает ELB, после чего SSL завершается и запрос передается экземпляру в режиме автоматического масштабирования Группа.

Примечание: одно гигантское предостережение для ELB заключается в том, что, по иронии судьбы, он не очень хорошо справляется с массивными шипами. Это может занять до 15 минут для ELB, чтобы вызвать масштабирование события для себя, создавая 500 / таймауты в то же время. Считается, что постоянное увеличение трафика происходит очень хорошо, но если вас ударит Спайк, он может вас подвести. Если вы знаете, что вас ударят, вы можете "позвонить вперед" , и AWS разогреет ваш ELB для вас, который довольно нелепо и анти-шаблон по сути AWS, но я представляю, что они либо работают над ним, либо игнорируют его, потому что это не такая уж большая проблема. Вы всегда можете раскрутить свой собственный HAProxy или nginx и слой балансировки нагрузки, если ELB не работает для вас.


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

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

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

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

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

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

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


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

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

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

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

есть также хорошее преимущество в том, что все экземпляры имеют роль IAM, что означает, что ваши AWS creds "запечены" к каждому экземпляру при рождении и доступны через ваш ENV vars. И AWS "автоматически" вращает ваши creds для вас. Очень безопасно, очень круто.


Проверяет Здоровье

если вы идете по маршруту вышеуказанной установки, плоской упаковки всех ваших приложений на одной коробке и работает внутренний балансировщик нагрузки, то вам нужно создать небольшую утилиту для обработки 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. Это немного сбивает с толку, я думал, что это одно и то же, но это не так. У вас есть возможность включить один или другой. Иди с ЭЛБ.


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

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


Та-Да!

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

люблю слышать любой вклад или идеи от тех, кто случайно читает это.


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


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

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