はじめ
私たちは毎日のデータの何百万ものレコードを処理する多くのバッチジョブを実行すると私はそれぞれの周りに座って、毎日数時間何もしないですべてのマシンについて、最近考えてきた会社で働く。 我々はシステムの処理能力を強化するためにこれらのマシンを使用することができればそれは良いのではないでしょうか? 記事のこのセットでは、私はオフィスの採用の潜在的な利点を見に行くよグリッド仮想化環境を使用する。
でパート1私は同様に、オフィスのグリッドを作成する理由の潜在的な理由のいくつかを説明したように私が使用するシステムの概要と技術を与えた。
ジョブコントロール
あなたがジョブを実行するつもりなら、あなたはそれらを管理する何らかの方法が必要になるだろう。 あなたの仕事の制御システムは、(仕事上のサーバ上で)本当によくても事務所のグリッドを実行する前に考える必要があります。 そう、まず、ジョブ制御システム用のタスクは何ですか。
- 労働者からのご要望に応じてジョブを配る
- ジョブの種類を実行するために労働者に指示
- ジョブを追跡する
- ジョブは一度だけ実行されていることを確認
- 労働者に仕事のデータを提供する、またはそれを取得する場所を、少なくともそれらを伝える
システムはまた、拡張可能な、企業がグリッドのソリューションの価値を見つけるとジョブのいくつかのタイプを実行するために拡張できる単一の場合には今のところ有効な解決である必要があります。 たとえば、ジョブが優先順位を得ることが、複数のジョブタイプは最終的にあなたも、それが離れて"一般的な労働者から移動しませんが、ジョブの種類ごとに(用に最適化されているいくつかの異なるワーカーマシンを実行すること、(すなわちいくつかのコードベース)存在する場合があります"アイデア)。 常にシステムを開発する際に将来を考えてみて、短期的なビジョンは、長期的なフラストレーションと増加、開発期間につながることができます。
ジョブサーバ
我々から私達のジョブを制御するためにどこかに必要になるだろう、これは固定リソースロケータを持ってグリッド内の唯一のシステムでなければ、この原因はIPアドレス、ホスト名、URL(内部DNSを使用して)、等のかも労働者が仕事を検索する場所を知る必要がある、労働者は(ないジョブ制御システムは、労働者を見つける)ジョブ制御システムを見つける必要があります。
ジョブサーバー自体は本当に複雑なタスクを(基本的なシステムでとにかく)を持っていない、それはジョブアウト、ジョブのリストを格納するための手が必要で、結果を受信し、その後、後で取得できるように保管しておきます。 どのようにこれらの部品(のような"手の仕事のうち")が定義されていることは非常に基本的なことができます。 その後我々は、管理インターフェイスを含むようにシステムを拡張することができます、追加、編集、削除するために、ジョブを一時停止するが、これはこの練習を超えています。
全くしてから、ジョブサーバーは、メイン処理のサーバ内で実行中の仮想マシンであることができなかったということは、提供それからあまりにも多くのリソースを排出しない理由はありません。 それはあなたが処理の全体の週末を失うとしている金曜日の夜にダウンした場合、ジョブサーバーは、しかし、潜在的にあなたの処理時間、一週間のカップルを(単独であなたのメイン処理のサーバと比較した場合)、原価計算、高可用性を必要としている。 あなたは、高可用性を実現するために負荷分散環境でジョブサーバを置くことを検討する必要があります。
基本的なセットアップ
私たちの仕事はサーバの基本的なセットアップは私がLIMPサーバーのいずれかを(つまりは Li木の実、M ySql、P HPです)呼び出しているもので構成されます。 テアの労働者で実行されているコードは実際には、ジョブ制御システムのデータベースと相互作用することにより実行できるかをジョブ正常に動作します。 の後、私たちは、Webサービスを作成することができますし、実際に手ジョブアウトではなく、労働者は勤勉そのものを行わせることが、今の我々は使い続けるだろうKISSの原則を (それをシンプルに、愚かな!)。
そう、三作成することができますmySQLのジョブに対応するテーブルを。 これらは、`ジョブ`、`jobRecords`、と`jobResults`になります。
ここに私が使用しているSQLバディのに偉大な小さな代替phpMyAdminを (他人のために参照してください:その簡単にCentOS上でインストールするという理由だけでphpMyAdminに10大の選択肢を )
この表は、5つの簡単なフィールドで構成されています
- ID:ジョブを一意に識別
- 名前は:クライアントの参照、または他の識別子は、任意の数である可能性があります
- ステータス:ジョブは、例えば、でどこにあるのかを知る必要がある
- started_by:誰が仕事を始めたのか? この処理は、すべて必須ですが、あると便利ですされていません。 私は、ネットワーク上のIPアドレスで追跡労働者をお勧めしたい
- started_at:労働者がジョブを開始するのですか? 我々は再び仕事をピックアップし、別の労働者によって処理を開始する必要がある知っている時のXの時間内に完了していないジョブを追跡することによって。 労働者は、処理を停止/任意の数の理由により、電源障害、クラッシュ、ネットワークの損失、等のためにオフラインで行くことができる
それは、このテーブルは、統計のトラッキング、仕事にかかった時間を確認するために終了時刻の列に、労働者が仕事を(明らかにこのニーズがする傾向にピックアップ数を確認するためにカウンタを可能にするためにいくつかの追加フィールドを拡張することができる方法は簡単です1)、ジョブの優先順位は、リストが上に行くことができる。 より複雑なジョブのシナリオでは、労働者が(そのためだけに適して労働者を使用する)、あるいはどのような種類の労働者のことが必要とされるへのアクセスを必要とどれだけのメモリを指定することが可能になります。
いくつかのサンプルジョブを追加できます。
次の表は、再びこれらは私たちの仕事のレコードである、理解することは非常に簡単です。 これらは、列`jobs_id`でメインジョブのテーブルにリンクされています。 このテーブルから構成することは非常にあなたが労働者に供給するために必要なデータに依存し、我々は4つの列を持っている非常に簡単な例を行うことができます。
- ID:レコードのID
- 名前:人の名前
- 住所:人のアドレス
- jobs_id:このレコードがリンクされているジョブID
番目で最後のテーブルの結果のテーブルで構成され、それはほとんど同じでは当社の記録表として構成している、と一部の列を追加することで、レコードのテーブルの一部である可能性があります:
- job_record_id:ジョブテーブルに結果をリンク
- 結果:結果データ
...そしてそれは、ジョブ制御のために必要なすべてです! (非常に基本的なレベルではあるが)私の場合、私はプロセスに私のデータが置かれていた別のテーブルに指摘したんだけど、これは同じように簡単にファイルをされことが、シミュレーションコードを実行するためのパラメータは、あなたはそれに名前を付けます。
仕事の選択
前述したように、労働者が今の私たちのために私達の仕事の管理を行うので、我々が本当に必要なのは、処理を必要とする仕事を見つけると情報を得ることです。 どのように我々はこれをしますか? よく私たちの仕事の選択基準を選択し、ジョブを探すため、SQLで私は次のようにしました。
- 完全としてではなく、私たちの労働者からマークし(識別子と__ME__を置き換える、最も簡単にはIPアドレスになる)にリセットされていないすべてのジョブを実行してください。
UPDATE`ジョブが`、SETは`status`= 0 WHERE`ステータス`= 1と`started_by`= __ME__;
- 私たちの仕事の選択基準を使用して、ジョブを選択し、この労働者はそれを扱っていることを制御システムに指示します。
UPDATE`ジョブが`は`status`= 1、`started_by`= __ME__、`started_at`= NOW()WHERE`ステータス`= 0 ORをセット
(`ステータス`= 1と`started_at`> DATE_SUB(NOW()、INTERVAL X HOUR))の`id`ASC ORDER BYの。
我々はすべてのジョブがAWOLをクラッシュさせたり、行く労働者のイベントで実行されるように時間のXの量で結果を返されていないジョブをつかんで。
- 次のレコード自体が続くジョブの詳細を取得できます。
`仕事`WHERE`started_by`= __ME__ LIMIT 1 * FROMを選択します。
;`job_records`の`id`= __JOBID__します。SELECT * FROM
ジョブの完了時に我々の結果のレコードを挿入し、完全なようにジョブをマークします。 ジョブは、スクリプト内の一部の堅牢性を可能にする任意の時点で一時停止/再開ができるように覚えている。 それは、タスクがそのジョブ内のレコード数をチェックし、ジョブ制御のシステムをアップデートする途中で中断し、ジョブ制御システムに戻って保存された結果の数は賢明な動きになることかもしれない。
さらに、これはジョブがあなたが本当にすべきSQL問合せのフレームから選択し、管理できる方法を示すwhilst 抽象化は、Webサービスを使用するように切 り替えることにした場合ように、ジョブ制御を、ファイルベースのシステム、 XML 、またはその他のシステムの数は、それは上記のコードには影響しません。
ジョブの構成
次に考慮すべき側面は、ジョブのサイズと構成です。 ジョブの設定で再生することにより、我々はスピード、プロセスの複製、および信頼性の間で優れたバランスを取ることができる。 カップルのOFAのシナリオを取る。
- ジョブの実行には各1日取る:これは、労働者が(時間の3分の2の電力の10%を覚えている)各ジョブを処理するために15日間必要があることを意味します。 これは明らかに賢明な設定ではない、あなたの仕事のサイズがあまりにも大きいです! 初期の労働者がAWOLを(それが結果に加えて再処理の時間を返していないことをピックアップする時間)に行くはずそれが処理された仕事を得るために少なくとも2倍の時間がかかります。 理想的には、最初が欠けて行く必要がプロセスに2日かかるだろうあなたが仕事上と最悪のケースで刻々と仕事を続けるそのように、 簡単にそれぞれの長いアイドル期間の終了によってクリア少なくとも一つの完全な仕事があるんだけど。
- ジョブの実行に1分かかる:これは労働者がそれぞれのジョブを実行するために約15分かかることを意味します。 これは、最初は理想的に見えるかもしれないが、あなたが昼食時に追加の作業の処理を得るため、コーヒーブレイク、ミーティング、など、このシナリオは、システムの他の部分に負担がかかり、独自の問題を紹介します。 例えば、まず、セットアップ/処理時間の比率は、したがって、システムの効率性を失って、右下に行くつもりさ。 お使いのネットワークには、常に一日の仕事にその日のドンである様々な労働者の不満スタッフへの求人情報をストリーミングされる予定です。 また、それは多くのと定期的に作業の小片をたくさん皿に持っているとして、ジョブの処理サーバーでより多くの歪みを置くつもりだ。 あなたの仕事のサーバがダウンした場合最後に、このような状況では大きなジョブに対し、未完了の作業の膨大なバックログを作成するつもりです可能性の継続的な処理のジョブサーバーは、問題が発生したことを穏やかに気づいていない。
現実には多くの使用可能なリソース、ジョブの種類、ジョブのターンアラウンドタイムの要件、ネットワーク機能などによって変化するため、グリッドの設定のための1つの理想的な設定は存在しません。 しかし、いくつかのガイドラインは次のようになります。
- サイズのジョブは、その各労働者は、15時間の期間に少なくとも3-4ジョブ(最長可能性がアイドル時間の期間)を介して入手することが可能であること
- そのセットアップの時間が処理時間(心に上記の点を有する)に比べてごくわずかになるように、ジョブのサイズで再生します。
- 仕事はあなたはそれが完了するまで期待時間の合計の2倍(多分少ない)で完了しない場合、そのなくなってAWOLとは別の労働者とそれを処理を開始することを前提としています。 これは、(おそらく長く、後続のジョブが失敗した場合に)三回にそれが完了するまで、ジョブの正常な長さを待たなければならないかもしれないことを意味します。 この時間を短縮するが、あまりにも多く、定期的に処理タスクを複製し始める可能性があるので、それを削減しないように注意することができます。
- ジョブズCEOは、可能な限り外部の要件から独立している必要があります。 ジョブサーバーは、例えば、唯一のすべてのジョブの開始時と終了時に連絡する必要があります。
- あなたのネットワークを飽和させないでください、この二つ負の効果を持って、あなたの昼間のスタッフはイライラするネットワークを使用して、問題は、あなたのグリッドをスケールとしてだけ悪くなる問題がタイムアウトに接続で発生する可能性があるでしょう。
- 確実に仕事もあなたの作業者で実行することができます。 ジョブがなりすぎる場合、メモリを集中的またはディスクスペース集中的なジョブが中止開始され、あなたが気づくだけではない本当の理由理由で処理されたジョブの数の減少です。
ジョブのサブミットの結果
ジョブの結果を提出するとき、それは現在の労働者がしばらくの間休止している場合は特に、結果は別の労働者が提出されていないことを確認することが重要です。
結果が送信されると、結果の数は、ジョブ内のレコード数と一致していることを確認してください。
先に述べたように、およびジョブの検索と結果の提出にフォールトトレランスを構築し、強調を超えることはできません。 労働者は(そしておそらく意志)回数の最も不便な時にサスペンドモードに入ることができますし、これがために仕出し料理する必要があります。 また、もう一度、結果の提出を抽象化することに対処する方がはるかに簡単にジョブの制御システムへの将来の変化に応えるのに役立ちます。
まとめ
このsectionÂでは、ジョブ制御サーバが実行するとセットアップは非常に基本的なシステムを取得する方法必要なものを見てきました。 我々は、制御システムからのジョブと最善の方法で最も私たちのオフィスのグリッドシステムのを得るためにジョブを設定するにはを取得する方法について説明しました。 終了するには、ジョブ制御の結果をサーバーに提出する上で段落または2つが発表された。
- ジョブ制御サーバは、すべての作業単位が完了したことを仕事と確実に管理
- 選択/結果を提出して仕事を抽象化することにより、我々は多くの問題もなく制御サーバの技術を変更することができます。
- それらは、ネットワークインフラストラクチャに過剰な圧力をかけることなく迅速かつ効率的に実行されるようにジョブを設定し、定期的に処理タスクを複製することなく。
- あなたのルーチンにフォールトトレランスおよびエラーcheckingÂを構築することを確認してください、労働者が一時停止と再開と時間の最も不便なことができる。 結果は既に別の労働者が提出されているかどうかを確認することを忘れないでください。
次の時間
に第3部私たちは、仮想加工機を作成し、アイドルタイム労働者になるために私たちのWindowsマシンをセットアップします。