5.6.3 分布式与集中式调度工具
分布式与集中式调度工具用于解决单机 cron 无法覆盖的跨主机、跨环境与多依赖任务编排需求。集中式调度强调统一入口、统一权限与统一审计,分布式调度强调任务靠近数据与执行节点自治。选型时需综合考虑任务规模、依赖复杂度、执行环境异构性与运维成本。
原理草图(集中式调度平台 + 分布式执行器):
常见工具形态与特点:
- 集中式调度平台:统一 Web 控制台、统一权限、集中日志与审计,适合企业级批处理与复杂依赖编排。常见特性包括 DAG 工作流、依赖管理、回溯重跑、失败重试与告警。
- 分布式任务框架:提供注册中心、执行器与任务分片能力,强调水平扩展与高可用,适合海量、短周期任务。
- 云原生调度:与容器平台深度集成,面向容器任务与弹性资源,适合微服务与批处理混合场景。
关键能力清单(选型与落地的评估要点):
- 高可用与容灾:调度器主备、执行器心跳、任务锁与一致性保障。
- 任务依赖与编排:支持 DAG、条件触发、时间触发、外部事件触发。
- 执行环境隔离:多执行器、多租户、资源配额与隔离策略。
- 可观测性:任务状态、日志聚合、运行指标、失败原因定位。
- 安全与权限:细粒度权限、审计、密钥管理与执行凭证隔离。
- 扩展与集成:API、Webhook、消息队列、配置中心与告警平台集成。
安装与示例(以 xxl-job 为例,含调度中心与执行器)
1)部署调度中心(Docker,含 MySQL):
# 1. 创建网络与目录
docker network create xxl-job-net
mkdir -p /opt/xxl-job/{mysql,logs}
# 2. 启动 MySQL
docker run -d --name xxl-mysql --network xxl-job-net \
-e MYSQL_ROOT_PASSWORD=Root@123 \
-e MYSQL_DATABASE=xxl_job \
-v /opt/xxl-job/mysql:/var/lib/mysql \
mysql:5.7
# 3. 初始化数据库(导入官方 SQL)
docker exec -i xxl-mysql mysql -uroot -pRoot@123 xxl_job < /path/xxl-job.sql
# 4. 启动调度中心
docker run -d --name xxl-admin --network xxl-job-net \
-p 8080:8080 \
-e PARAMS="--spring.datasource.url=jdbc:mysql://xxl-mysql:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai \
--spring.datasource.username=root --spring.datasource.password=Root@123" \
xuxueli/xxl-job-admin:2.4.0
命令说明:
- docker network create:保证容器间可互通。
- xxl-job.sql:初始化调度元数据表。
- PARAMS:配置调度中心连接数据库。
2)配置与启动执行器(Shell 任务示例):
# 假设执行器是 Java 服务,应用配置在 /opt/xxl-job-executor/conf/application.properties
cat > /opt/xxl-job-executor/conf/application.properties <<'EOF'
xxl.job.admin.addresses=http://调度中心IP:8080/xxl-job-admin
xxl.job.executor.appname=demo-executor
xxl.job.executor.ip=执行器IP
xxl.job.executor.port=9999
xxl.job.executor.logpath=/opt/xxl-job/logs
xxl.job.accessToken=
EOF
# 启动执行器
cd /opt/xxl-job-executor
./bin/start.sh
执行器任务脚本示例(在调度平台中注册“Shell任务”):
#!/bin/bash
# /opt/tasks/backup_db.sh
DATE=$(date +%F)
mysqldump -h127.0.0.1 -uroot -p'Root@123' appdb > /data/backup/appdb_${DATE}.sql
echo "backup done: /data/backup/appdb_${DATE}.sql"
预期效果:
- 调度中心任务触发后,执行器日志中可看到脚本输出。
- 任务状态变为“成功”,日志可在控制台查看。
集中式 DAG 示例(Airflow,Docker Compose):
# /opt/airflow/docker-compose.yml
version: "3"
services:
airflow:
image: apache/airflow:2.7.0
environment:
AIRFLOW__CORE__EXECUTOR: LocalExecutor
AIRFLOW__DATABASE__SQL_ALCHEMY_CONN: sqlite:////opt/airflow/airflow.db
ports:
- "8081:8080"
volumes:
- ./dags:/opt/airflow/dags
# /opt/airflow/dags/etl_demo.py
from airflow import DAG
from airflow.operators.bash import BashOperator
from datetime import datetime
with DAG("etl_demo", start_date=datetime(2023,1,1), schedule="0 2 * * *", catchup=False) as dag:
extract = BashOperator(task_id="extract", bash_command="echo extract")
transform = BashOperator(task_id="transform", bash_command="echo transform")
load = BashOperator(task_id="load", bash_command="echo load")
extract >> transform >> load
运行与验证:
cd /opt/airflow
docker compose up -d
# 访问 http://服务器IP:8081 查看 DAG 与执行日志
典型使用场景:
- 日志/数据 ETL 的定时调度与依赖链管理
- 跨集群发布与批量作业执行
- 定期巡检、备份、清理与合规性任务
- 高并发短周期任务(健康检查、队列消费触发的补偿任务)
落地建议:
1. 梳理任务清单与依赖图,明确关键路径与 SLA。
2. 统一任务规范:命名、输入输出、日志格式、幂等与重试策略。
3. 建立分层调度策略:强依赖任务使用集中式编排,海量短任务使用分布式执行器。
4. 配套告警与回滚机制:失败自动告警,支持一键重跑与部分重跑。
5. 容量与性能评估:并发执行能力、任务峰值与资源占用评估。
常见故障与排查:
- 任务不触发:检查调度中心时间与时区、任务状态是否“启用”、调度中心与执行器网络连通。
# 检查调度中心端口
ss -lntp | grep 8080
# 检查执行器端口
ss -lntp | grep 9999
- 执行器离线:检查执行器注册信息、IP/端口是否正确、访问令牌是否一致。
# 查看执行器日志
tail -n 200 /opt/xxl-job/logs/xxl-job-executor.log
- 任务重复执行:查看是否配置了重试/超时、是否存在多个执行器注册相同 appname。
- 任务执行慢:检查脚本本身、资源配额、并发数限制、数据库锁等待。
练习:
1. 使用 xxl-job 创建一个“分钟级”任务,执行 /opt/tasks/backup_db.sh,并验证日志输出。
2. 在 Airflow 中新增一个并行 DAG(两个分支后汇聚),并观察执行拓扑与日志。
3. 模拟执行器端口被防火墙阻断,记录排查步骤与修复命令。