grasys blog
grasysブログ

dkron – cronやめたい

yusukeh

こんにちは!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はこんな感じ

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


dkron jobs

job一覧はこんな感じ


dkron show job

jobの内容はこんな感じ

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

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


dkron executions

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


consul kv dkron

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


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 nameMandatory?Allowed valuesAllowed special characters
SecondsYes0-59* / , –
MinutesYes0-59* / , –
HoursYes0-23* / , –
Day of monthYes1-31* / , – ?
MonthYes1-12 or JAN-DEC* / , –
Day of weekYes0-6 or SUN-SAT* / , – ?

上記Documentの引用

cronみたいに

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

Predefined schedules

EntryDescriptionEquivalent To
@yearly (or @annually)Run once a year, midnight, Jan. 1st0 0 0 1 1 *
@monthlyRun once a month, midnight, first of month0 0 0 1 * *
@weeklyRun once a week, midnight on Sunday0 0 0 * * 0
@daily (or @midnight)Run once a day, midnight0 0 0 * * *
@hourlyRun once an hour, beginning of hour0 0 * * * *
@minutelyRun once a minute, beginning of minute0 * * * * *

毎時動かしたい時

"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するのはちょっと重いよなぁ・・・


株式会社grasys(グラシス)は、技術が好きで一緒に夢中になれる仲間を募集しています。

grasysは、大規模・高負荷・高集積・高密度なシステムを多く扱っているITインフラの会社です。Google Cloud、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。

お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。

株式会社grasys | 採用情報