Tech Sketch Bucket of Technical Chips by TIS Inc.

SOS JobSchedulerは高可用性実現のための機能を標準実装 -Engineのクラスタリング機能-

Pocket

ドイツ ベルリンのSOS社が開発するOSSのジョブ管理ツール「JobScheduler」。 JobSchedulerの特長の1つとして、単純なジョブ管理機能だけでなく、いかにジョブを確実に運用するかといった点に関する機能も多く含んでいるということがあります。 今回はその1つである『JobScheduler Engine(ジョブ管理マネージャ)のクラスタリング機能』について紹介します。

JobScheduler Engineのクラスタリング機能とは?

JobScheduler Engineのクラスタリング機能では、Active-Standbyの冗長構成とActive-Activeのロードバランシング構成の大きく2つの構成が可能です。 ジョブを管理するマネージャが停止してしまっては元も子もないので確実に動作を続けられるよう上記を実現する機能が内部に実装されています。2台だけでなく、複数台のマネージャでジョブ管理基盤を構成することも可能です。

詳細はこちらのJobSchedulerの公式ページにて紹介されています。

URL: https://kb.sos-berlin.com/display/PKB/Cluster+Operation

特に、ロードバランシング構成は冗長構成の機能も兼ね備える(アクティブなEngine上でのみしかジョブを実行しないという点で)ため、非常に使いどころのある構成となります。本記事ではこのロードバランシング構成の設定方法および動作確認結果をご紹介します。

ロードバランシング構成の設定

JobScheduler Engineのサーバを準備

ロードバランス構成にするためにはまずEngineを2つ以上用意します。

インストール手順はこちらを参照して下さい。

URL: Installation guide(PDF)

JobSchedulerはジョブやスケジュールの定義情報をXMLファイルとして管理します。また、ジョブの実行履歴や実行予定情報をデータベースで管理します。クラスタリング構成を組む際の条件としては、この「XMLファイルやデータベースをクラスタ内の各サーバが同じ内容のものを見れること」という点があります。

今回の検証では2台構成のロードバランシング環境を作るために擬似的に1台のマシン上に2つのJobScheduler Engineをポートを変えて起動してみました。 (物理的に2台のマシンがなくても、JobScheduler Engineのプロセスを2つ起動すればクラスタリングすることが可能です。)

データベースは同一のサーバ内にPostgreSQLを立て、両JobScheduler Engineプロセスが同じデータベースを参照するように設定します。XMLのジョブ定義ファイルについても両プロセスが同じ内容を参照できるよう、それぞれのプロセスが見るXML定義ファイル配置フォルダ(Liveフォルダ)に同じ内容のXMLファイルをコピーして配置しておきます。環境の構成イメージは以下の図の通りです。

jobscheduler-lb

上記はあくまで動作検証のための構成です。実際に利用する場合には、JobScheduler Engineの可用性だけでなく、XMLファイルおよびデータベースについても可用性の担保が必要となります。

  • XMLファイル: NFSサーバを準備して各JobScheduler Engineで同じものを共有できるようにする。NFSサーバのディスク自体はDRBDでミラーリング等
  • データベース: RDBMSのレプリケーション機能を利用する

各Engineをロードバランシングモードで起動

各サーバの起動時の環境変数設定ファイル(/opt/sos-berlin.com/jobscheduler/scheduler/bin/jobscheduler_environment_variables.sh)に以下のオプションを設定。

※SCHEDULER_IDは各Engineで同一の名称が設定されている必要があります。このSCHEDULER_IDをベースにクラスタ管理を行います。
※1つのデータベースで複数のクラスタを管理するということも可能です。

JobScheduler Engineの最大同時実行タスク数を3に制限

JobSchedulerは各Engineや各Agent上で同時に実行可能なタスク数の上限値を設定することができます。JobSchedulerのロードバランシング処理はこのタスク数を元に行われます。デフォルトでは以下のようにEngine上で稼働するプロセス数は30に設定されています。

今回は擬似的に負荷分散の処理を発生させるために、この同時実行可能なタスク数の最大値を3に設定して挙動を追ってみます。

ロードバランシングのモードを設定

JobScheduler Engineのロードバランシングのモードには2パターンがあります。

  1. Engineでの最大実行タスク数の上限値を超える場合に別Engineで実行するモード
  2. 同時実行タスク数がある程度均等になるように実行するモード

デフォルトでは1.の設定で稼働します。2.のモードで実行したい場合には以下の設定を行います。

参考URL: http://www.sos-berlin.com/doc/en/scheduler.doc/xml/param.xml

今回はそれぞれのモードでの挙動を確認してみます。

JobScheduler Engine再起動

上記設定を入れた上で各Engineを再起動します。

これだけでクラスタ構成を組んだ状態で各JobScheduler Engineが稼働します。クラスタ構成が組まれているかどうかはJobSchedulerの管理ダッシュボード上で確認することが可能です。 クラスタ構成が有効に設定されていると以下の図の通り、管理ダッシュボード上に「クラスタ」タブが表示され、このタブ内にクラスタ構成を組んでいる各サーバの状態が表示されます。 各クラスタが正常に稼働しているかのハートビートの確認状態も表示されるのでうまくクラスタが組まれているかの確認にはまずこの画面を確認すると良いでしょう。

jobscheduler-joc-cluster

動作確認用のジョブ・ジョブチェインを登録

ロードバランシング処理の挙動を見るためにジョブおよびジョブチェインの定義ファイルをそれぞれのJobScheduler EngineのXML設定ファイルの配置フォルダ(Liveフォルダ)におきます(実際の運用の時にはNFS等で同一ファイルを共有するようにするのが望ましいです。)。 以下のジョブ定義内でecho出力しているメッセージの4444の部分は、5555ポートで稼働する2号機のEngineのLiveフォルダ上には5555に変えて保存します。(ログファイルに実行結果として追記された際にどちらから実行されたジョブだったのかを明確にするため)

今回は動作確認のため、以下のジョブ、ジョブチェインを同じ内容で名前だけ変えて4セット準備します。

Job

order-job1-1.job.xml(ジョブチェイン1への組み込み用ジョブ1(先行ジョブ))

order-job1-2.job.xml(ジョブチェイン1への組み込み用ジョブ2(後続ジョブ))

JobChain

上記で定義したジョブを順次実行する以下のジョブチェインを定義します。 ここでポイントとなるのは、job_chainの設定として、distributedの項目をyesに設定することです。この設定がないとデフォルトではジョブチェインの各ステップの処理は同一のサーバ上で行われます。

jobscheduler-jobchain

distributed-jobchain1.job_chain.xml(order-job1-1,order-job1-2を順次実行するジョブチェイン定義ファイル)

最終的に出来上がるファイルとしては以下となります。

検証実施

検証は、分散のそれぞれのモードで、4つの各ジョブチェインを10秒ずつ時間をずらして起動し、分散の様子を確認しました。 なお、今回の動作検証にはJobScheduler1.10.2を利用しています。

モード:1. Engineでの最大実行タスク数の上限値を超える場合に別Engineで実行

デフォルトのモードでのジョブ実行の挙動です。

④のdistributed jobchain4が実行されたタイミングで1つのEngineの実行可能なタスク数の上限値3を上回るジョブ実行を行ったため別Engine上でジョブが実行されているのがわかります。

jobscheduler-standardlb

実際に出力されたログの様子はこちら。

モード:2. 同時実行タスク数がある程度均等になるように実行

scheduler.order.distributed.balancedのパラメータをtrueに設定した時の挙動です。

モード1とは異なり、ある程度タスク数を分散させるように処理が実行されます。 今回は同時並行実行タスク数が少なかったためそこまで分散実行される様子が伺えませんでしたがモード1とは異なる挙動を示していることは確認できました。何度か動作を確認した限り、完全に同じタスク数となるような割り振りを行っているわけではないようで、その内部ロジックの確認については今後継続して調査したいと思います。

jobscheduler-balancing

実際に出力されたログの様子はこちら。

まとめ

簡単ではありますが、今回はクラスタリング(ロードバランシング)構成についてご紹介しました。JobSchedulerには他にもこのようなジョブを確実に実行するために欠かせない機能が充実しています。このような機能が充実していることで、エンタープライズなシステムであっても安心して導入できると思います。また、TISではJobSchedulerをより安心してご利用いただけるようJobSchedulerの保守サポートも提供しています。JobSchedulerに関することについてはぜひぜひTISまでご用命下さい。

URL: http://www.tis.jp/service_solution/jobscheduler/

エンジニア採用中!私たちと一緒に働いてみませんか?