ОБНОВЛЕНИЕ: См. ответ, который я дал ниже, для решения, которое я в конечном итоге настроил на AWS.
В настоящее время я экспериментирую с методами реализации глобального уровня балансировки нагрузки для своих серверов приложений в Digital Ocean, и есть несколько частей, которые мне еще предстоит собрать.
Цель
Предложите пользователям доступную услугу, направив все соединения на ближайший "кластер" серверов в SFO, NYC, 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 Round-Robin" сбалансированы, как показано в этом (откровенно запутанная) статья: Как настроить круговую загрузку DNS Балансировка.Использование Nginx GeoIP Модуль и Данные MaxMind GeoIP происхождение любого запроса определяется вплоть до
$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/Reverse Proxy AWS. Более общая информация о балансировке нагрузки Nginx доступна здесь а также здесь.
Вопросы
Где я могу разместить серверы global-balancing
?
Мне кажется странным, что я могу поместить их либо в одно место, либо разложить этот слой по всему земному шару. Скажем, например, я положил их всех в Нью-Йорке. Тогда кто-то из Франции попадает в мой домен. Запрос будет отправлен из Франции в Нью-Йорк, а затем направлен обратно в ЛОН. Или если я добавлю по одному в SFO, NYC и LON, то неужели все-таки невозможно, чтобы пользователь из Торонто (Parkdale, представительство) мог отправить запрос, который в конечном итоге отправляется в LON только для того, чтобы его направили обратно в Нью-Йорк?
Будут ли последующие запросы перенаправляться на один и тот же IP-адрес?
Например, если пользователь из Торонто отправляет запрос, который, по определению слоя global-balancing
, должен отправиться в Нью-Йорк, отправляет ли следующий запрос от этого источника непосредственно в Нью-Йорк или все еще удача при розыгрыше, что он достигнет ближайшего global-balancing
сервер (в данном случае NYC).
А как насчет сессий?
Я настроил Nginx для использования директивы ip_hash;, чтобы он направлял пользователя к той же конечной точке app
или api
(в моем случае, к процессу узла), но как глобальная балансировка повлияет на это? если вообще?
Есть ли примеры DNS?
Я не совсем эксперт по DNS (в настоящее время я пытаюсь выяснить, почему мои записи CNAME не разрешаются), но я быстро учусь, когда на нем есть хороший пример. Кто-нибудь проходил этот процесс раньше и может предоставить пример того, как выглядят записи DNS для успешной установки?
А как насчет SSL/TLS?
Нужен ли мне сертификат для каждого сервера или только для трех global-balancing
серверов, поскольку это единственный общедоступный шлюз?
Если вы прочитаете все это, наградите себя кексом. Заранее благодарю за любую помощь.