dkron - cronやめたい

こんにちは!grasys長谷川です!

cron・・・めっちゃ困るcron・・・
古いぜcron・・・もういやだcron・・・
cluster schedulerに移行したい・・・
cron clusterとかlsyncd使うしイヤだ!!

そこでじゃじゃ〜〜ん!

Dkron - Distributed, fault tolerant job scheduling system

grasysで社内的な要件だけど実際に業務上で導入してみました!!

こういうの楽しい!
やばい楽しい!!!

ある程度の期間の安定運用が可能になってきたら実際にお客様にもオススメしようかと考えてます。

もうconfig.jsonの自動生成やらjobとかの自動登録とかの仕組みも作ってある!
こういうの土日とか空いてる時間使ってコソコソやってます。w


なぜやってみようと思ったか

  1. consulをbackendにできる
  2. API化されてる
  3. success: true/falseで確認できる
  4. jobのrole指定の中で[role name]:[num]で同じroleにいるインスタンス内での実行数を制御できる 同じ構成のclusterの中で特定jobを1台だけで実行するとかね

consulだけじゃなくてetcd, ZooKeeperでもできるみたい

ここでは構成の仕方というより紹介って感じの内容にします。

dkron dashboardの画面

dashboardはこんな感じ

dkron dashboard

failedでてるのはたぶんjob消したり登録し直したりしてて出てますw


dkron jobs

job一覧はこんな感じ

dkron jobs

dkron show job

jobの内容はこんな感じ

登録した時のJSONの出力にstatus的なものが加わったのが返ってくる

dkron show job

success_count, error_count, last_success, last_errorがなんか変だけどw 今のはv0.9.0で
ひとつ前のversionだと正常だった・・・w


dkron executions

実行結果一覧はこんな感じ

dkron executions

consul kv dkron

consul kvに保存されてるdkronのデータはこんな感じ

dkron consul kv

job

jsonで/jobsにPOSTしてあげると登録できます。
DELETEで投げると削除になる

{
  "command": "xxxxx xxxxx xxxxxx",
  "disabled": 0,
  "name": "xxxxxxxxxx",
  "owner": "xxxxx",
  "owner_email": "xxxxx@grasys.io",
  "run_as_user": "xxxxx",
  "shell": 1,
  "schedule": "1 */10 * * * *",
  "tags": {
    "role": "bt:1"
  },
}

クラスタ内で実行する数を制御

[role name]:[num]でクラスタ内で実行してくれます。

    "tags": {
      "role": "bt:1"
    },

こういうとこが便利!

あとは普通に実行結果とかも取れるんで便利だと思う

schedule

Guides - Dkron

CRON Expression Format

CRON Expression Format Guides - Dkron

Field name Mandatory? Allowed values Allowed special characters
Seconds Yes 0-59 * / , -
Minutes Yes 0-59 * / , -
Hours Yes 0-23 * / , -
Day of month Yes 1-31 * / , - ?
Month Yes 1-12 or JAN-DEC * / , -
Day of week Yes 0-6 or SUN-SAT * / , - ?

上記Documentの引用

cronみたいに

"schedule": "1 */10 * * * *"

Predefined schedules

Entry Description Equivalent To
@yearly (or @annually) Run once a year, midnight, Jan. 1st 0 0 0 1 1 *
@monthly Run once a month, midnight, first of month 0 0 0 1 * *
@weekly Run once a week, midnight on Sunday 0 0 0 * * 0
@daily (or @midnight) Run once a day, midnight 0 0 0 * * *
@hourly Run once an hour, beginning of hour 0 0 * * * *
@minutely Run once a minute, beginning of minute 0 * * * * *

毎時動かしたい時

"schedule": "@hourly"

Intervals

"schedule": "@every <duration>"

便利!!!

API

API - Dkron

詳細は上記URLにあります。

叩くとJSONで返ってきます。
一通り運用するに必要そうなものが準備されてる感じかな?

curl -s localhost:8947/v1/jobs | jq .
[
  {
    "name": "xxxxx-xxxxxxxxxx",
    "schedule": "1 */10 * * * *",
    "shell": true,
    "command": "xxxx xxxx xxxxxxxxx",
    "owner": "xxxxx",
    "owner_email": "xxxxxx@grasys.io",
    "success_count": 0,
    "error_count": 0,
    "last_success": "0001-01-01T00:00:00Z",
    "last_error": "0001-01-01T00:00:00Z",
    "disabled": false,
    "tags": {
      "role": "bt:1"
    },
    "retries": 0,
    "dependent_jobs": null,
    "parent_job": ""
  }
]

shellはbashとかの環境変数が必要なときにtrueしてもらえればと

実際curlする際にはdkronのconfig.jsonのportでやる必要があります。

実際使うには・・・

もう少し待った方がいいかな
でも動きは良いと思うから利用価値はありそう。

画面付いてた方が良いならぶっちゃけRundeckとかの方がいいかも

ある程度決め打ちで自動構成含めた視野があるならこっちの方がシステマチックな感じになる気がする。

Blogだから一応いろいろ情報のせてみたけど
ぶっちゃけ触ってみるといろいろわかると思います。。。。

grasysはconsulが中心になったアーキテクチャなので
簡単なんだけど・・・
スケジューラでconsulやらetcdやらZooKeeperとかを別途Setupするのはちょっと重いよなぁ・・・