任务调度
服务有两种类型,Long Running(应用)及Batch(任务)。Docker Swarm支持Long Running服务的运行,但不支持Batch服务的运行,所以我们需要一套任务调度的方案来解决这个问题。
Batch服务同样基于Docker容器运行,遵循一个服务一个容器的原则,与Long Running服务隔离,并且每个Batch服务都会分配到一个独立的容器去运行,方便任务的隔离和管理。
传统的任务调度服务,如crontab等,有以下几个缺点,难以满足我们的需求:
- 任务分散,无法统一管理
- 单机部署,可用性差
- 无调度功能,机器之间的负载可能不均衡
- 交互性差,任务部署效率低
- 没有重试机制,任务可能运行失败
- 无法运行大规模分布式任务
我们认为一个运行在docker容器之上的分布式任务调度服务需要具有以下功能:
- 统一的任务管理
- 任务运行状态
- 任务运行记录
- 生命周期管理(任务的停止及回收)
- 任务编排
- 任务部署:支持一次性任务、定时任务、大规模分布式任务的运行
- 资源限制:CPU、内存等资源限制
- 任务依赖:多个任务之间可以有依赖关系,被依赖的任务会先执行
- 任务调度
- 一致性:分布式调度策略保证任务的一致性,一次任务调度只会触发一次执行
- 负载均衡:任务将优先调度到负载较低的机器上
- 失败重试:任务失败后可被调度其他机器上重试,可设置最大重试次数
- 日志&监控
- 任务日志收集到日志服务中
- 任务容器的CPU、内存等数据收集到监控服务中