HA reference architecture для Airflow 2.10/2.11 LTS
Production-grade Airflow 2.10/2.11 — это не один контейнер, а ~12-15 рабочих процессов, распределённых по 5-7 уровням инфраструктуры. Этот урок — полная reference-архитектура, которую вы можете взять как чертёж и адаптировать под свой scale: от small (50 DAGs) до large (5000+ DAGs).
В Airflow 2.x четыре главных компонента имеют HA-семантику: scheduler (HA через row-level locks в slot_pool — модуль 04), triggerer (HA через task_instance.next_method assignment), webserver (stateless — масштабируется горизонтально), DAG processor (опционально standalone в 2.x, mandatory в 3.x — AIP-66). Метаданные живут в одной PostgreSQL — она и есть основная точка отказа, потому её защищаем через Multi-AZ и read-only replica.
Полная reference-схема
Kubernetes Deployment — основной workload для stateless apps
Sizing per deployment scale
Конкретные числа для трёх типичных scale categories. Эти значения проверены на реальных deployments и могут служить starting point.
| Параметр | Small (≤50 DAGs) | Medium (50-500) | Large (500-5000) |
|---|---|---|---|
| Webservers | 2 | 2-3 | 3-4 |
| Schedulers | 1 | 2 | 3-4 |
| DAG processors | 0 (in-scheduler) | 1 standalone | 2 standalone |
| Triggerers | 1 | 2 | 2-3 |
| Celery workers | 2-4 | 4-12 (autoscale) | 16-64 (autoscale) |
| K8s executor concurrency | 16 | 64 | 256 |
| PostgreSQL instance | db.t3.large | db.m6i.xlarge | db.r6i.2xlarge |
| PgBouncer pool size | 25 | 50 | 100 |
| Redis nodes | 1 | 3 (cluster) | 6 (cluster) |
| Daily TI throughput | ~5k | ~50k | ~200k+ |
Самая частая ошибка sizing — масштабировать schedulers вверх до 10+ в надежде увеличить throughput. После 3-4 scheduler-ов critical section становится bottleneck (модуль 04). Если throughput низкий — сначала тюнинг PostgreSQL (PgBouncer, autovacuum, partitioning), потом scheduler-ов.
Multi-AZ deployment topology
Распределение компонентов по zones для отказоустойчивости:
AZ-1 (us-east-1a) AZ-2 (us-east-1b) AZ-3 (us-east-1c)
├── Webserver-1 ├── Webserver-2 ├── Webserver-3 (optional)
├── Scheduler-1 ├── Scheduler-2 ├── DAG Processor-2 (optional)
├── DAG Processor-1 ├── Triggerer-2 ├── Celery worker pool C
├── Triggerer-1 ├── Celery worker pool B
├── Celery worker pool A ├── Redis replica 2
├── PgBouncer-1 ├── PgBouncer-2
├── Redis primary ├── RDS Postgres standby (sync)
└── RDS Postgres primary └── Redis replica 1
Rule of thumb: каждый critical component (scheduler, triggerer, webserver) должен иметь хотя бы одну replica в другой AZ. DAG processor можно держать в одной AZ — при его краткой недоступности DAGs продолжают работать на уже serialized state.
Что именно даёт HA каждый компонент
| Компонент | Тип HA | Failover time | Поведение при отказе |
|---|---|---|---|
| Scheduler | Active-Active (row locks) | ~30s (heartbeat threshold) | Второй scheduler adopt-ит orphan TI, новые TI ставятся другим scheduler |
| Webserver | Stateless N+1 | <5s (LB health check) | Запросы маршрутизируются на живые replicas |
| Triggerer | Active-Active (assignment) | ~30s | Trigger reassigned через airflow triggerer recheck-triggers |
| DAG Processor | Single-active или Active-Active (file claim) | До 5 min | DAGs не reparsed, но scheduler работает на старом serialized_dag |
| PostgreSQL | Primary + standby (Multi-AZ) | 60-120s | Кратковременное окно — все компоненты retry connection |
| Redis | Cluster (primary + replicas) | ~10-30s | Celery tasks retry, в visibility_timeout не теряются |
Webserver полностью stateless в 2.x — даже UI state (last selected DAG, theme) хранится в cookies или DB. Поэтому LB sticky sessions не нужны. Это упрощает rolling restart до простого kubectl rollout restart deployment/airflow-webserver без потери пользовательских сессий.
Network policies и subnet segmentation
Production setup разделяет компоненты по subnets:
| Subnet | Что внутри | Доступ |
|---|---|---|
| public-subnet | Load Balancer | Inbound 443 from 0.0.0.0/0 |
| app-subnet (private) | Webservers, schedulers, DAG processor, triggerer | Outbound to db-subnet, redis-subnet, secrets backend |
| worker-subnet (private) | Celery workers, K8s pods | Outbound to db-subnet, external data sources (S3, Snowflake) |
| db-subnet (private) | RDS PostgreSQL, PgBouncer | Inbound only from app/worker subnets, port 5432 |
| redis-subnet (private) | ElastiCache | Inbound only from app/worker subnets, port 6379 |
Worker-subnet отделён, потому что workers выполняют user code — это самый уязвимый компонент. Если worker compromise — у него нет direct access к DB, только через app-subnet или через REST API.
Production gotchas
Сloudflare/CDN перед webserver — анти-паттерн. Airflow Web UI делает heavy WebSocket polling для realtime graph view. CDN добавляет latency и проявляется в зависании UI. Используйте plain ALB/NLB с TLS termination.
Не запускайте scheduler и webserver в одном Pod. Они конкурируют за CPU и память. При spike нагрузки на UI webserver-у нужны ресурсы, но scheduler важнее — он определяет throughput всего кластера.
PgBouncer transaction mode ломает SET LOCAL и prepared statements. Airflow поддерживает это с 2.7+ (SQLAlchemy hint), но если используете custom plugins с raw psycopg2 — проверьте. Альтернатива: session mode pool (но эффективность ниже).
Health check для scheduler — не просто process alive. Используйте airflow jobs check --job-type SchedulerJob --hostname $HOSTNAME --limit 5 — он смотрит на latest_heartbeat в job table. Просто kill -0 показывает живой процесс, но не работающий scheduler.
Triggerer всегда нужен, даже если deferrable не используются. В 2.6+ некоторые built-in sensors переписаны deferrable (DateTimeSensorAsync, TimeDeltaSensorAsync) — без triggerer они падают. Min 1 triggerer mandatory.
Что мы рассмотрим дальше
| Урок | О чём |
|---|---|
| 03 — Helm chart | Как описать всю эту топологию в values.yaml |
| 04 — PostgreSQL tuning | Конкретные параметры shared_buffers, autovacuum, partitioning |
| 05 — Managed offerings | Когда брать MWAA/Composer вместо self-hosted |
| 06 — Upgrade procedure | Blue/green deploy без downtime |
| 07 — Disaster recovery | Backup, Fernet key rotation, RTO/RPO |
| 08 — Security hardening | Network policies, audit logs, TLS everywhere |