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

三丰 soft张三丰
Dkron是一个分布式,启动迅速,容错的定时任务系统,支持cron表达式。

Dkron特点:

  1. 易用:易操作和漂亮的UI
  2. 可靠:支持容错
  3. 高可扩展性:能够处理大量的计划作业和数千个节点 Dkron是用Go编写的,它利用Raft协议和Serf的强大功能提供容错性、可靠性和可扩展性,同时保持简单易安装。

Dkron-v2整体架构图:

job执行流程图:

cron表达式的强大魅力在于灵活的横向和纵向组合以及简单的语法,用cron表达式几乎可以写出任何你想要触发的时间点

经典案例:

"30 * * * * ?" 每半分钟触发任务

"30 10 * * * ?" 每小时的10分30秒触发任务

"30 10 1 * * ?" 每天1点10分30秒触发任务

"30 10 1 20 * ?" 每月20号1点10分30秒触发任务

"30 10 1 20 10 ? *" 每年10月20号1点10分30秒触发任务

"30 10 1 20 10 ? 2011" 2011年10月20号1点10分30秒触发任务

"30 10 1 ? 10 * 2011" 2011年10月每天1点10分30秒触发任务

"30 10 1 ? 10 SUN 2011" 2011年10月每周日1点10分30秒触发任务

"15,30,45 * * * * ?" 每15秒,30秒,45秒时触发任务

"15-45 * * * * ?" 15到45秒内,每秒都触发任务

"15/5 * * * * ?" 每分钟的每15秒开始触发,每隔5秒触发一次

"15-30/5 * * * * ?" 每分钟的15秒到30秒之间开始触发,每隔5秒触发一次

"0 0/3 * * * ?" 每小时的第0分0秒开始,每三分钟触发一次

"0 15 10 ? * MON-FRI" 星期一到星期五的10点15分0秒触发任务

"0 15 10 L * ?" 每个月最后一天的10点15分0秒触发任务

"0 15 10 LW * ?" 每个月最后一个工作日的10点15分0秒触发任务

"0 15 10 ? * 5L" 每个月最后一个星期四的10点15分0秒触发任务

"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务

cron表达式格式:

{秒数} {分钟} {小时} {日期} {月份} {星期}

{年份(可为空)}

例 "0 0 12 ? * WED" 在每星期三下午12:00 执行(年份通常 省略)

先了解每个位置代表的含义,在了解每个位置允许的范围,以及一些特殊写法,还有常用的案例,足够你掌握cron表达式

一:每个字段的允许值

字段 允许值 允许的特殊字符

秒 0-59 , - * /

分 0-59 , - * /

小时 0-23 , - * /

日期 1-31 , - * ? / L W C

月份 1-12 或者 JAN-DEC , - * /

星期 1-7 或者 SUN-SAT , - * ? / L C #

年(可选) 留空, 1970-2099 , - * /

二:允许值的意思:

Seconds (秒) :可以用数字0-59 表示,

Minutes(分) :可以用数字0-59 表示,

Hours(时) :可以用数字0-23表示,

Day-of-Month(天) :可以用数字1-31 中的任一一个值,但要注意一些特别的月份

Month(月):可以用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示

Day-of-Week(每周):可以用数字1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示

相关配置信息

1.dkron agent 的命令行操作CLI相关配置信息

dkron 的命令行操作都以dkron 开头,后面可以跟着不同的配置信息,例如在命令行敲出以下命令 :dkron agent --server --bootstrap-expect= 1 表示dkron以代理服务器形式启动,并且提供数据中心中预期的服务器数量为1。其他相关配置dkron agent信息如下:

–advertise-addr String 用于向集群中其他节点进行公告的地址。缺省情况下,发布绑定地址。该值支持go-sockaddr / template格式。

–advertise-rpc-port int 默认使用rpc-port的值

–bind-addr String 指定代理应为网络服务绑定的地址,包括内部八卦协议和RPC机制。该名称应以IP格式指定,并且可用于轻松地将所有网络服务绑定到同一地址。该值支持go-sockaddr / template格式。(默认为“ {{GetPrivateIP}}:8946”)

–bootstrap-expect int 提供数据中心中预期的服务器数量。要么不提供此值,要么该值必须与集群中的其他服务器一致。如果提供了Dkron,Dkron将等待直到指定数量的服务器可用为止,然后引导群集。这样可以自动选举最初的领导者。该标志要求服务器模式。

–data-dir String 指定用于服务器特定数据(包括复制的日志)的目录。默认情况下,这是顶级数据目录,例如[/ var / lib / dkron](默认为“ dkron.data”)

–datacenter String 指定本地代理的数据中心。数据中心的所有成员应共享本地LAN连接。(默认为“ dc1”)

–dog-statsd-addr String DataDog代理地址

–dog-statsd-tags String Datadog标签,指定为key:value

–enable-prometheus 启用服务普罗米修斯指标

–encrypt string 用于加密网络流量的密钥。必须是base64编码的16字节密钥 -h,–help代理帮助

–http-addr String 将 UI Web服务器绑定到的地址。仅在服务器时使用。该值支持go-sockaddr / template格式。(默认为“:8080”)

–join String 要加入的初始代理。可以多次指定此标志

–log-level String 日志级别(调试|信息|警告|错误|致命|紧急)(默认为“信息”)

–mail-from String 从电子邮件地址使用

–mail-host String 用于通知的邮件服务器主机地址

–mail-password String 要使用的邮件服务器密码

–mail-payload string 通知邮件有效载荷

–mail-port uint16 邮件服务器端口

–mail-subject-prefix String 通知邮件主题前缀(默认为“ [Dkron]”)

–mail-username String 用于身份验证的邮件服务器用户名

–node-name String 此节点的名称。在集群中必须唯一(默认为“ pris.local”)

–profile String Profile用于控制使用的时序配置文件(默认为“ lan”)

–raft-multiplier int 服务器用来缩放关键Raft时序参数的整数乘数。省略此值或将其设置为0会使用下面介绍的默认计时。较低的值用于拉紧时序并增加灵敏度,而较高的值则用于放松时序并降低灵敏度。进行此调整会影响检测领导者故障和执行领导者选举所花费的时间,但代价是需要更多的网络和CPU资源才能获得更好的性能。默认情况下,Dkron将使用较低性能的计时,适用于最小的Dkron服务器,当前等效于将此值设置为5(此默认值可能会在将来的Dkron版本中更改,具体取决于目标最低服务器配置文件是否更改)。将此值设置为1将建议将Raft配置为其最高性能模式,以用于生产Dkron服务器。允许的最大值为10。(默认值为1)

–region String 指定Dkron代理所属的区域。一个区域通常会映射到一个具有潜在多个区域的地理区域(例如我们),这些区域会映射到诸如us-west和us-east(默认为“ global”)之类的数据中心

–retry-interval string 两次连接尝试之间等待的时间。(默认为“ 30s”)

–retry-join String 在启用重试后开始时要加入的代理的地址。可以多次指定。

–retry-max int 最大连接尝试次数。默认为0,它将无限期重试。

–rpc-port int 用于与客户端通信的RPC端口。仅在服务器时使用。RPC IP地址将与绑定地址相同(默认值为6868)

–serf-reconnect-timeout String 这是在放弃并认为它完全消失之前尝试重新连接到故障节点的时间。在Kubernetes中,您可能需要5秒钟左右的时间,因为没有理由尝试为默认的24h值重新连接。如果未收获节点并返回具有相同ID但不同的ID,则Raft的行为也会很奇怪

–server 该节点以服务器模式运行

–statsd-addr String Statsd地址

–tag String 可以多次指定标签,以将多个键/值标签对附加到给定节点,指定为key = value

–webhook-headers String 调用webhook URL时使用的标题。可以多次指定

–webhook-payload String 在webhook调用中发送的POST请求的正文

–webhook-url String 调用通知的Webhook URL

curl localhost:8080/v1 检查服务器是否正常工作

配置信息参考


#Dkron example configuration file
#server: false
#bootstrap-expect: 3
#data-dir: dkron.data
#log-level: debug
#tags:
#dc: east
#encrypt: a-valid-key-generated-with-dkron-keygen
#retry-join:
#- 10.0.0.1
#- 10.0.0.2
#- 10.0.0.3
#raft-multiplier: 1
#webhook-url: https://hooks.slack.com/services/XXXXXX/XXXXXXX/XXXXXXXXXXXXXXXXXXXX
#webhook-payload: “payload={“text”: “{{.Report}}”, “channel”: “#foo”}”
#webhook-headers: Content-Type:application/x-www-form-urlencoded
#mail-host: email-smtp.eu-west-1.amazonaws.com
#mail-port: 25
#mail-username": mailuser
#mail-password": mailpassword
#mail-from": cron@example.com
#mail-subject_prefix: [Dkron]

节点信息配置参考

为节点分配job时候,可以选择在哪些节点去执行,选择节点的方式如下


{
“tags”: {
“dc”: “dc1”,
“expect”: “3”,
“port”: “6868”,
“region”: “global”,
“role”: “dkron”,
“rpc_addr”: “10.88.94.129:6868”,
“server”: “true”,
“version”: “devel”,
“my_role”: “web”
}
}

可以选择一个属性,也可以选择多个属性,如:


“tags”: {
“my_role”: “web”
}

这个就是在集群中,所有my_role是web的都会执行定时任务


“tags”: {
“my_role”: “web:1”
}

上边这个是在集群中,只运行一个节点的任务


“tags”: {
“my_role”: “web”,
“role”: “dkron”
}

上面是组合选择多个属性,多个属性之间是用and连接,如果不在tags指定的集群成员,则不运行,如果不指定tags,则默认所有的集群成员都执行job任务


{
“executor”: “http”,
“executor_config”: {
“method”: “GET”,
“url”: “http://example.com”,
“headers”: “[]”,
“body”: “”,
“timeout”: “30”,
“expectCode”: “200”,
“expectBody”: “”,
“debug”: “true”
}

执行任务的方式

执行任务又分两种 1.是http请求执行 HTTP执行程序可以将请求发送到HTTP端点,参数如下

Method:大写的请求方法 Url:请求网址 head:Json字符串,例如“ [\“ Content-Type:application / json \”]“ body:POST正文 timeout:请求超时,单位秒 ExpectCode:期望响应代码,例如200,206 ExpectBody:期望响应主体,支持正则表达式,例如/ success / debug:调试选项,当此选项不为空时,将记录所有内容 tlsNoVerifyPeer:假(默认)或真。如果为true,则禁用对远程SSL证书有效性的验证。 tlsCertificateFile:包含客户端证书的PEM文件的路径。可选的。 tlsCertificateKeyFile:包含客户端证书私钥的PEM文件的路径。可选的。 tlsRootCAsFile:PEM文件的路径,该文件包含用作根CA的证书。可选的。


{
“executor”: “http”,
“executor_config”: {
“method”: “GET”,
“url”: “http://example.com”,
“headers”: “[]”,
“body”: “”,
“timeout”: “30”,
“expectCode”: “200”,
“expectBody”: “”,
“debug”: “true”
}
}

较完整的job输入


{
“name”: “job01”,
“displayname”: “test01”,
“timezone”: “”,
“schedule”: “@every 30s”,
“owner”: “Platform Team”,
“owner_email”: “platform@example.com”,
“success_count”: 91,
“error_count”: 0,
“last_success”: “2020-08-21T07:33:23.9005366Z”,
“last_error”: null,
“disabled”: false,
“tags”: {
“server”: “true”
},
“metadata”: null,
“retries”: 3,
“dependent_jobs”: null,
“parent_job”: “”,
“processors”: {},
“concurrency”: “allow”,
“executor”: “http”,
“executor_config”: {
“body”: “”,
“debug”: “true”,
“expectBody”: “”,
“expectCode”: “200”,
“headers”: “[]”,
“method”: “GET”,
“timeout”: “30”,
“url”: “http://example.com.com”
},
“status”: “success”,
“next”: “2020-08-21T07:33:51Z”
}

通过dashboard创建job,首先打开dashboard页面,注意到在上面菜单栏有jobs菜单项,如下图所示:点击jobs

然后进入jobs页面,jobs页面主要有三项数据展示,最上边红框里是总体job的概况,中间有添加job的按钮,下边是具体job执行情况和状态信息。我们添加job,点击中间红色加号就可以 点击加号后,弹出编辑信息,编写job任务信息即可 Shell执行程序运行系统命令 参数如下: shell:使用shell环境运行此命令 Commend:要运行的命令 env:Env vars,以逗号分隔 环境变量 cwd:命令运行前的目录


{
“executor”: “shell”,
“executor_config”: {
“shell”: “true”,
“command”: “my_command”,
“env”: “ENV_VAR=va1,ANOTHER_ENV_VAR=var2”,
“cwd”: “/app”
}
}

dkron keygen dkron密钥的生成

在命令行中执行以下命令:dkron keygen 就可以生成一个密钥,然后复制密钥,在dkron集群的配置文件中,配置相应的密钥,就可以保证代理之间加密连接

如上图所示:在集群的所有的配置文件中加上生成的密钥,即可 如果集群成员的密钥不同,或者有的成员没有加上密钥,则这个成员就加入不了集群