Apache Airflow 很容易被误解成“装一个 Python 包,再打开 8080 端口”的工具。真正放到 VPS 上长期运行后,问题通常来自另一套系统边界:调度器、DAG Processor、API Server 和 Worker 是否齐全,Celery 消息是否会丢,元数据库能不能恢复,密钥是否被误换,以及升级时是否先迁移数据库。
本文以 Ubuntu 24.04、Apache Airflow 3.3.1、Docker Compose、CeleryExecutor、PostgreSQL 17、Redis 7.4 和 Caddy 为基准,搭建一套适合中小团队的单 VPS Airflow。方案包含 HTTPS、FAB 用户认证、容器健康检查、资源限制、异地备份、恢复演练和升级回滚。
Airflow 官方于 2026 年 8 月 12 日发布 3.3.1,并提供同版本 Docker 镜像。本文固定版本,不使用 latest。如果你在更晚时间部署,应先检查官方公告、发行说明和 Provider 兼容性,再决定是否更新版本号。
Airflow 的强项是“有依赖关系、要重试、要补数、要观察”的批处理工作流,例如:
- 每天从 API、数据库或对象存储抽取数据,再清洗并加载到数仓;
- 定时生成报表、同步搜索索引、归档日志或执行机器学习流水线;
- 多个任务之间存在先后依赖、分支、重试、超时和人工介入;
- 希望保留每次运行状态、日志、参数和失败原因。
它不适合毫秒级请求链路,也不应该替代消息队列或常驻微服务。只有几个互不依赖的定时 Shell 脚本时,systemd timer 或 cron 更轻;需要事件实时流处理时,Kafka、Flink 等工具通常更合适。
Airflow 3 把 api-server 作为 Web UI 和 API 的入口,并要求部署独立的 DAG Processor。旧教程中的 airflow webserver 已被替换,照抄 Airflow 2 的 Compose 很容易出现 UI 能开、DAG 却不解析的半工作状态。
同一台 VPS 上也可以使用 LocalExecutor,但 CeleryExecutor 能把调度与任务执行拆开:
| 组件 | 作用 | 本文实例数 |
|---|---|---|
| API Server | Web UI、认证、公开 API、健康检查 | 1 |
| Scheduler | 决定任务何时进入队列 | 1 |
| DAG Processor | 解析 DAG 文件并写入序列化结果 | 1 |
| Celery Worker | 从队列领取并执行任务 | 2,可按资源调整 |
| Triggerer | 运行 Deferrable Operator 的触发器 | 1 |
| PostgreSQL | 保存 Airflow 元数据和 Celery 结果 | 1 |
| Redis | Celery Broker,只负责传递任务消息 | 1 |
CeleryExecutor 需要 Celery Provider、Broker 和结果后端。本文用 Redis 做 Broker、PostgreSQL 做结果后端。Redis 不是 Airflow 元数据的权威副本;Broker 短暂丢失会影响任务分发,因此仍要设置持久化、密码、内存策略和监控。
单 VPS 的多个 Worker 可以隔离进程和控制并发,但不等于高可用。宿主机、磁盘或网络故障仍会让整套服务停止。关键业务应把 PostgreSQL、Redis、Worker 和控制面拆到独立故障域,并考虑官方 Helm Chart 或托管 Airflow。
官方 Docker Compose Quick Start 建议至少给 Docker 4GB 内存,但那只是能启动的下限。本文同时运行 PostgreSQL、Redis、六类 Airflow 组件和反向代理,实际建议如下:
| 使用规模 | VPS 建议 | Worker 并发 | 说明 |
|---|---|---|---|
| 学习验证 | 4 vCPU、8GB 内存、80GB SSD | 2 | 关闭示例 DAG,不跑重任务 |
| 小型生产 | 8 vCPU、16GB 内存、160GB NVMe | 4–8 | 本文推荐起点 |
| 中型任务 | 16 vCPU、32GB 内存起 | 按任务压测 | 优先拆分 Worker、数据库和日志存储 |
不要只按 DAG 数量估算资源。一个 DAG 可以启动大量 Python 进程,也可能调用 Pandas、浏览器或机器学习模型。Worker 并发必须结合单任务峰值内存压测;容器频繁出现退出码 137 时,先排查 OOM,而不是无脑提高重试次数。容器排障可参考 Docker 容器一直 Restarting 的检查清单。
| 端口 | 用途 | 本文处理方式 |
|---|---|---|
80/TCP | ACME 验证和跳转 HTTPS | 公网开放 |
443/TCP | Airflow Web UI/API | 公网开放,Caddy 终止 TLS |
8080/TCP | Airflow API Server | 仅 Docker 内网,不映射宿主机 |
5432/TCP | PostgreSQL | 仅 Docker 内网 |
6379/TCP | Redis | 仅 Docker 内网 |
22/TCP | SSH 管理 | 限制来源并使用密钥登录 |
即使 PostgreSQL 和 Redis 设置了密码,也不要映射成 0.0.0.0:5432 或 0.0.0.0:6379。数据库安全边界可参考 VPS 数据库不要直接暴露公网,HTTPS 端口不通时可按 VPS 端口、防火墙与安全组排查指南逐层检查。
先按 Docker 官方仓库安装 Docker Engine 和 Compose v2,然后确认版本:
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ca-certificates curl jq openssl
docker --version
docker compose version
把 airflow.example.com 的 A/AAAA 记录解析到 VPS,云安全组和 UFW 只开放 SSH、80 和 443。若启用了 Cloudflare 代理,首次签发证书遇到问题时应检查 DNS、SSL 模式和源站端口,不要直接关闭防火墙。
sudo install -d -m 0750 -o "$USER" -g "$USER" \
/opt/airflow/{dags,logs,plugins,config,backups,caddy-data,caddy-config}
cd /opt/airflow
AIRFLOW_FERNET_KEY="$(docker run --rm apache/airflow:3.3.1-python3.12 \
python -c 'from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())')"
umask 077
cat > .env <<EOF
AIRFLOW_IMAGE_NAME=airflow-local:3.3.1
AIRFLOW_UID=$(id -u)
AIRFLOW_DOMAIN=airflow.example.com
AIRFLOW_ADMIN_USER=airflowadmin
AIRFLOW_ADMIN_PASSWORD=$(openssl rand -hex 24)
[email protected]
POSTGRES_DB=airflow
POSTGRES_USER=airflow
POSTGRES_PASSWORD=$(openssl rand -hex 32)
REDIS_PASSWORD=$(openssl rand -hex 32)
AIRFLOW_FERNET_KEY=${AIRFLOW_FERNET_KEY}
AIRFLOW_API_SECRET_KEY=$(openssl rand -hex 32)
AIRFLOW_JWT_SECRET=$(openssl rand -hex 32)
EOF
chmod 600 .env
把域名和管理员邮箱换成真实值。.env 不能提交到 Git、聊天记录或工单。Fernet Key 用于加密元数据库中的 Connection 与 Variable 密码;JWT Secret 在 Scheduler 和 API Server 之间必须一致;API Secret Key 还参与会话和 Worker 日志访问。三者都要纳入离线密钥备份。
Airflow 3 默认的 Simple Auth Manager 主要面向开发和测试。公网生产环境应使用成熟的认证管理器;本文安装官方 FAB Provider,后续可以继续接入 OAuth、LDAP、Authentik 或其他 SSO。
创建 /opt/airflow/Dockerfile:
FROM apache/airflow:3.3.1-python3.12
ARG AIRFLOW_VERSION=3.3.1
ARG PYTHON_VERSION=3.12
ARG CONSTRAINT_URL=https://raw.githubusercontent.com/apache/airflow/constraints-${AIRFLOW_VERSION}/constraints-${PYTHON_VERSION}.txt
RUN pip install --no-cache-dir \
"apache-airflow==${AIRFLOW_VERSION}" \
apache-airflow-providers-celery \
apache-airflow-providers-fab \
--constraint "${CONSTRAINT_URL}"
约束文件把 Provider 和传递依赖固定到与 Airflow 3.3.1 兼容的组合。不要只执行 pip install -U,否则一次构建可能悄悄改变 SQLAlchemy、Celery 或 Provider 版本。业务 DAG 需要额外包时,把它们加入单独的 requirements.txt,重新构建并保存镜像摘要。
创建 /opt/airflow/compose.yml:
x-airflow-common: &airflow-common
image: ${AIRFLOW_IMAGE_NAME}
build:
context: .
env_file:
- .env
environment: &airflow-common-env
AIRFLOW__CORE__EXECUTOR: CeleryExecutor
AIRFLOW__CORE__AUTH_MANAGER: airflow.providers.fab.auth_manager.fab_auth_manager.FabAuthManager
AIRFLOW__DATABASE__EXTERNAL_DB_MANAGERS: airflow.providers.fab.auth_manager.models.db.FABDBManager
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: postgresql+psycopg2://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres/${POSTGRES_DB}
AIRFLOW__CELERY__RESULT_BACKEND: db+postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgres/${POSTGRES_DB}
AIRFLOW__CELERY__BROKER_URL: redis://:${REDIS_PASSWORD}@redis:6379/0
AIRFLOW__CORE__FERNET_KEY: ${AIRFLOW_FERNET_KEY}
AIRFLOW__API__SECRET_KEY: ${AIRFLOW_API_SECRET_KEY}
AIRFLOW__API_AUTH__JWT_SECRET: ${AIRFLOW_JWT_SECRET}
AIRFLOW__API__BASE_URL: https://${AIRFLOW_DOMAIN}
AIRFLOW__CORE__LOAD_EXAMPLES: "false"
AIRFLOW__SCHEDULER__ENABLE_HEALTH_CHECK: "true"
AIRFLOW__LOGGING__LOGGING_LEVEL: INFO
user: "${AIRFLOW_UID:-50000}:0"
volumes:
- ./dags:/opt/airflow/dags
- ./logs:/opt/airflow/logs
- ./plugins:/opt/airflow/plugins
- ./config:/opt/airflow/config
depends_on: &airflow-common-depends-on
postgres:
condition: service_healthy
redis:
condition: service_healthy
airflow-init:
condition: service_completed_successfully
restart: unless-stopped
logging:
driver: json-file
options:
max-size: 20m
max-file: "5"
services:
postgres:
image: postgres:17-alpine
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- postgres-data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 10s
timeout: 5s
retries: 10
restart: unless-stopped
mem_limit: 2g
redis:
image: redis:7.4-alpine
command:
- redis-server
- --appendonly
- "yes"
- --requirepass
- ${REDIS_PASSWORD}
- --maxmemory
- 768mb
- --maxmemory-policy
- noeviction
volumes:
- redis-data:/data
healthcheck:
test: ["CMD-SHELL", "redis-cli -a '$${REDIS_PASSWORD}' ping | grep PONG"]
interval: 10s
timeout: 5s
retries: 10
restart: unless-stopped
mem_limit: 1g
airflow-init:
<<: *airflow-common
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
restart: "no"
command:
- bash
- -c
- |
set -e
airflow db migrate
if ! airflow users create \
--username "$${AIRFLOW_ADMIN_USER}" \
--password "$${AIRFLOW_ADMIN_PASSWORD}" \
--firstname Airflow \
--lastname Admin \
--role Admin \
--email "$${AIRFLOW_ADMIN_EMAIL}"; then
airflow users list | grep -Fq "$${AIRFLOW_ADMIN_USER}"
fi
airflow-apiserver:
<<: *airflow-common
command: api-server
healthcheck:
test: ["CMD", "curl", "--fail", "http://localhost:8080/api/v2/monitor/health"]
interval: 20s
timeout: 10s
retries: 10
start_period: 60s
mem_limit: 2g
airflow-scheduler:
<<: *airflow-common
command: scheduler
mem_limit: 2g
airflow-dag-processor:
<<: *airflow-common
command: dag-processor
mem_limit: 2g
airflow-triggerer:
<<: *airflow-common
command: triggerer
mem_limit: 1g
airflow-worker-1:
<<: *airflow-common
command: celery worker
environment:
<<: *airflow-common-env
AIRFLOW__CELERY__WORKER_CONCURRENCY: "4"
mem_limit: 4g
airflow-worker-2:
<<: *airflow-common
command: celery worker
environment:
<<: *airflow-common-env
AIRFLOW__CELERY__WORKER_CONCURRENCY: "4"
mem_limit: 4g
caddy:
image: caddy:2-alpine
environment:
AIRFLOW_DOMAIN: ${AIRFLOW_DOMAIN}
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- ./caddy-data:/data
- ./caddy-config:/config
depends_on:
airflow-apiserver:
condition: service_healthy
restart: unless-stopped
mem_limit: 256m
volumes:
postgres-data:
redis-data:
mem_limit 是单容器上限,不代表所有容器会同时吃满,但 8GB VPS 不应该原样运行两个 4GB Worker。小机器先删掉 airflow-worker-2,再把并发改成 2。更通用的 Compose 健康检查、日志和回滚策略可参考 Docker Compose 生产环境清单。
Redis 使用 noeviction,避免达到内存上限后主动淘汰 Celery 消息;代价是写入会报错,所以必须监控内存并及时扩容。需要 RabbitMQ 的确认、路由和运维能力时,可以结合 VPS 搭建 RabbitMQ 指南评估替换 Broker。
创建 /opt/airflow/Caddyfile:
{$AIRFLOW_DOMAIN} {
encode zstd gzip
header {
Strict-Transport-Security "max-age=31536000; includeSubDomains"
X-Content-Type-Options "nosniff"
Referrer-Policy "strict-origin-when-cross-origin"
}
reverse_proxy airflow-apiserver:8080
}
Caddy 会自动申请和续期证书。不要把 Airflow API Server 的 8080 端口同时暴露到公网,否则访问者可以绕过 Caddy 的 TLS 与安全头。若还有 Cloudflare、Nginx 或负载均衡器,应只保留一个明确的 TLS 终止点,并把真实域名写进 AIRFLOW__API__BASE_URL。
先让 Compose 完成变量展开和结构校验。注意输出会包含密钥,不要把完整结果公开:
cd /opt/airflow
docker compose config --quiet
docker compose build --pull
docker compose up airflow-init
docker compose up -d
docker compose ps
初始化容器会依次运行 airflow db migrate、FAB 数据库迁移和管理员创建。第一次启动后检查关键日志:
docker compose logs --tail=100 airflow-init
docker compose logs --tail=100 airflow-apiserver
docker compose logs --tail=100 airflow-scheduler
docker compose logs --tail=100 airflow-dag-processor
docker compose logs --tail=100 airflow-worker-1
docker compose logs --tail=100 caddy
确认服务健康:
curl -fsS "https://${AIRFLOW_DOMAIN}/api/v2/monitor/health" | jq
docker compose exec airflow-scheduler \
airflow jobs check --job-type SchedulerJob --local
docker compose exec airflow-dag-processor \
airflow jobs check --job-type DagProcessorJob --local
docker compose exec airflow-worker-1 \
celery --app airflow.providers.celery.executors.celery_executor.app \
inspect ping
/api/v2/monitor/health 是无需 Airflow 权限的官方健康端点,适合外部探针,但不应被当作完整业务验收。还要检查 DAG 是否成功解析、Worker 能否领取任务、日志能否回传,以及 PostgreSQL 和 Redis 是否持续健康。整套主机指标可以接入 Prometheus + Grafana VPS 监控方案。
创建 /opt/airflow/dags/vps_smoke_test.py:
from datetime import datetime
from airflow.sdk import DAG, task
with DAG(
dag_id="vps_smoke_test",
schedule=None,
start_date=datetime(2026, 1, 1),
catchup=False,
tags=["smoke-test"],
) as dag:
@task
def show_worker() -> str:
import socket
return socket.gethostname()
@task
def confirm(hostname: str) -> None:
print(f"Celery task completed on {hostname}")
confirm(show_worker())
等待 DAG Processor 解析后,在 UI 中手动触发。成功标准不是“页面出现 DAG”,而是两个任务都变绿,Worker 日志显示任务已接收,UI 能打开完整日志。若 DAG 不出现,先运行:
docker compose exec airflow-dag-processor airflow dags list-import-errors
docker compose exec airflow-dag-processor python /opt/airflow/dags/vps_smoke_test.py
Celery Worker 总并发只是第一层限制。还应根据数据库连接数、第三方 API 限速和任务内存设置 Airflow Pool,再给单个 DAG 设置并发边界。一个常见的起点是:
docker compose exec airflow-apiserver \
airflow pools set external_api 4 "第三方 API 并发限制"
docker compose exec airflow-apiserver airflow pools list
在任务里指定 pool="external_api"。对于内存很高的任务,创建更小的 Pool;对于大量轻量任务,再逐步提高 Worker 数量。不要把 parallelism、Worker concurrency 和数据库连接池同时拉满,否则瓶颈会从 CPU 转移到 PostgreSQL 连接、磁盘 I/O 或外部 API。
Airflow 的备份不能只复制 dags/。至少需要保存:
- PostgreSQL 元数据库:DAG Run、Task Instance、用户、Connection、Variable 等状态;
dags/、plugins/、config/和部署文件;.env中的 Fernet Key、JWT Secret、API Secret Key 与数据库密码;- 任务日志,或者已经配置好的远程日志存储;
- 自定义镜像的 Dockerfile、requirements、镜像标签和摘要。
创建 /opt/airflow/backup.sh:
#!/usr/bin/env bash
set -Eeuo pipefail
cd /opt/airflow
stamp="$(date -u +%Y%m%dT%H%M%SZ)"
dest="backups/${stamp}"
mkdir -p "${dest}"
docker compose exec -T postgres \
pg_dump -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" \
--format=custom --no-owner --no-privileges \
> "${dest}/airflow.dump"
tar --exclude='./backups' \
-czf "${dest}/airflow-files.tar.gz" \
.env Dockerfile compose.yml Caddyfile dags plugins config
sha256sum "${dest}"/* > "${dest}/SHA256SUMS"
find backups -mindepth 1 -maxdepth 1 -type d -mtime +14 -print
脚本最后只列出超过 14 天的备份,不会自动删除。确认异地副本和保留策略后,再由专门的备份工具清理。应把整个备份目录加密同步到另一家对象存储或另一台主机,并定期执行恢复演练。
不要只备份 PostgreSQL 却丢掉 Fernet Key。官方文档明确说明,直接更换 Fernet Key 会导致已有 Connection 和 Variable 的加密字段无法解密。正确轮换方式是先配置 新密钥,旧密钥,运行 airflow rotate-fernet-key,确认完成后再移除旧密钥。
恢复应在隔离目录或临时 VPS 上执行,不要第一次就覆盖生产:
cd /opt/airflow
docker compose down
docker compose up -d postgres redis
docker compose exec -T postgres \
dropdb -U "${POSTGRES_USER}" --if-exists "${POSTGRES_DB}"
docker compose exec -T postgres \
createdb -U "${POSTGRES_USER}" "${POSTGRES_DB}"
docker compose exec -T postgres \
pg_restore -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" \
--clean --if-exists --no-owner --no-privileges \
< backups/替换为时间戳/airflow.dump
docker compose run --rm airflow-init
docker compose up -d
恢复后至少验证管理员登录、DAG 列表、历史运行、Connection 解密、一次测试任务和日志读取。Redis 数据通常不作为灾难恢复的核心:重建 Broker 后,应在 Airflow 状态与实际外部系统之间核对未完成任务,避免重复执行非幂等操作。
升级前先阅读 Airflow 核心与 Provider 的发行说明,再执行数据库备份。元数据库迁移时应停止调度和 Worker,避免旧组件在新 Schema 上继续写入:
cd /opt/airflow
./backup.sh
docker compose stop \
airflow-apiserver airflow-scheduler airflow-dag-processor \
airflow-triggerer airflow-worker-1 airflow-worker-2
# 修改 Dockerfile 和 .env 中的固定版本后
docker compose build --pull
docker compose run --rm airflow-init
docker compose up -d
docker compose ps
Airflow 官方建议使用 airflow db migrate,不是已经移除的 airflow db init 或旧版 db upgrade。遇到跨大版本升级,应先在恢复出来的数据库副本上演练。回滚不仅是把镜像标签改回去:如果数据库迁移不可向后兼容,必须同时恢复升级前的 PostgreSQL 备份。
检查 AIRFLOW__CORE__AUTH_MANAGER 是否指向 FAB、Provider 是否已安装、airflow-init 是否成功运行,以及 Caddy 转发的域名是否与 AIRFLOW__API__BASE_URL 一致。多个 API Server 必须共享相同 API Secret Key。
Airflow 3 必须运行 DAG Processor。检查 airflow-dag-processor 容器、文件挂载权限和 airflow dags list-import-errors。不要只重启 API Server。
依次检查 Redis 健康、Broker URL、Worker 是否在线、Worker queue 是否匹配、Celery Provider 是否存在。再检查 Worker 并发和 Airflow Pool 是否已经用尽。
确认所有相关组件的系统时间同步,并共享正确的 API Secret Key 与 JWT Secret。Airflow 官方特别提醒,机器时间不一致会导致日志或 API Token 校验失败。
先统计 API Server、Scheduler、DAG Processor、Triggerer 和 Worker 的连接总量,再调整 SQLAlchemy Pool,而不是只提高 PostgreSQL max_connections。连接数增加还会消耗内存,并可能掩盖连接泄漏。
使用 docker compose ps、docker inspect 和宿主机 journalctl -k 查看退出码与 OOM 记录。降低 Worker concurrency、限制高内存 Pool,或升级 VPS。更详细步骤见 Docker Restarting 排障指南。
官方 Quick Start 建议 Docker 至少有 4GB 内存,但 CeleryExecutor 加 PostgreSQL、Redis、API Server 和多个 Worker 后,4GB 只适合短暂实验。小型生产建议从 8 vCPU、16GB 内存开始,再根据任务峰值、DAG 解析时间和 Worker OOM 情况压测调整。
不能按旧教程继续使用。Airflow 3 用 airflow api-server 替代旧的 webserver 命令,并且 DAG Processor 是所有 Airflow 3 部署的必需组件。升级时要同时修改启动命令、健康检查和反向代理上游。
PostgreSQL 元数据库、DAG、配置和密钥必须备份。Redis 在本文中只是 Celery Broker,开启 AOF 可以降低短暂故障影响,但它不是权威业务状态;灾难恢复时重点是恢复 PostgreSQL,再核对 queued/running 任务是否可以安全重跑。
官方把 Simple Auth Manager 定位为开发和测试用途。公网生产环境至少应使用 FAB 这类可管理用户和角色的 Auth Manager,最好再接入企业 SSO、多因素认证、VPN 或零信任访问,并限制管理页面来源。
不能。Fernet Key 用于加密 Connection 与 Variable 的敏感字段,丢失后即使 PostgreSQL 备份完整也无法解密。它必须与数据库备份分开、安全地保存;轮换时使用官方的多密钥过渡流程和 airflow rotate-fernet-key。
不算。两个 Worker 只提高同一宿主机内的并行度和进程隔离,VPS 宕机、磁盘损坏或网络中断时仍会一起不可用。需要高可用时,应跨独立故障域部署数据库、Broker、控制面和 Worker,并使用远程日志与异地备份。
- Airflow、Provider、PostgreSQL 和 Redis 都使用固定版本,不使用
latest; - 只有 80、443 和受限 SSH 对公网开放,8080、5432、6379 均未映射;
- API Server、Scheduler、DAG Processor、Triggerer 和 Worker 均在运行;
/api/v2/monitor/health、验收 DAG 和 Worker 日志全部通过;- FAB 管理员使用随机密码,后续接入 SSO 或零信任访问;
- Fernet、JWT、API Secret、数据库密码均有安全离线副本;
- PostgreSQL、部署文件和任务日志有异地备份,并完成过恢复演练;
- Worker concurrency、Airflow Pool、数据库连接和 VPS 内存按压测设置;
- 升级前阅读发行说明、备份数据库、停止组件并运行
airflow db migrate; - Prometheus/Grafana 或等效系统已监控主机、容器、队列和任务失败率。
