Приложение работает на трёх EC2 за ALB, один instance упал. Что произойдёт?
ALB помечает упавший target unhealthy после UnhealthyThresholdCount проверок и перестаёт слать трафик. Если инстансы в ASG с ELB health check, ASG завершает сбойный инстанс и запускает замену.
Когда один из трёх EC2-инстансов за Application Load Balancer перестаёт отвечать, цепочка событий определяется настройками health checks, target group и Auto Scaling Group. Разберём пошагово.
Что происходит на уровне ALB
ALB непрерывно опрашивает каждый target по HTTP/HTTPS или TCP на заданном пути. Ключевые параметры target group:
- HealthCheckIntervalSeconds — как часто проверять (по умолчанию 30 с).
- UnhealthyThresholdCount — сколько подряд неудачных проверок переводит target в
unhealthy(по умолчанию 2). - DeregistrationDelay — «draining» период, в течение которого ALB дождётся завершения уже открытых соединений, прежде чем полностью убрать target (по умолчанию 300 с).
Как только target помечен unhealthy, ALB перестаёт направлять на него новые запросы. Трафик перераспределяется на оставшиеся два инстанса по правилу round-robin (или least-outstanding-requests, если настроено).
Что происходит на уровне ASG
Если инстансы управляются Auto Scaling Group с ELB health check (не только EC2 health check), ASG получает сигнал о нездоровом инстансе и запускает замену:
- ASG завершает (terminate) unhealthy инстанс.
- Запускает новый инстанс согласно Launch Template/Configuration.
- Новый инстанс регистрируется в target group и проходит health check.
- После
HealthyThresholdCountуспешных проверок инстанс становитсяhealthy, и ALB начинает слать ему трафик.
Практический пример — AWS CLI
# Посмотреть состояние targets в группе
aws elbv2 describe-target-health \
--target-group-arn arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/my-tg/abc123
# Пример вывода после падения одного инстанса:
# {
# "TargetHealthDescriptions": [
# { "Target": {"Id": "i-aaa"}, "TargetHealth": {"State": "healthy"} },
# { "Target": {"Id": "i-bbb"}, "TargetHealth": {"State": "healthy"} },
# { "Target": {"Id": "i-ccc"}, "TargetHealth": {"State": "unhealthy",
# "Reason": "Target.FailedHealthChecks"} }
# ]
# }
# Принудительно пометить инстанс unhealthy в ASG для теста
aws autoscaling set-instance-health \
--instance-id i-ccc \
--health-status Unhealthy
# Убедиться, что ASG запустила замену
aws autoscaling describe-auto-scaling-groups \
--auto-scaling-group-names my-asg \
--query 'AutoScalingGroups[0].Instances[*].{Id:InstanceId,State:LifecycleState,Health:HealthStatus}'
Временная шкала события
t=0s инстанс i-ccc упал
t=30s ALB первая неудачная проверка
t=60s ALB вторая неудачная проверка → state: unhealthy
t=60s трафик идёт только на i-aaa и i-bbb
t=65s ASG получает ELB health check failure → terminate i-ccc
t=90s ASG запускает i-ddd (новый инстанс)
t=3m i-ddd проходит 2 health checks → state: healthy
t=3m ALB включает i-ddd в rotation
Подводные камни
- ASG использует только EC2 health check — ASG заменит инстанс только при «жёстком» сбое EC2, а не при проблемах с приложением. Обязательно включайте
HealthCheckType: ELBв ASG. - Поверхностный health check path — если
/healthвозвращает 200 даже при отказе БД, ALB не узнает о реальной неисправности. Используйте «deep health check», который проверяет зависимости. - Недостаточный capacity headroom — при двух оставшихся инстансах нагрузка вырастает на 50%. Если инстансы работали на 70% CPU, после падения одного могут уйти в насыщение. Держите желаемую ёмкость с запасом.
- Stateful сессии на локальном диске — если сессии хранятся in-memory или на диске упавшего инстанса, пользователи потеряют состояние. Выносите сессии в ElastiCache (Redis) или DynamoDB.
- Медленный deregistration delay — 300 секунд по умолчанию могут затянуть время восстановления. Для коротких запросов снизьте до 30–60 секунд.
- Sticky sessions (липкие сессии) — если включён session stickiness, часть пользователей была «прилеплена» к упавшему инстансу. После пометки unhealthy ALB сбросит stickiness и перенаправит их, но первый запрос может вернуть 502.
- Отсутствие ASG warm-up — без
DefaultInstanceWarmupASG может считать новый инстанс ready раньше, чем приложение реально запустилось, и ALB начнёт слать трафик на ещё не готовый сервис. - Только один AZ — если все три инстанса в одной зоне и эта AZ деградировала, ALB не спасёт. Распределяйте инстансы минимум по двум AZ.
Common mistakes
- Ожидать мгновенный failover без health check delay.
- Не использовать ASG для replacement.
- Хранить user sessions только на local instance.
What the interviewer is testing
- Описывает ALB target health behavior.
- Учитывает ASG replacement при desired capacity.
- Понимает impact на capacity и state.