
у меня естьрегиональная группа инстанцийс 2 экземплярами, обслуживающими порт 8000, автоматическое масштабирование не включено.
Эта группа экземпляров является бэкэндомГлобальный внешний балансировщик нагрузки приложений.
Веб-сервер на экземплярах работает под управлением Flask, и обработка каждого запроса займет 1 секунду:
@app.route("/", methods=["GET"])
def main() -> Response:
sleep(1)
response = jsonify(
success=True,
hostname=gethostname(),
)
response.status_code = 200
response.headers["Access-Control-Allow-Origin"] = "*"
return response
Я могу подтвердить это поведение, перейдя по публичному IP-адресу глобального балансировщика нагрузки, т.е. получение ответа занимает 1 секунду.
Если я запускаю 2 запроса одновременно, то, поскольку есть 2 экземпляра, я ожидаю, что каждый запрос будет отправлен на другой экземпляр, вместо этого они всегда отправляются на один и тот же экземпляр и ставятся в очередь на нем, поэтому:
- один запрос займет 1 сек.
- другой запрос займет 2 секунды
Я пробовал менять Locality load balancing policy
на Round-Robin
, Least-Request
и Random
, но всегда получаю одно и то же поведение.
Правильно ли я понимаю, что Locality load balancing policy
речь идет только о том, какой бэкенд будет выбран? Если да, то как настроить политику балансировки нагрузки внутри бэкенда (т.е. группы экземпляров)?
Спасибо
Конфигурация
Группа экземпляров
- Региональный
- Форма распределения цели: Равномерная
- [x] Разрешить перераспределение экземпляров
- Автомасштабирование включено: мин. 2, макс. 2
- Сигнал автомасштабирования: балансировка нагрузки HTTP 100%
- Период инициализации: 60 с
- Проверка здоровья:
- Путь: /здоровье
- Протокол: HTTP
- Порт: 8000
- Интервал: 30 сек.
- Тайм-аут: 30 сек.
- Здоровый порог: 1
- Порог нездоровья: 10
Балансировщик нагрузки
- Внешний интерфейс:
- Протокол: HTTP
- IP: хххх
- Уровень сети: Премиум
- Время ожидания HTTP keepalive: 610 сек.
- Правила маршрутизации: Все несоответствующие
- Внутренние службы:
- Протокол конечной точки: HTTP
- Названный порт: веб
- Время ожидания: 300 секунд
- Облачный CDN: отключен
- Ведение журнала: включено (частота выборки: 1)
- Привязка к сеансу: нет
- Время ожидания слива соединения: 300 секунд
- Политика дорожного движения:
- Политика балансировки локальной нагрузки: циклический перебор
- Обнаружение выбросов: отключено
- Политика безопасности бэкэнда: нет
- Политика безопасности Edge: нет
- Прокси-сервер с поддержкой идентификации: отключен
- Режим балансировки: Макс. RPS: 1 (на экземпляр)
- Вместимость: 100%
Тест
siege \
--concurrent 1 \
--time 60s \
"http://x.x.x.x"
С 2 узлами:
concurrent=1
: в среднем 1,02 сек.concurrent=2
: в среднем 1,66 сек.concurrent=4
: в среднем 3,35 сек.concurrent=8
: в среднем 5,54 сек.
С 4 узлами:
concurrent=1
: в среднем 1,02 сек.concurrent=2
: в среднем 1,18 сек.concurrent=4
: в среднем 2,70 сек.concurrent=8
: в среднем 3,83 сек.concurrent=16
: в среднем 7,26 сек.
С 8 узлами:
concurrent=2
: в среднем 1,20 сек.concurrent=4
: в среднем 1,85 сек.concurrent=16
: в среднем 4,40 сек.concurrent=64
: в среднем 14,06 сек.concurrent=128
: в среднем 19,04 сек.
Ожидаемое поведение
Я бы предположил такие результаты:
- 2 узла:
concurrent=1
: 1 секconcurrent=2
: 1 секconcurrent=4
: ~2 сек.concurrent=8
: ~4 сек.
- 4 узла:
concurrent=1
: 1 секconcurrent=2
: 1 секconcurrent=4
: 1 секconcurrent=8
: ~2 сек.concurrent=16
: ~4 сек.
Обновление 1
Если я перейду на a Classic proxy network load balancer
и отправлю 100 запросов:
- 56 перейти на vm0
- 44 перейти на vm1
Вместо этого для HTTP LB:
- 99 перейти на vm0
- 1 перейти к vm1
решение1
На основеГлобальный внешний балансировщик нагрузки приложенийGFE (Google Front End) оценивает, какие экземпляры бэкенда имеют возможность принимать запросы. Вы можете просмотреть ссылку, которой поделились, чтобы узнать больше о распределении трафика.
Если вы считаете, что циклический алгоритм вам не подходит, я бы посоветовал использоватьрежим балансировкигде концепция или конфигурация заключается в равномерном распределении трафика.
Я также нашел этосвязьвопрос со stackoverflow, который может быть полезен при использовании режима балансировки.