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.json
と etcd.json
がデフォルトではlocalhostを見るようになっているので、docker-composeに記載したサービス名にそれぞれ変更しておきます。
db.json
{ "Hosts": [ "mongo:27017" ], ... }
etcd.json
{ "Endpoints":[ "http://etcd:2379" ], ... }
設定ファイルの修正が終わったら、docker-compose up
で各コンテナを起動します。起動後に http://localhost:7079
にアクセスすると無事ダッシュボードが表示されました。初期状態だと中国語ですが右上の歯車アイコンから英語に切り替えられます。
echo Hello
を実行するだけのJobを作成してみました。秒単位まで指定できるcron形式の他に、様々な設定方法がありGitHubのwikiにまとめられています。
ログページを見てみるとnode上で動いていることがわかります。
APIも用意されているようで、 curl http://localhost:7079/v1/version
などを叩いてみるとcronsunのバージョンが表示されるのですが、この辺はwikiにまとまっていなかったので作成中かもしれません。
とりあえず動かすところまではできたので、気が向いたらnodeを大量に作って負荷テスト的なこともしてみようと思います。