2015-02-10 2 views
3

У меня возникла интересная проблема. Мы запускаем приложение на основе HTTPS, основанное на состоянии. Состояние поддерживается на основе cookie сеанса. Приложение спроектировано таким образом, что если сеанс прерывается, приложение возвращается на главный экран, все потерянные данные теряются. Поэтому для нас очень важно поддерживать сеанс.Является ли ELB дренирующим tcp?

В прошлом было принято решение использовать службы AWS для этой цели, а в текущей архитектуре есть ELB, который балансирует нагрузку до группы автоматического масштабирования. В первой используемой архитектуре был включен личный сеанс на основе HTTP. Во время тестирования выясняется, что при уменьшении существующих сеансов немедленно закрываются и перенаправляются в доступные экземпляры. Это происходит даже после включения слива (время из 5 минут), которое в соответствии с документами должно помешать этому. Может кто-нибудь, пожалуйста, скажите мне, что мы делаем неправильно, и так оно и должно работать?

Мой второй вопрос: мы выяснили, что это не тот случай, когда использование ELB используется для балансировки нагрузки на основе соединений tcp. В этом случае, когда мы масштабируем старые tcp-соединения, поддерживаются до тех пор, пока они не будут закрыты или не будут отключены, а новые соединения будут перенаправлены в другие экземпляры. Это текущая настройка, которую мы используем. Поэтому мой вопрос заключается в том, почему ELB ведет себя по-разному в обоих случаях и есть ли способ сделать ELB использовать HTTP-липкую сессию и утечку на основе tcp-соединения?

Если у вас есть ответ, поделитесь информацией о конфигурации. Благодарю.

ответ

2

Относительно вопроса №1 - это ожидаемое поведение слива соединения ELB.

Из документа: «Соединительный слив заставляет балансировку нагрузки ELB прекратить отправку новых запросов на экземпляр отмены регистрации или нездоровый экземпляр при сохранении существующих соединений. Это позволяет балансировщику нагрузки выполнять запросы на рейс, сделанные для отмену регистрации или нездоровые случаи ». http://docs.aws.amazon.com/ElasticLoadBalancing/latest/DeveloperGuide/TerminologyandKeyConcepts.html#conn-drain

ELB не знает о вашем состоянии сеанса, так как это управляется вашим приложением. Соединение сливается только на уровне сети. Если нет открытого подключения к вашему экземпляру, ELB может выбрать ваш экземпляр для отмены регистрации из AutoScaling (и автоматическое масштабирование позже прекратит его)

Вопрос №2: При использовании режима TCP на балансировщике нагрузки, понять содержимое HTTP (например, cookie) и с радостью отправить что-либо полученное от клиента на серверы. Поведение, которое вы экспериментируете, может быть связано с тем, как браузер клиента управляет соединениями (т. Е. Поддерживает открытое соединение). Это необходимо проверить с помощью инструмента веб-разработки.

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

Подробная информация доступна здесь http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/AutoScalingGroupLifecycle.html http://docs.aws.amazon.com/AutoScaling/latest/DeveloperGuide/lifecycle-hook-considerations.html

+0

«держать открытыми существующие соединения» означает, что существующие соединения TCP сохраняются в живых до тех пор, пока они не закрыты любой из сторон права. Но когда мы тестировали, это не то, что происходит. Мы поддерживаем HTTP-запрос, а соединения tcp остаются открытыми как клиентом, так и сервером при тестировании на автономном сервере. Но ELB просто закрывает соединение, несмотря на то, что дренаж включен и используется липкость сеанса на основе приложений. –

+0

По умолчанию ELB сохраняет соединения в течение 60 секунд для ваших клиентов и для бэкэнд.Вы можете изменить это значение в любое время и указать любое значение от 1 до 3600 секунд. Если вы указываете, что на бэкэнд все еще поддерживается, и вы хотите, чтобы балансировщик нагрузки отвечал за закрытие соединения, вам нужно настроить тайм-аут ожидания ELB с меньшим значением, чем ваш keep alive. –

+0

Соединение дренажа не зависит от соединения. , Поддерживайте сетевую оптимизацию, чтобы избежать накладных расходов на открытие TCP-соединений для каждого HTTP-запроса. Слив соединения связан с сохранением пользовательского соединения, когда экземпляр будет удален из балансировщика нагрузки, чтобы избежать прерывания подключения HTTP-клиентов. Наконец, сеансы HTTP видны только с уровня приложения и не видны из ELB (только cookie сеанса работает при работе в режиме HTTP на вашем ELB) –