こんにちは、技術部開発基盤グループの小室 (id:hogelog) です。
みんなのウェディングは OSS となった Kuroko2 を早速導入したので、その Kuroko2 の導入方法をブログにて共有します。
何故 Kuroko2 を導入したか
みんなのウェディングではジョブ管理ツールとして主に Rundeck を利用していました。汎用のジョブ管理ツールとして開発されている Rundeck は非常に多機能で様々な処理を柔軟に実行できます。雑多なバッチ処理が稼働していたみんなのウェディングのシステムを一つのジョブ管理ツールに集約させるには非常に便利なものでした。
しかし運用を続けるうちにいくつかの難点が見つかってきました。
- スケジュール実行がいきなり過去のジョブ定義に巻き戻る(ことが稀にある)
- MySQL DB での運用時にインデックスが不足しており特定の画面が異常に重くなる
- https://github.com/rundeck/rundeck/issues/1564
- 非常に短いスパンで実行するジョブを Rundeck で管理しておりログが膨大になっているという弊社の事情もありますが
- バッチジョブ定義画面が汎用的なので煩雑
そのような課題から Rundeck のみでバッチ処理を管理し続けるのは限界があるのではないかと考えていました。そんな頃に Kuroko2 が OSS 化され、以下のような理由から早速みんなのウェディングにて導入した次第です。
- Web ベースの管理画面を備えていて、サービス開発エンジニアにも馴染みやすい
- ジョブタイムライン、使用メモリ量の記録など運用に重要な機能が揃っている
- バッチ処理の増加にも Worker の追加で柔軟に対応可能
- Ruby で記述されているため、Ruby エンジニアが拡張しやすい
- 開発にみんなのウェディング CTO である高井が関わっていて、仕様をよく把握している
導入
Kuroko2 はコア機能が kuroko2 gem として提供されています。
以下のコマンドを実行することで、 kuroko2_example という名前の Kuroko2 アプリケーションが作成されます。
$ rails new kuroko2_example --database=mysql --skip-turbolinks --skip-javascript --skip-spring -m https://raw.githubusercontent.com/cookpad/kuroko2/master/app_template.rb
特にエラーなどが発生していなければ kuroko2_example 用のDBの作成などは完了しています。config/kuroko2.yml
, .env
ファイルを編集し最低限 Google OAuth2 の設定(omniauth-google-oauth2 の説明を参照)を済ませれば手元で動作させるための準備は整っています。
その他の設定の詳細は Kuroko2 ドキュメント Administrator Guide の項 等を参照してください。
$ foreman start
12:06:25 rails.1 | started with pid 58374
12:06:25 executor.1 | started with pid 58375
12:06:25 scheduler.1 | started with pid 58376
12:06:25 processor.1 | started with pid 58377
...
foreman 用の Procfile も生成されているため foreman start
で kuroko2_example が動作するはずです。
http://localhost:5000/ にアクセスするとログイン画面が表示されるので、そのまま Google アカウントでログインすると、以下のような Kuroko2 ダッシュボードが表示されます。
最初のジョブ定義
echo Hello Kuroko2!
というコマンドを実行するだけの Kuroko2 ジョブを定義してみましょう。
メニューの “Create New” からジョブを作成し、ジョブ名や説明などを適当に設定し Script に execute: echo Hello Kuroko2!
と設定します。
“Job Instances” ボックスにある “Launch” ボタンからジョブを手動実行するとジョブが開始されます。
正常に動作していれば上記画面のように、実行画面に遷移し結果が表示されます。
execute
他、Kuroko2 に組み込みの各種タスクについては Kuroko2 ドキュメント Default Tasks の項 や ソースコード が参考になりました。
Kuroko2 ジョブのステータス
Kuroko2 のジョブには以下の4つのステータスがあります。
- Working
- ジョブ実行中
- Error
- ジョブ実行中にエラー発生( ジョブはまだ終了していない )
- Success
- ジョブ正常に終了
- Cancelled
- ジョブが途中でキャンセルされ終了
「Working のみが 実行中 を示すステータスで、それ以外はジョブがどういう状態で終了したかを示している」という勘違いが生まれますが、Kuroko2 では Error も 実行中のジョブのステータスです。
Error となったジョブの終了方法
Error となったジョブは自動的には終了せず、worker もそのジョブが専有し続けるため正しく終了させなければいけません。 Kuroko2 では Error となったジョブに対し以下の3つの処理のうちどれかを人間が選択します。
- Cancel
- ジョブの実行をキャンセルし継続処理を諦める
- Retry
- エラーが発生した処理を再度実行する
- Skip
- エラーが発生した処理をスキップして正常終了させる
Kuroko2 環境の構築
Kuroko2 の詳細な構成、実行モデルについては クックパッドのジョブ管理システム kuroko2 の紹介 にて紹介されているためその詳細は省きます。
みんなのウェディングでの構成もクックパッドでの運用同様に以下のように Executor だけを別ホストに分けています。
- kuroko2-console
- Rails
- Processor
- Scheduler
- kuroko2-worker
- Executor
kuroko2-console としては新規インスタンスを一つ用意し、既存の Rails バッチ実行環境を worker としています。
Kuroko2 アプリケーションコードは通常の Rails アプリケーション同様 Capistrano でデプロイし、 Rails, Processor, Scheduler, Executor はそれぞれ Upstart 経由で起動するよう設定しています。
CloudWatch Logs
Kuroko2 はexecution_logger を CloundWatch Logs に設定すると実行中のジョブの出力が CloudWatch Logs に出力されるようになります。 この機能は長時間実行されるバッチ処理などの進捗状況を Kuroko2 画面上からリアルタイムに確認するのに非常に便利です。
この機能を有効にするには AWS のコンソール から Logs Group を作成し config/kuroko2.yml
に設定します。
カスタムタスク
Kuroko2 アプリケーションはカスタムタスクを定義し 特定の処理を簡潔に記述できるようになっています。
みんなのウェディングの Kuroko2 アプリケーションには現在「みんなのウェディング Rails バッチ実行タスク」をカスタムタスクとして追加し運用しています。 近いうちに「データ分析バッチ実行タスク」などいくつかのタスクを追加する予定です。
まとめ
以上、簡単ですがみんなのウェディングに導入した Kuroko2 について紹介させていただきました。
みんなのウェディングはソフトウェアエンジニアを積極的に募集中です。興味のある方はWantedlyからご連絡よろしくお願いいたします。
また直前の告知となってしまいますが、みんなのウェディングのエンジニア数名が発表するエンジニア勉強会(弁護士ドットコム×みんなのウェディング)ライフイベントメディアの成長を支える技術が11/2(水)開催されるため、そちらもご興味ある方は是非ご応募お待ちしております。