crondで動くジョブスケジューラーがSPOFになっているサービスは多いと思う。
自社サービスも例に漏れずに、そうなっているので良さげなジョブスケジューラーが無いのか探していたところ、dkron(https://dkron.io/)というOSSがシンプルで良さげだったので、触ってみた。
まだ発展途上なのか、GUIの表示で部分部分がおかしい箇所もあるが、crondよりは十分と思える動きです。
バックグラウンドサービス
昨日作ったetcdを使います。
etcdのクラスタ設定でハマった事まとめ
インストール
cat << _EOF > /etc/yum.repos.d/dkron.repo
[dkron]
name=Dkron Pro Private Repo
baseurl=https://yum.fury.io/victorcoder/
enabled=1
gpgcheck=0
_EOF
yum -y install dkron
設定
サーバー3台でクラスタを作成する為、それぞれ設定します。
vim /etc/dkron/dkron.yml
# Dkron example configuration file
backend: etcd
advertise-addr: 192.168.33.10 # bindするアドレス
backend-machine: 127.0.0.1:2379
# 3台ともserver: trueとすると、1台だけはStatusがleavingの状態のままだった為、
# node01 , node02 はserver:true、 node03はfalseとします。
server: true
log-level: info
tags:
role: batch
# datacenter: east
# keyspace: dkron
# encrypt: a-valid-key-generated-with-dkron-keygen
join:
- 192.168.33.10
- 192.168.33.20
- 192.168.33.30
# 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]
設定後にdkronを起動します。
systemctl enable dkron
systemctl start dkron
VirtualBoxのポートフォワードの設定後、http://localhost:8080にアクセスすると、dkronのダッシュボードが表示されます。
ジョブは以下のようにjsonで登録します。
{
"name": "echo-hostname",
# timezone指定
"timezone": "Asia/Tokyo",
# crondと近い書き方。違うのは、[ 秒 分 時 日 月 曜日] と、秒が加わります
"schedule": "0 * * * * *",
"owner": "root",
"owner_email": "",
# 多分、単発実行のjobの場合にtrueにするのかな
"disabled": false,
# batch:xは、batchロールの中で何台のノードでジョブを実行するか
# batch:2であれば、3台中2台のノードで実行する。
"tags": {
"role": "batch:2"
},
"retries": 0,
"parent_job": "",
"processors": null,
# 単一ノードで、ジョブの重複実行を許可するなら[allow]、許可しないなら[forbid]
"concurrency": "forbid",
"executor": "shell",
"executor_config": {
"command": "echo `date +\"%Y/%m/%d %H:%M:%S\"` `hostname` >> /tmp/host.log",
"shell": "true"
},
"status": "success"
}
確認したこと
フェイルーバーは、特に何も設定しなくても生きているノードで実行されますが、server: true としているノードが存在していないと全体が停止しますので、本番環境であればserver: trueを2台は必須と思われます。