Создайте балансировщик нагрузки UDP с отказоустойчивостью в Amazon для экземпляров EC2 - PullRequest
0 голосов
/ 13 сентября 2018

Задача:

Создание балансировщика нагрузки UDP с отказоустойчивостью в Amazon для экземпляров EC2.

Проблемы:

На основании приведенного ниже объяснения у меня возникли следующие проблемы:

  • AWS EC2 Не имеет публичного DNS-имени, которое работает как для трафика IPv4, так и для трафика IPv6.
  • Невозможно переназначить текущий адрес IPv6 новому экземпляру в другой зоне доступности.

Пояснение:

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

С помощью эластичных IP-адресов я могу переназначить существующий эластичный IP-адрес новому экземпляру независимо от его зоны доступности.

С адресами IPv6 я не могу переназначить существующий адрес IPv6 , если новый экземпляр создан в другой зоне доступности, поскольку он не находится в той же подсети. По зонам доступности я имею в виду зоны доступности Amazon, такие как us-west-2a, us-west-2b, us-west-2c и т. Д.

Единственный способ, которым я знаю, как решить эту проблему, - обновить запись хоста у моего регистратора (в моем случае это Godaddy) новым IPv6-адресом. У Godaddy есть API, и я верю, что могу обновлять свою запись хоста программно. Тем не менее, Godaddy имеет минимальный TTL 600 секунд , что означает, что мой сервер может быть недоступен трафиком IPv6 в течение 10 минут или более в зависимости от распространения .

У Amazon замечательная система балансировки нагрузки, если я просто делаю обычный трафик TCP. Эта проблема не будет существовать, если бы это было так. Поскольку мне нужно балансировать нагрузку UDP-трафика, я столкнулся с этой проблемой. AWS ELB (Amazon Elastic Load Balancer) предоставляет мне CNAME, на которое я могу указать весь свой трафик для трафика TCP. Поэтому мне не нужно беспокоиться об отдельном трафике IPv4 и IPv6. Я могу просто указать CNAME непосредственно на DNS-имя, которое Amazon предоставляет вместе с ELB.

Amazon также предоставляет общедоступный DNS для EC2, но только для трафика IPv4. Так что это будет работать для моего трафика IPv4, но не для моего трафика IPv6.

Единственный вариант, о котором я могу подумать, - это установить программный балансировщик нагрузки, в моем случае NGINX на экземпляр EC2. Затем укажите домен на адреса IPv4 и IPv6 балансировщика нагрузки NGINX. Затем, когда происходит сбой зоны, я запускаю новый экземпляр AWS EC2 в другой зоне. Затем используйте API Godaddy для обновления IPv6-адреса до IPv6-адреса нового экземпляра.

Запрос

Кто-нибудь знает, как назначить CNAME для экземпляра EC2 без AWS ELB? Экземпляр должен был бы иметь возможность получать трафик IPv4 и IPv6 на CNAME.

Единственный способ, которым я могу думать об этом, - это привести к простоям из-за проблем распространения с изменениями DNS у моего Регистратора домена.

Я просматривал опции Route 53 в Amazon, и похоже, что у него такие же задержки распространения.

Я думал о настройке собственного DNS-сервера для домена. Затем, если IP-адрес изменится, я могу изменить запись DNS быстрее, чем с помощью Godaddy. Но проблемы распространения DNS будут проблемой при любом изменении DNS.

1 Ответ

0 голосов
/ 13 сентября 2018

[ПРАВКА после обдумывания моего ответа]

Один элемент, который я не упомянул, - это то, что Route 53 поддерживает простую балансировку нагрузки и отработку отказа.Поскольку в моем ответе ниже вам понадобятся две системы, просто раскрутите два экземпляра EC2 для своей службы, выполните циклическое распределение нагрузки с маршрутом 53 и добавьте запись отработки отказа.Создайте сигнал тревоги CloudWatch, чтобы при сбое одного из ваших экземпляров вы знали, что нужно заменить его вручную.Это даст вам балансировщик нагрузки «бедный человек» для UDP.

Настройка аварийного переключения DNS

[END of EDIT]

Сначала я хотел быперейти от GoDaddy DNS к Route 53. У меня нет опыта программирования записей GoDaddy DNS, но API Route 53 превосходен.

GoDaddy не поддерживает записи CNAME вершины зоны (example.com).Вам потребуется использовать записи IPv4 A и записи IPv6 AAAA.Это не должно быть проблемой.Я использовал бы записи AWS EIP, чтобы при запуске нового экземпляра, по крайней мере, записи DNS IPv4 не требовали задержек DNS.

Я бы не настроил свой собственный DNS-сервер.Я бы переключился на маршрут 53 в первую очередь.Когда вы упоминаете задержки распространения, вы имеете в виду TTL.Вы можете изменить TTL на короткий.Маршрут 53 поддерживает 1-секундную запись TTL, но большинство DNS-клиентов будут игнорировать короткие значения TTL, поэтому вы почти не будете контролировать это.Короткие TTL также означают больше DNS-запросов.

AWS не предлагает балансировку нагрузки UDP, но есть продукты и сервисы сторонних производителей, которые работают на AWS.Если ваш сервис критичен или приносит доход, используйте проверенное решение.

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

ШАГ 1: Вам нужно будет разработать стратегию для обнаружения сбоя вашего экземпляра.Вам нужно будет продублировать проверку работоспособности, которую выполняет балансировщик нагрузки, а затем запустить действие.

ШАГ 2. Вам потребуется написать код, который может обновлять записи DNS Route 53 (GoDaddy).

ШАГ 3: Вам нужно будет написать код, который может запустить экземпляр EC2 и завершить работу старого экземпляра.

ШАГ 4: Вам потребуется определить новые адреса для нового экземпляра и обновить маршрут 53 (GoDaddy).

Приведенные выше действия потребуют выделенного всегда на компьютере с высоконадежным подключением к Интернету.Я бы использовал EC2 для системы мониторинга.T2-micro, вероятно, в порядке.

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

...