目次
こんにちは!grasys長谷川です!
cron・・・めっちゃ困るcron・・・
古いぜcron・・・もういやだcron・・・
cluster schedulerに移行したい・・・
cron clusterとかlsyncd使うしイヤだ!!
そこでじゃじゃ〜〜ん!
Dkron – Distributed, fault tolerant job scheduling system
grasysで社内的な要件だけど実際に業務上で導入してみました!!
こういうの楽しい!
やばい楽しい!!!
ある程度の期間の安定運用が可能になってきたら実際にお客様にもオススメしようかと考えてます。
もうconfig.jsonの自動生成やらjobとかの自動登録とかの仕組みも作ってある!
こういうの土日とか空いてる時間使ってコソコソやってます。w
なぜやってみようと思ったか
- consulをbackendにできる
- API化されてる
- success: true/falseで確認できる
- 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_count
, error_count
, last_success
, last_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
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
詳細は上記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 (GCP)、Amazon Web Services (AWS)、Microsoft Azureの最先端技術を活用してクラウドインフラやデータ分析基盤など、ITシステムの重要な基盤を設計・構築し、改善を続けながら運用しています。
お客様の課題解決をしながら技術を広げたい方、攻めのインフラ技術を習得したい方、とことん技術を追求したい方にとって素晴らしい環境が、grasysにはあります。
お気軽にご連絡ください。