分布式调度任务管理—Dkron

文章目录

  • 分布式调度任务管理—Dkron
    • 背景需求
    • 简单说说dkron
    • 使用Dkron
      • 安装
      • 端口
      • 客户端命令
      • API接口
      • 集群
        • 添加和修改job
    • 备份和恢复
    • 日志收集与报警

背景需求

  1. 多个系统上有属于自己业务上的计划任务,并且有部分计划任务不能多台服务器同时执行,具有唯一性,cron服务高可用难以实现。
  2. 方便管理cron
  3. 计划任务执行失败需要告警通知。

简单说说dkron

GO + Serf + gossip protocol +raft 的技术架构,通过阅读作者原文,总结几个关键字:分布式、轻量级、可靠、易拓展。

优点

  • 定时:支持精确到秒,支持cron语法、@every、@at。

  • 任务特点:指定失败重试执行次数,任务可并发执行,父任务及子任务的链式执行机制。

  • 集群:去中心化、高可扩展性和leader自动选举,完善的api接口和UI

  • 警报通知:邮件通知和可接入prometheus

  • 节点:每个节点都包含所有的服务。

缺点:

  • 前端页面不够友好(可能是个人的使用习惯)
  • 高级的邮件支持只在pro版本可用,oss版本不能设置失败邮件推送和邮件payload

注意(与我的理解的有不一致需要注意):

  • 任务执行错误,只做重试,不转移其他节点。

  • 节点故障, 当前跑的任务进程关闭,只能等待下次计划时间开启

关于运行机制和任务修改过程可以看如下两篇文章:

  • 分布式定时任务系统分析

  • 添加任务/修改任务/删除任务的过程

    可以开启debug模拟进行日志校验。

    Jul 15 14:59:54 tserver121 dkron: time="2021-07-15T14:59:54+08:00" level=info msg="2021/07/15 14:59:54 [DEBUG] memberlist: Initiating push/pull sync with: 10.3.247.118 10.3.247.118:8946"
    Jul 15 14:59:59 tserver121 dkron: time="2021-07-15T14:59:59+08:00" level=debug msg="fsm: received command" command=0 node=10.3.247.121
    Jul 15 14:59:59 tserver121 dkron: time="2021-07-15T14:59:59+08:00" level=debug msg="store: Retrieved job from datastore" job=job1 node=10.3.247.121
    Jul 15 14:59:59 tserver121 dkron: time="2021-07-15T14:59:59+08:00" level=debug msg="store: Setting job" job=job1 node=10.3.247.121
    Jul 15 14:59:59 tserver121 dkron: time="2021-07-15T14:59:59+08:00" level=debug msg="fsm: received command" command=2 node=10.3.247.121
    Jul 15 14:59:59 tserver121 dkron: time="2021-07-15T14:59:59+08:00" level=debug msg="store: Setting key" execution="executions:job1:1626332399964085243-tserver120" finished="0001-01-01 00:00:00 +0000 UTC" job=job1 node=10.3.247.121
    Jul 15 14:59:59 tserver121 dkron: time="2021-07-15T14:59:59+08:00" level=debug msg="store: to detele key" execution=1626330569972455451-tserver120 job=job1 node=10.3.247.121
    Jul 15 15:00:00 tserver121 dkron: time="2021-07-15T15:00:00+08:00" level=debug msg="fsm: received command" command=4 node=10.3.247.121
    Jul 15 15:00:00 tserver121 dkron: time="2021-07-15T15:00:00+08:00" level=debug msg="fsm: Setting execution" execution=1626332399964085243-tserver120 node=10.3.247.121 output=
    Jul 15 15:00:00 tserver121 dkron: time="2021-07-15T15:00:00+08:00" level=debug msg="store: Retrieved job from datastore" job=job1 node=10.3.247.121
    Jul 15 15:00:00 tserver121 dkron: time="2021-07-15T15:00:00+08:00" level=debug msg="store: Setting job" job=job1 node=10.3.247.121
    Jul 15 15:00:24 tserver121 dkron: time="2021-07-15T15:00:24+08:00" level=info msg="2021/07/15 15:00:24 [DEBUG] memberlist: Initiating push/pull sync with: tserver120 10.3.247.120:8946"
    

使用Dkron

可以先去官方网站阅读一下指导文档

安装

方便安装是dkron的特点 downloads page可以下载rpm直接安装:

yum localinstall dkron_3.1.8_linux_x86_64.rpm
systemctl enable dkron
systemctl restart  dkron

这样已经安装完成,如果不想服务向外网通信可以拦截stats.dkron.io,因为启动dkron会向它注册验证。

端口

8946 #用于代理之间数据同步
8080 #用于API和仪表板的HTTP  -->我部署已改为8100
6868 #用于代理之间的执行通信。

用户访问是8080,其他的端口都是服务器间通信,设置防火墙需要注意。

客户端命令

dkron agent - 启动
dkron doc - 文档
dkron keygen - 生成密钥
dkron leave - 离开集群
dkron raft - 客户端控制命令
dkron version - 显示版本dkron agent --server --bootstrap-expect=1  #单个服务器配置需要 -bootstrap-expect=1 标志
dkron raft list-peers 查看当前状态
dkron raft remove-peer --peer-id 10.3.247.120  删除节点需要在leader执行, 删除后如果节点正常 则又自动加入
dkron leave 当前节点离开集群 需要重启后加入

API接口

官方文档API ,包含了:

  • 节点管理
  • jobs管理
  • 执行日志(只能查到最近100条信息)

由于页面添加方式不太习惯,所以我常使用post localhost:8080/v1/jobs,添加和修改jobs

curl localhost:8080/v1/jobs -XPOST -d '{"name": "job1","schedule": "@every 10s","timezone": "Europe/Berlin","owner": "Platform Team","owner_email": "platform@example.com","disabled": false,"tags": {"server": "true:1"},"metadata": {"user": "12345"},"concurrency": "allow","executor": "shell","executor_config": {"command": "date"}
}'

集群

接下来就是配置集群,我使用的是3+N server + N node模式,

node不提供web UI,不做leader,只做任务执行器,部署在各个业务服务器上,当然如果是单纯的跑任务,没有任务环境依赖,我建议全部配置server,

请参照配置

server 配置文件

# Dkron example configuration file# This node is running in server mode
server: true                    #false 不能成为leader
bootstrap-expect: 3            #集群初始化数量
http-addr: 0.0.0.0:8100         # false 不能成为leaderhttp访问端口默认8080node-name: 10.13.3.26         #唯一, 默认主机名
#advertise-addr: 0.0.0.0        #代理之间通信
#bind-addr: 0.0.0.0             #API和仪表板的HTTP通信data-dir: '/export/dkron'       #数据目录
datacenter: ywkf                #本地代理的数据中心标识(默认为“ dc1”)
region: sre_ywkf4                #区域log-level: info                 #日志级别,默认info
tags:project: manager               serverip: 10001             approle: leaderencrypt: XXXXXXXXXXXXXXXXXXXXXX==    #用于加密网络流量的密钥,需要一致 dkron keygen - 生成密钥
raft-multiplier: 5
join:                           #加入的初始代理- 10.13.3.26- 10.13.3.25- 10.13.3.248
retry-join:                     #集群创建后加入
retry-max: 6                    #最大连接尝试次数。默认为0,它将无限期重试
serf-reconnect-timeout: 60s     #失败节点尝试重新连接 默认24h#mail-from: platform@example.com   #oss版本不能设置失败邮件推送和邮件payload ,所以不配置
#mail-host: 10.13.3.25
#mail-password:
#mail-payload:
#mail-port: 25
#mail-subject-prefix: "[Dkron]"
#mail-username:

node 配置文件

# Dkron example configuration file# This node is running in server mode
#server: true                    #false 不能成为leader
#bootstrap-expect: 3             #集群初始化数量 false 不能成为leader
#http-addr: 0.0.0.0:8100         # false 不能成为leaderhttp访问端口 m默认8080node-name: 10.13.3.230         #唯一, 默认主机名
#默认路由不在同一网段添加如下: (不带端口!!!!!!!!!!)
#advertise-addr: 10.13.3.236   #代理之间通信
#bind-addr: 10.13.3.236      #API和仪表板的HTTP通信data-dir: '/export/dkron'       #数据目录
datacenter: ywkf                #本地代理的数据中心标识(默认为“ dc1”)
region: sre_ywkf4                #区域log-level: warn                 #日志级别,默认info
tags:project: appserverid: 10133230approle: nodeencrypt: XXXXXXXXXXXXXXXXXXXXXX==     #用于加密网络流量的密钥,需要一致
raft-multiplier: 5             #lead选取时间
join:                           #加入的初始代理- 10.13.3.26- 10.13.3.25- 10.13.3.248
retry-join:                     #集群创建后加入
retry-max: 6                    #最大连接尝试次数。默认为0,它将无限期重试
serf-reconnect-timeout: 60s     #失败节点尝试重新连接 默认24h

问题1:为什么会区分node 和server?

​ 因为node不会启动web端口,减少了端口占用,node是部署在业务服务器上,变动性比较大,leader不稳定,不方便前端nginx做反向代理。

问题2:tags如何添加?

​ 我建议最少需要有 唯一标签serverid、项目标签project, 唯一标签作用是指定服务器执行,项目标签是多台角色相同的服务器上执行,

添加和修改job

oss 版本提供了4种执行器 Executors 和3种日志处理 Execution,可以处理多种需求

dkron系统提供了两种方式添加jobs:

命令行post方式(shell/postman)推荐使用postman

curl localhost:8080/v1/jobs -XPOST -d '{"name": "job1","schedule": "@every 10s","timezone": "Europe/Berlin","owner": "Platform Team","owner_email": "platform@example.com","disabled": false,"tags": {"server": "true:1"},"metadata": {"user": "12345"},"concurrency": "allow","executor": "shell","executor_config": {"command": "date"}
}'

web UI方式 localhost:8080 --> jobs --> create -->save

配置简单介绍

Name freestyle-test         #job名
Displayname freestyle-test  #页面显示名称
Timezone Asia/Shanghai      #时区
Schedule  30 */5 * * * ?    #秒 分 时 天 月 周, 还有两种种格式 @every 10s 每隔10秒 和 “@at 2018-01-02T15:04:00Z” 将在指定的日期和时间(假设UTC时区)运行作业。
Owner admin                  #所属人
Owner email  platform@example.com    #所属人邮箱,邮件通知
Parent job  parent_job               #父任务,子任务在父任务之后执行
Last success    2021/4/7下午2:27:02   #最后成功时间
Last error  2021/4/7下午2:10:35       #最后失败时间
Status  success                       #当前状态
Next  2021/4/7下午2:50:30             #下一次执行时间
Concurrency forbid                    #allow(默认):允许并发作业执行。#forbid:如果作业已经在运行,则不发送执行,它将跳过执行,直到下一个计划。
Processors
{"files":{                             #日志输出  有指定files,有输出到log日志, 输出到syslog
"forward":"true"                      #true将日志输出转发到下一个处理器
"log_dir":"/data/logs/dkron"          #指定文件
}
}
Tags                                  #标签,用于指定对应标签节点执行,在节点的配置文件可以创建标签
{"object":"monitor:1"                  #"object":"monitor" 带monitor的都执行,这是多节点并发执行
}                                     #"object":"monitor:1" 带monitor的其中一台执行,采用随机的方式。#可以使用多个标签组合使用Executor shell                        #支持shell、http、kafka、natsExecutor config
{                                     #以shell 为例
"command":"bash /data/dkron/dkron.sh" #执行命令
"timeout":"200s"                      #超时时间
"env": "ENV_VAR=va1",                 #环境变量
"cwd": "/app",                        #执行路径
}Disabled                              #是否启动   (toggle 启动/停止 切换)
Retries  3                            #失败重试次数

简单的配置文件模版

{"name": "job1",                   "displayname": "job1",             "timezone": "Asia/Shanghai","schedule": "20 59 23 * * ?",                     "owner": "master",                               "owner_email": "platform@example.com",           "parent_job": "","ephemeral": false,"expires_at": null,"concurrency": "forbid","processors": {"log": {"forward": "true"}},"tags": {"project": "manager"                           },"metadata": null,"executor": "shell","executor_config": {"command": "bash /data/dkron/dkron.sh",          "cwd": "/","env": "","timeout": "60s"},"retries": 2,"disabled": false
}

问题3: 计划任务执行失败

level=error msg="grpc: Error calling gRPC method" error="rpc error: code = Unknown desc = agent: Run error retrieving job: job5 from scheduler" method=RunJob node=10.13.3.26 server_addr="10.13.3.25:6868"

​ 将disabled 改为 false 会自动执行

备份和恢复

官方给出的备份还原的方法。

curl localhost:8100/v1/jobs > backup.json
curl localhost:8100/v1/restore --form 'file=@backup.json'

在日常维护中,也可以使用/jobs/{job_name}将每个job 的配置使用json文件格式存储下来,jobs 的修改和单个jobs的恢复都可能需要它。

集群节点恢复

日志收集与报警

问题4:为什么要做日志收集?

  • 虽然dkron 的web上有保存任务执行输出记录,每个jobs最多保存100条记录,频率较高的任务容易被覆盖。
  • oss版本不能设置失败邮件推送和邮件payload ,所以不适合邮件告警方式
  • dkron监听脚本执行的stdout 和stderr,所以命令中的重定向是没有效果的。

job 需要使用log配置

"processors": {"log": {"forward": "true"    }
}
// /etc/rsyslog.conf 配置转发指定文件目录下
//  $template fileformat,"/export/logs/dkron/%programname%_%$year%-%$month%-%$day%.log"
// if $programname == "dkron" then ?fileformat

或者

{"files":{                             "forward":"true"                      "log_dir":"/data/logs/dkron"         }
}

将任务日志输出到指定位置,通过ElasticStack收集,再对日志级别,使用elastalert可以做出对应的规则报警。

logstatsh grok 规则 识别日志的level
match => [ "message" , "%{SYSLOGTIMESTAMP:timestamp} %{DATA:logsource} %{SYSLOGPROG}: %{GREEDYDATA} (?:level=%{LOGLEVEL:level}) ?(?:msg=%{GREEDYDATA:msg})"]
match => [ "message" , "%{SYSLOGTIMESTAMP:timestamp} %{DATA:logsource} %{SYSLOGPROG}: (?:%{GREEDYDATA:msg})"]

参考:

dkron

Serf

gossip protocol

Reliable Cron across the Planet

另一个实现方案xxl-job

分布式调度任务管理—Dkron相关推荐

  1. 王者归来:分布式调度解决方案 ElasticJob 重启!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 你会误认为 ElasticJob 只是作业管控平台么?创 ...

  2. Spring 整合 Quartz 分布式调度

    转载自 Spring 整合 Quartz 分布式调度 本文旨在对 Spring+Quartz 分布式调度有一个直观的了解,通过实际的使用来解决问题. 前言 为了保证应用的高可用和高并发性,一般都会部署 ...

  3. 【JEECG TBSchedule】详解应对平台高并发的分布式调度框架TBSchedule

    原文地址:http://geek.csdn.net/news/detail/65738 [编者按] TBSchedule是一款非常优秀的高性能分布式调度框架,本文是作者结合多年使用TBSchedule ...

  4. 【ES】分布式调度系统之 Elastic-Job-Lite

    1.概述 转载:分布式调度系统之 Elastic-Job-Lite 本文章会记录在当当网的开源框架 ElasticJob的学习案例 2.任务调度框架 Quartz 在ElasticJob中,底层分封装 ...

  5. java中的saturn_Saturn分布式调度平台系列:高屋建瓴之设计原理简析

    由于业务系统中使用了Saturn作为分布式调度平台并且计划对其作二次开发,因此看了官方文档及源码,简单做了梳理与总结.Saturn是唯品会开源的一款定时任务调度平台,相对于传统的Spring Batc ...

  6. 单集群10万节点 走进腾讯云分布式调度系统VStation

    云计算并非无中生有的概念,它将普通的单台PC计算能力通过分布式调度软件连接起来.其最核心的问题是如何把一百台.一千台.一万台机器高效地组织起来,灵活进行任务调度和管理,从而像使用单台机器一样方便地使用 ...

  7. 面向大数据的分布式调度

    一.调度 从上个世纪50年代起,调度问题的研究就受到数学.运筹学.工程技术学等领域科学的重视[1],人们主要从数学的角度来研究调度问题,调度问题也同样被定义为"分配一组资源来执行一组任务&q ...

  8. Sparrow: 适用于细粒度tasks低延迟调度的去中心化无状态分布式调度器

    背景介绍 Sparrow的论文收录在SOSP 2013,在网上还可以找到一份作者的talk ppt,值得一提的是作者是位PPMM.她之前发表过一篇The Case for Tiny Tasks in ...

  9. 媲美celery的分布式调度框架funboost

    最近项目中缺乏一款分布式框架,在github上闲逛时,找到了一款分布式调度框架.按照国惯例先上链接:https://github.com/ydf0509/funboost.该框架是由国人ydf开发的, ...

最新文章

  1. Linux多线程编程四(条件变量)
  2. JVM堆新生代分配比例
  3. python基础教程:统计计数的4种常用的方法
  4. DSP与FPGA和嵌入式是什么关系?
  5. 如何在ubuntu上用c++串口通信_让你搞懂PLC串口通讯和通讯接口,这东西估计没几个能说清楚~...
  6. 王道计算机考研课件,王道考研计算机组成原理课件ppt
  7. DevExpress.XtraGrid 导出文本的bug
  8. OpenCV中的图像插值示例
  9. 【Longest Palindromic Substring】cpp
  10. Oracle实例解析:编码与字符集
  11. 国外优秀Windows7桌面插件RAINMETER
  12. office未响应(2010、2013……)崩溃
  13. 为资产分类定义折旧范围_SAP折旧范围
  14. poe摄像头与服务器连接系统图,PoE监控系统的4种连接方式!
  15. 眼科相关疾病最新研究进展(2022年3月)
  16. MHZ是计算机的什么单位,电脑mhz是什么意思
  17. c语言中输入数组时用不用加地址符,C语言中,用格式符”%s”输入字符数组时,数组名前不能加。...
  18. Android 状态栏常规操作(状态栏显示,状态栏颜色,沉浸式状态栏)
  19. win10电脑如何取得管理员权限
  20. WiFi网络测速专业版

热门文章

  1. linux在什么环境运行,Linux的应用环境
  2. CSS 3D 书籍封面效果
  3. scpi指令转换c语言,SCPI指令介绍
  4. 使用存储过程,分页用户控件,jQuery进行Ajax分页!
  5. 王小波,他的文章很逗逼,他的程序很牛逼!
  6. Microsoft Malware 名词解释
  7. Chevereto配合PicGo打造个人图床
  8. [Mugeda HTML5技术教程之6]添加元素
  9. 模型评估指标_精准率、召回率、F1-score、ROC曲线、AUC曲线
  10. uniapp App打包