# crontab **Repository Path**: taotao_today/crontab ## Basic Information - **Project Name**: crontab - **Description**: 使用etcd实现分布式crontab工具,我一般用它自动清理项目日志文件和每日构建 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-12-10 - **Last Updated**: 2024-04-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: 分布式, Go语言 ## README # 分布式Crontab 分布式Crontab是一个基于 Go 语言开发的分布式定时任务执行器,可以在主节点上无需登录,启动、管理和操作从节点集群上的 Crontab 命令。 ## 开发原因 一方面是自己在开发中经常需要在不同的服务器上写 Crontab 脚本,用于定时备份数据库、定时上线发布服务、定时删除过期日志文件,清理磁盘空间。 另一方面自己开发应用有用到 etcd,刚好最近也学习到一些分布式理论知识,想实践验证一下所学。分析确认开发可行性后,决定先写一个最小功能集给自己用。 - 首先转换视角,从产品经理的视角,分析收集功能需求 - 接着进行架构和技术选型 - 最后实现迭代 ## 功能特性 Master节点: - 任务管理HTTP接口:新建、修改、查看、删除任务 - 任务日志HTTP接口:查看任务执行历史日志 - 任务控制HTPP接口:提供强制结束任务的接口 - 实现web管理界面:前后端分离 Worker节点: - 任务同步:监听etcd中/cron/jobs/目录变化 - 任务调度:基于cron表达式计算,触发过期任务 - 任务执行:过期任务会交给协程池,协程池并发执行多任务,基于etcd分布式锁抢占 - 日志保存:捕获任务执行输出,保存到MongoDB 容量预估: - 满足日常开发中最多30台worker机器管理 - TPS在每秒1000次以内 ## 快速开始 环境依赖: - Go 1.18以上 - etcd 3.0以上 - MongoDB 5.0以上 ### 一、安装运行Master master是无状态的,理论上你可以运行多个master,但是没有这个必要 【裸机部署】 ``` # 在master节点上克隆代码 git clone https://gitee.com/taotao_today/crontab.git # 进入到master的main文件目录 cd crontab/crontab/master/cmd/ # 配置etcd连接(对可用性有较高要求可以配置多个etcd,避免单点故障) vi master.json # 编译和运行master go build -o master master.go && ./master ``` 【docker部署】 - todo,直接拉取master容器,但是仍需要手动安装和配置etcd和MongoDB 【docker-compose部署】 - todo,一键运行 ### 二、安装运行worker worker也是无状态,一般都会配置多台worker节点,每个worker节点执行任务前都会去 etcd 中抢锁,抢到锁的节点才能执行任务 【裸机部署】 ``` # 在worker节点上克隆代码 git clone https://gitee.com/taotao_today/crontab.git # 进入到worker的main文件目录 cd crontab/crontab/worker/cmd/ # 配置etcd连接和MongoDB连接 vi worker.json # 编译和运行worker go build -o worker worker.go && ./worker ``` 【docker部署】 - todo,直接拉取master容器,但是仍需要手动安装和配置etcd和MongoDB 【docker-compose部署】 - todo,一键运行 ### 三、访问web页面 在浏览器中输入:http://ip:port/ , IP是master节点的IP,如果master节点是本地部署的话,可以写环回IP;Port默认是 8070,可以在 master.json 中配置。 ![image-20240414180654524](./static/image-20240414180654524.png) ## 系统架构 ![1704768598489](./static/1704768598489-1713085818066-1.png) **架构思路:** - 利用etcd同步全量任务列表到所有worker节点 - 每个worker独立调度全量任务,无需与master产生直接RPC - 各个worker利用分布式锁抢占,解决并发调度相同的任务的问题 ## 注意事项 本项目属于未经过安全测试,API接口使用的是HTTP,并且也没有对接口进行鉴权验证,MongoDB 和 etcd 也没有配置 auth。所以部署使用该项目时最好在内网可信网络环境。 ## 许可证 本库采用 MIT 进行授权。有关详细信息,请参阅 LICENSE 文件。