У меня есть веб-приложение, которое работает на двух экземплярах AWS - один экземпляр размещает сайт, а другой - фактическую базу данных (MySQL). Экземпляр, на котором размещен сайт, имеет эластичный IP-адрес, указывающий на него, который привязан к моему доменному имени.
Очевидно, что одним из основных преимуществ AWS является возможность запускать сразу несколько экземпляров, когда что-то загружено, и AWS даже предлагает автоматизированные решения для этого. Отлично. Но если мой домен указывает на один IP-адрес, и этот IP-адрес привязан к одному экземпляру, как мне распределить трафик между множеством экземпляров? Можно ли использовать основной компьютер в качестве балансировщика нагрузки? Если да, то существует ли обычно используемое решение для балансировки нагрузки для LAMP?
Amazon также предоставляет услуги эластичной балансировки нагрузки.
Вы можете использовать циклический DNS, как упоминалось ранее. И если вы ищете быстрое и простое решение, я бы порекомендовал именно его.
Однако экземпляры EC2 недолговечны, и вы не должны относиться к ним как к таковым. Это означает, что они могут подниматься и исчезать, как пердун на ветру, и ваше приложение должно терпимо относиться к этому. RR DNS может стать для вас источником боли, потому что он недостаточно умен, чтобы справиться с отказоустойчивостью / высокой доступностью. Если бы один из ваших веб-серверов умер, пользователь застрял бы, пытаясь подключиться к мертвой машине, пока TTL не истечет для записи. Упомянутый ранее трюк с установкой смехотворно низкого TTL не сработает. DNS-серверы нисходящего кэширования не соблюдают такой низкий TTL. Вам повезет с TTL в один час. Многие пользователи могут застрять, пытаясь подключиться к одному и тому же мертвому веб-серверу в течение 24 часов или дольше.
Я бы порекомендовал вам изучить HAProxy. Reddit.com использует HAproxy на EC2 для балансировки нагрузки около 200 миллионов просмотров страниц в месяц. через несколько десятков экземпляров веб-серверов. Я уверен, что он справится и с вашим приложением.
Вы можете использовать свой EIP с эластичной балансировкой нагрузки, как упоминал Эйприл; однако, когда я оценивал это, у него были некоторые недостатки, которые делали его менее чем идеальным для моего развертывания.
У меня есть 2 эластичных IP-адреса, которые назначены нескольким экземплярам EC2, которые служат моими интерфейсными веб-серверами. Это просто запущенные серверы Apache2 с потоком, которые обрабатывают балансировку нагрузки на мои серверы приложений за ними. Затем эти два EIP помещаются в стандартный циклический перебор DNS.
Конфигурация Apache2 использует mod_balancer для балансировки запросов между экземплярами внутреннего сервера, что не может быть меньше 3 экземпляров. База данных работает на собственном отдельном экземпляре EC2, к которому могут подключаться серверные системы.
Вы можете заменить конфигурацию Apache2 в моих интерфейсных системах на HAProxy. Я действительно смотрел на это, но мне нужно было сделать гораздо более интеллектуальную маршрутизацию, чем я думал, с HAProxy, но когда-нибудь я могу вернуться и переоценить эту позицию.
В этой конфигурации я обрабатываю более полдюжины сильно посещаемых сайтов, количество посещений которых исчисляется десятками миллионов в месяц. Потоковые интерфейсные серверы Apache2 почти не загружают, поскольку они просто действуют как посредник, в то время как реальная работа выполняется на внутренних серверах. Я заметил значительное увеличение скорости работы, когда мы работали на традиционных выделенных серверах в совместных центрах обработки данных.
Супер базовое решение:
Вы можете настроить записи DNS для веб-сайта, используя Циклический перебор DNS чтобы указать на несколько IP-адресов хоста. Создайте отдельный эластичный IP-адрес для каждого экземпляра интерфейса. На стороне DNS это просто случай добавления второй записи для того же имени хоста с альтернативным IP. Установите TTL для каждой записи достаточно низким (5-60 секунд).
Больше информации здесь: http://en.wikipedia.org/wiki/Round_robin_DNS