Arhn - архитектура программирования

Основан ли ELB на TCP?

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

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

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

Если у вас есть ответ, пожалуйста, поделитесь деталями конфигурации. Спасибо.


Ответы:


1

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

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

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

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

Для вашего варианта использования я бы исследовал события жизненного цикла автоматического масштабирования, чтобы инициировать часть вашего кода, когда автоматическое масштабирование будет действовать на вашем экземпляре. Используя события жизненного цикла, у вас есть возможность активировать пользовательский код в ключевых состояниях жизненного цикла вашего экземпляра и предпринять дополнительные действия или попросить Auto Scaling ОТМЕНИТЬ изменение.

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

10.02.2015
  • Сохранение существующих соединений открытыми означает, что существующие TCP-соединения поддерживаются до тех пор, пока они не закрыты по праву какой-либо из сторон. Но когда мы тестировали, это не то, что происходит. У нас есть поддержка HTTP-запроса, а соединения tcp остаются открытыми как клиентом, так и сервером, когда мы тестируем на автономном сервере. Но ELB просто закрывает соединение, несмотря на включенный слив и использование привязанности сеанса на основе приложения. 10.02.2015
  • По умолчанию ELB держит соединения открытыми в течение 60 секунд с вашими клиентами и серверной частью. Вы можете изменить это значение в любое время и указать любое значение в диапазоне от 1 до 3600 секунд. Если вы указываете поддержку активности на серверной части и хотите, чтобы балансировщик нагрузки отвечал за закрытие соединения, вам необходимо настроить тайм-аут простоя ELB с более низким значением, чем ваша поддержка активности. 11.02.2015
  • Сброс соединения не зависит от сохранения соединения. Поддержание активности — это оптимизация сети, позволяющая избежать накладных расходов на открытие TCP-соединений для каждого HTTP-запроса. Сброс соединения заключается в сохранении пользовательского соединения, когда экземпляр будет удален из балансировщика нагрузки, чтобы не прерывать текущее HTTP-соединение клиентов. Наконец, сеансы HTTP видны только на уровне приложения и не видны из ELB (только файлы cookie сеанса доступны при работе в режиме HTTP на вашем ELB). 11.02.2015
  • Таким образом, вы хотите сказать, что слив в ELB при настройке на использование HTTP будет держать сеанс открытым только до тех пор, пока активен текущий HTTP-запрос, а следующий HTTP-запрос из того же сеанса все равно будет отправлен на другой сервер. Я знаю, что подталкиваю его, но это будет мой последний вопрос :) 11.02.2015
  • Слив соединения ELB не знает о http-сессии. Закрытие http-сеанса — это событие уровня приложения (обычно при выходе пользователя). Сеансы HTTP и TCP-соединения не связаны. Пользователь может закрыть свой http-сеанс на уровне приложения, в то время как браузер может поддерживать открытое TCP-соединение или наоборот. Сброс соединений ELB заботится о TCP-соединениях независимо от состояния http-сеанса на вашем бэкэнде. 11.02.2015
  • Я понимаю, что вы говорите, но на самом деле, судя по нашим испытаниям, это не так. ELB, кажется, закрывает сеансы tcp, даже если они активны во время слива. Вот почему мы перешли на балансировку нагрузки на основе tcp. Спасибо за ваш ответ. Это так же хорошо, как любой ответ, который я могу получить. Также я изучил крючки жизненного цикла, кажется, мы можем сделать что-то полезное с этим. 11.02.2015
  • Спасибо — пожалуйста, не стесняйтесь опубликовать сообщение на форуме (бесплатно) или открыть заявку в службу поддержки для анализа основных причин (поддержка разработчиков — 49 долларов США в месяц). 11.02.2015
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..