IBM Workload Schedulerのジョブスケジューリングの基本

この記事では、IBMのジョブスケジューラーである IBM Workload Scheduler （以下IWS）でどのようにジョブがスケジュールされるのか、その基本的な仕組みについて解説します。
オンプレミスやクラウド上の仮想マシンインスタンスに導入するIWSを前提としています。SaaS の IBM Workload Automation on Cloud には該当しません。

# IWSとは
IWSはバッチジョブの集中管理を得意とする製品で、いわゆる「ジョブスケジューラー」に分類される製品です。主に夜間バッチの管理やその前後のデータベースバックアップ等を自動化するために使われることが多いです。
近年では様々なサードパーティ製品との連携に力を入れており、システムで発生する様々な処理をジョブネットに組み込むことができます。例えばSAPやOracleなどのビジネスアプリケーションや構成自動化ツールとAPI連携し、それらの処理を自動化することが可能です。
常に新しい技術にも対応しており、IWSの管理サーバーやエージェントをコンテナ環境で稼働させることも可能です。

# IWSの構成例
IWSはオンプレミスのシステムはもちろん、パブリッククラウド上の仮想マシンやKubernetesクラスターで実行される様々なジョブを一元管理することが可能です。
例えば下図の構成例のように、オンプレミスのIWSサーバーで、オンプレミスやクラウド上の仮想マシン、そしてコンテナ環境のジョブをまとめて管理する、といった構成とすることも可能です。
![dsp_job_mgmt_final.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/691bcbc9-df1c-a912-2665-55446a014ef6.png)


構成について簡単に説明します。
IWSマスターサーバーには、Master Domain Manager（以降MDM）を導入します。この MDMが仮想サーバやコンテナ環境で実行するジョブを一元管理します。各サーバで実行するジョブの定義はIWSマスターサーバー上のIWS DBに登録します。また、WebベースのUIを提供する Dynamic Workload Console (WebベースのUI、以降DWCと表記します）もIWSマスターサーバーに導入します。運用者はブラウザを使用してDWCにアクセスし、ジョブの管理を行います。
ジョブを実行する仮想サーバーにはIWS Agentを導入します。コンテナ環境でジョブを実行する場合は、コンテナ環境へIWS Agent Podを導入します。

# IWSのジョブスケジューリングの基本
IWSでどのようにジョブが自動実行されるのか説明します。

## ジョブ定義、ジョブ・ストリーム定義の登録
DWCやコマンドラインを使用してジョブ定義を登録します。ジョブ定義では、ジョブ名、実行するスクリプトやプログラムのパス、実行ユーザ、ジョブを実行するエージェント名などを指定します。次に、ジョブ・ストリームを作成します。ジョブ・ストリームとは1つ以上のジョブを含み、ジョブの実行日や実行時刻、複数ジョブが含まれる場合はその前後関係などを指定したものです。ファイルの待ち合わせなどのその他の起動条件があればそれらもジョブ・ストリーム定義に含めます。ジョブ、およびジョブ・ストリームの定義は 全てIWS DBに保管されます。
ジョブ定義・ジョブ・ストリーム定義の関係は次のようなイメージです。
![jobs_and_js.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/58af830e-1428-c468-d8a4-5dd409274288.png)


## ジョブスケジュールの生成
IWSにおいて、ジョブスケジュールとは1日の起点時刻から24時間分のスケジュールです。毎日決まった時刻に日替わり処理を実行し、IWS DBに登録されたジョブ定義やジョブ・ストリーム定義を参照し、次の24時間分のスケジュールを組み立てます。これを毎日繰り返してジョブを自動実行していきます。
1日の起点時刻は、グローバル・オプションの StartOfDay パラメーターにより決まります。デフォルト値は0:00で、任意の時刻に変更可能です。
日替わり処理はIWSインストール時にIWSマスターサーバーで実行するよう自動登録される、 FINAL ジョブ・ストリームにより行われます。FINAL ジョブ・ストリームの開始時刻は、StartOfDayの1分前に起動するよう設定されます。デフォルトの開始時刻は毎日23:59です。こちらも StartOfDayパラメーターの設定値に合わせて任意の時刻に変更可能です。
日替わり処理によって組み立てられたジョブ・スケジュールは「実動計画」と呼ばれ、DWCやコマンドライン(conmanコマンド）でその内容を参照することが可能です。

ジョブスケジュール生成の仕組みを下図に示します。毎日1日の最後にFINALジョブ・ストリームで翌日のジョブスケジュールを生成してジョブスケジュールを切り替えることで、毎日ジョブを自動実行していきます。
![IWS_Job_Scheduling.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/acc6c1fd-ef67-4c01-bf44-d2039f07ebf0.png)

## ジョブの実行
では毎日自動生成したジョブスケジュールをもとに、どのようにジョブが実行されるのでしょうか。
IWSでは２種類のエージェントが提供されています。Fault Tolerant Agentと Dynamic Agentです。
エージェントタイプによってジョブ実行の仕組みが異なります。（エージェントタイプの詳細な違いについては、別の機会に解説したいと思います。）

Fault Tolerant Agent（以下FTA)は、日替わり処理（FINAL ジョブ・ストリーム）実行のタイミングで、IWSマスターサーバーのMDMからジョブスケジュールのコピーを受信します。そしてそのコピーを参照しながら自サーバー上で実行すべきジョブをスケジュール通りに起動していきます。他サーバーのジョブと連携する必要のないものは、起動時刻やその他起動条件（ファイルの生成など）が揃えばMDMからの指示を待たずに実行し、その結果を自サーバーで保持するジョブスケジュールに書き込み、さらにMDMへ通知します。他サーバーのジョブと連携する必要があるものについては、MDMから他サーバーのジョブのステータスを受け取り、ジョブを実行します。このように他サーバーとの待ち合わせが必要のない処理については自律的に実行していきます。FTAのジョブ実行の仕組みを下図に示します。
![FTA_job.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/b43eef88-edae-31a6-ee1e-46f43277d53c.png)



一方Dynamic Agent（以下DA）は、MDMに対してポーリングを行い、自サーバーで実行すべきジョブがあれば実行し、その結果をMDMへ通知します。自サーバー上にジョブスケジュールは持たないので、常にMDMから指示を受け取る必要があります。DAのジョブ実行の仕組みを下図に示します。
![DA_job.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/135603/15f9ce65-9d88-43bd-9f82-39e80695f846.png)


# まとめ
この記事では、IWSの基本的な構成について解説しました。またIWSにジョブが登録されてからどのようにジョブスケジュールが生成され、そしてスケジュールされたジョブがどのように実行されるのかについて解説しました。IWSでのジョブスケジューリングの仕組みを理解する参考になれば幸いです。