Apache Airflow高可用集群部署与故障恢复策略
概述
Apache Airflow作为业界领先的工作流调度平台,在生产环境中部署高可用(High Availability, HA)集群至关重要。本文将深入探讨Airflow在Kubernetes环境下的高可用部署架构、配置策略以及故障恢复机制,帮助您构建稳定可靠的数据管道调度系统。
高可用架构设计
核心组件冗余部署
Apache Airflow的高可用架构需要确保以下核心组件的冗余:
组件部署策略
| 组件 | 高可用策略 | 最小副本数 | 推荐配置 |
|---|---|---|---|
| Scheduler | 多副本部署 + 数据库锁 | 2+ | 3副本跨可用区 |
| Webserver | 负载均衡 + 多副本 | 2+ | 2-3副本 |
| Worker | 自动扩缩容 + 健康检查 | 动态调整 | KEDA自动扩缩 |
| 元数据数据库 | 主从复制 + PgBouncer | 1主2从 | 云托管数据库 |
| 消息队列 | Redis集群/Sentinel | 3节点 | Redis 6.0+集群 |
Kubernetes Helm部署配置
基础高可用配置
# values-high-availability.yaml
executor: "CeleryExecutor"
# Scheduler高可用配置
scheduler:
enabled: true
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
livenessProbe:
enabled: true
initialDelaySeconds: 30
periodSeconds: 10
failureThreshold: 3
startupProbe:
enabled: true
initialDelaySeconds: 60
periodSeconds: 10
failureThreshold: 10
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
component: scheduler
topologyKey: kubernetes.io/hostname
# Webserver高可用配置
webserver:
enabled: true
replicas: 2
service:
type: ClusterIP
livenessProbe:
enabled: true
initialDelaySeconds: 30
periodSeconds: 10
ingress:
enabled: true
className: nginx
annotations:
kubernetes.io/ingress.class: nginx
nginx.ingress.kubernetes.io/affinity: "cookie"
nginx.ingress.kubernetes.io/session-cookie-name: "route"
nginx.ingress.kubernetes.io/session-cookie-expires: "172800"
nginx.ingress.kubernetes.io/session-cookie-max-age: "172800"
# Worker自动扩缩配置
workers:
replicas: 1
keda:
enabled: true
minReplicaCount: 1
maxReplicaCount: 10
pollingInterval: 30
cooldownPeriod: 300
外部数据库配置
# 使用外部PostgreSQL数据库
postgresql:
enabled: false
data:
metadataConnection:
user: airflow
pass: ${POSTGRES_PASSWORD}
protocol: postgresql
host: postgresql-ha.example.com
port: 5432
db: airflow
sslmode: require
# 启用PgBouncer连接池
pgbouncer:
enabled: true
maxClientConn: 200
metadataPoolSize: 20
resultBackendPoolSize: 10
外部Redis配置
# 使用外部Redis集群
redis:
enabled: false
data:
brokerUrl: redis://redis-cluster.example.com:6379/0
resultBackendConnection:
protocol: redis
host: redis-cluster.example.com
port: 6379
db: 1
故障恢复策略
1. Scheduler故障恢复
Airflow Scheduler使用数据库行锁实现高可用:
-- Scheduler使用SELECT ... FOR UPDATE实现分布式锁
SELECT * FROM slot_pool FOR UPDATE NOWAIT;
恢复策略:
- 监控Scheduler健康状态
- 自动重启失败的Pod
- 设置合理的terminationGracePeriodSeconds
- 实现优雅关闭机制
2. Worker故障处理
workers:
livenessProbe:
enabled: true
initialDelaySeconds: 60
periodSeconds: 30
timeoutSeconds: 10
failureThreshold: 3
command:
- sh
- -c
- |
# 检查Celery worker状态
celery -A airflow.executors.celery_executor inspect ping -d worker@$HOSTNAME | grep -q "pong"
terminationGracePeriodSeconds: 600 # 允许任务完成
safeToEvict: false # 防止任务中断
3. 数据库连接故障恢复
# 数据库重连策略
AIRFLOW__DATABASE__SQL_ALCHEMY_ENGINE_OPTIONS: |
{
"pool_size": 10,
"max_overflow": 20,
"pool_timeout": 30,
"pool_recycle": 1800,
"pool_pre_ping": true,
"connect_args": {
"connect_timeout": 10,
"options": "-c statement_timeout=30000"
}
}
监控与告警
Prometheus监控配置
# 启用StatsD导出器
statsd:
enabled: true
service:
annotations:
prometheus.io/scrape: "true"
prometheus.io/port: "9102"
# 自定义监控指标
config:
metrics:
statsd_on: true
statsd_host: "127.0.0.1"
statsd_port: 9125
statsd_prefix: "airflow"
关键监控指标
| 指标名称 | 描述 | 告警阈值 |
|---|---|---|
| scheduler_heartbeat | Scheduler心跳 | > 120秒无心跳 |
| dag_processing_total | DAG处理数量 | 突然下降50% |
| task_failures | 任务失败率 | > 5% |
| executor_open_slots | 执行器空闲槽位 | < 10% |
| database_connections | 数据库连接数 | > 80%最大连接数 |
备份与灾难恢复
元数据数据库备份
# 每日全量备份
pg_dump -h postgresql-ha.example.com -U airflow -F c -b -v -f /backup/airflow_$(date +%Y%m%d).backup airflow
# 备份保留策略
find /backup -name "airflow_*.backup" -mtime +30 -delete
DAG文件备份策略
dags:
gitSync:
enabled: true
repo: "https://github.com/your-org/airflow-dags.git"
branch: "main"
subPath: "dags"
syncWait: 60
knownHosts: |
github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
性能优化建议
数据库优化
# 数据库连接优化
config:
core:
sql_alchemy_pool_size: 5
sql_alchemy_max_overflow: 10
sql_alchemy_pool_recycle: 1800
sql_alchemy_pool_pre_ping: true
scheduler:
min_file_process_interval: 30
dag_dir_list_interval: 300
parsing_processes: 2
执行器优化
# Celery执行器优化
config:
celery:
worker_concurrency: 16
worker_prefetch_multiplier: 4
task_acks_late: true
task_reject_on_worker_lost: true
部署验证清单
高可用验证步骤
-
组件健康检查
# 检查所有Pod状态 kubectl get pods -n airflow -l release=airflow # 检查服务端点 kubectl get endpoints -n airflow -
故障注入测试
# 随机终止一个Scheduler Pod kubectl delete pod -n airflow airflow-scheduler-xxxxx --force # 验证自动恢复 watch kubectl get pods -n airflow -l component=scheduler -
负载测试
# 模拟高负载场景 airflow dags trigger example_dag --conf '{"test_load": true}'
总结
构建Apache Airflow高可用集群需要综合考虑多个层面的冗余和故障恢复机制。通过合理的Kubernetes部署配置、数据库集群、消息队列冗余以及完善的监控告警系统,可以确保Airflow在生产环境中的稳定运行。
关键成功因素包括:
- 多副本Scheduler部署确保调度连续性
- 外部数据库和消息队列提供数据持久化
- 自动扩缩容机制应对负载波动
- 全面的监控和告警系统
- 定期的备份和灾难恢复演练
遵循本文提供的配置策略和最佳实践,您将能够构建一个稳定、可靠且易于维护的Apache Airflow高可用集群。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



