cronsunを試してみる

この記事は GMOペパボ Advent Calentar 2018の12月7日(金)担当分です。風邪やらなんやらでとんでもない遅刻をしています。

最近色々あるので大量のジョブを捌けそうなTime-based Job Schedulerを探しています。いわゆるcronです。fault tolerant distributed cron という夢のようなキーワードで検索してみるといい感じのが見つかりました。

dkronはいくつか紹介記事がありましたが、cronsunの方は見つからなかったのでとりあえず動かしてみようと思います。

build

cronsunはgolang製なのでbuildしてバイナリを作ります。今回はdockerのgolangイメージを使ってbuildしました。

$ git clone https://github.com/shunfei/cronsun
$ cd cronsun
$ docker run -it -v "$(pwd):/cronsun" golang bash

root@6649eb0f477b:/go# cd /cronsun
root@6649eb0f477b:/cronsun# export GO111MODULE=on
root@6649eb0f477b:/cronsun# go mod vendor
root@6649eb0f477b:/cronsun# bash ./build.sh

buildに成功すると dist ディレクトリ以下にバイナリと設定ファイルが作成されています。

root@6649eb0f477b:/cronsun# tree ./dist
dist
|-- conf
|   |-- base.json
|   |-- db.json
|   |-- etcd.json
|   |-- mail.json
|   |-- security.json
|   `-- web.json
|-- cronnode
|-- cronweb
`-- csctl

起動してみる

cronsun はArchitectureに記載されている通り、ジョブ情報をetcdに持ち、ジョブの実行結果をMongoDBに保存するようになっています。

起動するためにはこの2つが必要になるので、今回は docker-compose.yml を次のように作成して試してみます。データの永続化は特に気にしていません。

version: '3'
services:
  etcd:
    image: quay.io/coreos/etcd
    command: etcd -name=cronsun1 -advertise-client-urls http://etcd:2379  -listen-client-urls http://0.0.0.0:2379

  mongo:
    image: mongo

  cronsun-node:
    image: ubuntu
    volumes:
      - ./dist:/dist
    depends_on:
      - etcd
      - mongo
    command: /dist/cronnode -conf /dist/conf/base.json

  cronsun-web:
    image: ubuntu
    ports:
      - 7079:7079
    volumes:
      - ./dist:/dist
    depends_on:
      - etcd
      - mongo
    command: /dist/cronweb -conf /dist/conf/base.json

併せて設定ファイルも修正しておきます。dist/conf 以下の db.jsonetcd.json がデフォルトではlocalhostを見るようになっているので、docker-composeに記載したサービス名にそれぞれ変更しておきます。

db.json

{
  "Hosts": [
    "mongo:27017"
  ],
  ...
}

etcd.json

{
    "Endpoints":[
        "http://etcd:2379"
    ],
    ...
}

設定ファイルの修正が終わったら、docker-compose up で各コンテナを起動します。起動後に http://localhost:7079 にアクセスすると無事ダッシュボードが表示されました。初期状態だと中国語ですが右上の歯車アイコンから英語に切り替えられます。

f:id:tokibix:20181224183405p:plain

echo Hello を実行するだけのJobを作成してみました。秒単位まで指定できるcron形式の他に、様々な設定方法がありGitHubwikiにまとめられています。

f:id:tokibix:20181224183525p:plain

ログページを見てみるとnode上で動いていることがわかります。

f:id:tokibix:20181224183558p:plain

APIも用意されているようで、 curl http://localhost:7079/v1/version などを叩いてみるとcronsunのバージョンが表示されるのですが、この辺はwikiにまとまっていなかったので作成中かもしれません。

とりあえず動かすところまではできたので、気が向いたらnodeを大量に作って負荷テスト的なこともしてみようと思います。