标准的crontab服务在单机上运行良好,但在高可用环境中存在以下问题: - 单点故障:如果运行crontab的服务器宕机,定时任务将无法执行 - 任务重复执行:在多台服务器上配置相同任务可能导致重复执行 - 缺乏任务状态监控
推荐工具: - Airflow:强大的工作流调度和监控系统 - Celery + RabbitMQ/Redis:分布式任务队列 - Kubernetes CronJob:如果使用K8s环境
Airflow配置示例:
# 安装
pip install apache-airflow
# 初始化数据库
airflow db init
# 创建管理员用户
airflow users create --username admin --firstname Admin --lastname User --role Admin --email admin@example.com
# 启动调度器
airflow scheduler
# 启动Web服务器
airflow webserver -p 8080
使用数据库实现简单的分布式锁机制:
#!/bin/bash
# 使用MySQL实现分布式锁
LOCK_QUERY="INSERT INTO job_locks (job_name, locked_at, locked_by) VALUES ('my_job', NOW(), '$(hostname)') ON DUPLICATE KEY UPDATE locked_at=NOW(), locked_by='$(hostname)'"
# 尝试获取锁
mysql -u user -p'password' -h db_host -e "$LOCK_QUERY" job_db
if [ $? -eq 0 ]; then
# 获取锁成功,执行任务
/path/to/your/script.sh
# 释放锁
mysql -u user -p'password' -h db_host -e "DELETE FROM job_locks WHERE job_name='my_job' AND locked_by='$(hostname)'" job_db
fi
使用etcd实现:
# 安装etcdctl
ETCDCTL_API=3 etcdctl --endpoints=http://etcd1:2379,http://etcd2:2379 lock my-job-lock -- /path/to/your/script.sh
推荐工具: - Rundeck:企业级作业调度和运行手册自动化 - Nomad:HashiCorp的分布式调度器
Nomad配置示例:
job "batch-job" {
type = "batch"
periodic {
cron = "*/5 * * * *"
prohibit_overlap = true
}
group "batch" {
task "task" {
driver = "raw_exec"
config {
command = "/path/to/your/script.sh"
}
}
}
}
无论选择哪种方案,都应配置监控: - 任务执行成功/失败通知 - 执行时长监控 - 历史执行记录
Prometheus监控示例:
- job_name: 'batch_jobs'
static_configs:
- targets: ['job_scheduler:9091']
metrics_path: '/metrics'
选择哪种方案取决于您的具体需求、基础设施和团队技能。对于简单的场景,基于数据库的锁可能足够;对于复杂的企业环境,Airflow或Nomad等专业工具更为合适。