ОБНОВЛЕНИЕ. См. приведенный ниже ответ на решение, которое я в конечном итоге установил на AWS.
В настоящее время я экспериментирую с методами реализации глобального уровня балансировки нагрузки для моих серверов приложений в Digital Ocean, и мне еще предстоит собрать несколько элементов.
Цель
Предлагать моим пользователям высокодоступные услуги путем маршрутизации всех подключений к ближайшему «кластеру» серверов в SFO, Нью-Йорке, LON и, в конечном итоге, в Сингапуре.
Кроме того, в конечном итоге я хотел бы автоматизировать обслуживание этого, написав демона, который может отслеживать, масштабировать и лечить любой из серверов в системе. Или я объединю разные сервисы для достижения тех же целей автоматизации. Сначала мне нужно выяснить, как это сделать вручную.
Стек
- Ubuntu 14.04
- Nginx 1.4.6
- node.js
- 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
серверов, поскольку это единственный общедоступный шлюз?
Если вы прочтете все это, то вознаградите себя кексом. Заранее благодарю за любую помощь.