良くも悪くも、専用のマシンからクラウド(Amazon EC2マシン)に [〜#〜] lamp [〜#〜] Webアプリケーション全体を移行しました。これまでのところ順調に進んでいますが、私たちのやり方 crons は最適ではありません。 「Amazonの方法」を使用してクラウドでcronジョブを最適に管理する方法について、Amazon固有の質問があります。
問題:複数のウェブサーバーがあり、RSSフィードの作成、電子メールのトリガーなど、実際にはさまざまなことを行うバッチジョブのcronを実行する必要があります。ただし、cronジョブは1つのマシンでのみ実行する必要があります。データベースに頻繁に書き込むため、複数のマシンで実行すると結果が重複するためです。
これまで、Webサーバーの1つを「マスターWebサーバー」として指定しましたが、他のWebサーバーにはない「特別な」タスクがいくつかあります。クラウドコンピューティングのトレードオフは信頼性です。これは単一障害点であるため、「マスターWebサーバー」は必要ありません。それらをすべて同一にし、マスターWebサーバーをクラスターから外さないことを忘れずにアップスケールおよびダウンスケールできるようにします。
Linux cronジョブを単一障害点のない一時的な作業項目に変換するために、アプリケーションをどのように再設計できますか?
これまでの私のアイデア:
更新:質問をしてから Amazon Simple Workflow Service YouTubeのウェビナーを見て、34:40に気づいた( http:/ /www.youtube.com/watch?v=lBUQiek8Jqk#t=34m40s )サンプルアプリケーションとしてcronジョブに言及しているスライドを垣間見ました。ドキュメントページ「 Amazon SWFのAWS Flow Frameworkサンプル 」では、Amazonはcronのサンプルコードがあると述べています。
...> Cron jobsこのサンプルでは、長時間実行されるワークフローが定期的にアクティビティを実行します。実行を非常に長期間実行できるように、実行を新しい実行として継続する機能が示されています。 ...
Java( http://aws.Amazon.com/sdkforjava/ )のAWS SDKをダウンロードしました。 Java code(aws-Java-sdk-1.3.6/samples/AwsFlowFramework/src/com/amazonaws/services/simpleworkflow/flow/examples/periodicworkflow
)。
問題は、正直に言うと、スキルセットで簡単に消化できるものではないので、これは本当に役に立ちません。同じサンプルがPHP SDKにありません。プロセスを説明するチュートリアルはないようです。基本的に、私はまだアドバイスやヒントを探しています。
2016年2月12日、Amazonは AWS Lambdaを使用したSSHジョブのスケジューリング についてブログに書きました。これで質問に答えられると思います。
私はAmazonゴールドサポートにサインアップしてこの質問をしました。これが彼らの回答でした。
トム
私は同僚の何人かを簡単に調査し、cronで空っぽになりましたが、その上で寝た後、重要なステップはロックに限定される可能性があることに気付きました。そこで、「分散cronジョブロック」を探して、ApacheプロジェクトであるZookeeperへの参照を見つけました。
http://zookeeper.Apache.org/doc/r3.2.2/recipes.html
また、TTLでロックを作成する方法としてmemcachedまたは同様のキャッシュメカニズムを使用することへの参照を見てきました。このように、TTL 300秒でフラグを設定し、他のcronワーカーはジョブを実行しません。TTL =有効期限が切れています。これは、昨日説明したSQSオプションに概念的に非常に似ています。
こちらもご覧ください。 Googleのぽっちゃり http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en//archive/chubby-osdi06.pdf
これが役立つかどうかを教えてください。気軽に質問してください。私たちのサービスは初心者にも熟練した開発者にも複雑で気が遠くなることがあります。アーキテクチャとベストプラクティスのアドバイスをいつでも提供できます。
宜しくお願いします、
Ronan G.アマゾンウェブサービス
このビデオはあなたの正確な質問に答えると思います-cronjobs awsの方法(スケーラブルでフォールトトレラント):
Amazon Simple WorkflowでクラウドでCronを使用
ビデオでは、cronジョブを実装する特定のユースケースを使用した [〜#〜] swf [〜#〜] サービスについて説明しています。
Crontabから直接アクセスする場合、ソリューションの相対的な複雑さを飲み込むのは困難です。最後にケーススタディがあり、この複雑さがあなたに何をもたらすかを理解するのに役立ちました。ケーススタディを見て、スケーラビリティとフォールトトレランスの要件を検討して、既存のcrontabソリューションから移行する必要があるかどうかを判断することをお勧めします。
CronjobにSQSを使用する場合は注意してください。「1つのジョブのみが1つのマシンで表示される」ことを保証するものではありません。 「少なくとも1人」がメッセージを受け取ることを保証します。
From: http://aws.Amazon.com/sqs/faqs/#How_many_times_will_I_receive_each_message
Q:各メッセージを何回受信しますか?
Amazon SQSは、キュー内のすべてのメッセージを「少なくとも1回」配信するように設計されています。ほとんどの場合、各メッセージはアプリケーションに1回だけ配信されますが、メッセージを複数回処理してもエラーや不整合が発生しないようにシステムを設計する必要があります。
これまでのところ、Gearman Job Serverインスタンスがインストールされた1つのインスタンス http://gearman.org/ があるソリューションについて考えることができます。同じマシンで、バックグラウンドでcronjobタスクを実行するコマンドを生成しているcronジョブを構成します。次に、Webサーバー(ワーカー)の1つがこのタスクの実行を開始し、1人だけがそれを実行することを保証します。何人のワーカーがいるかは関係ありません(特に自動スケーリングを使用している場合)。
このソリューションの問題は次のとおりです。
Amazonには リリース済み Elastic Beanstalkの新機能があります。 docs から:
AWS Elastic Beanstalkは、ワーカー環境の定期的なタスクをサポートします
コンテナ名に「v1.2.0」を含むソリューションスタックで事前定義された構成を実行している環境の層。 」
スケジューリングタスクを設定するcron.yaml
ファイルを含む環境を作成できるようになりました。
version: 1
cron:
- name: "backup-job" # required - unique across all entries in this file
url: "/backup" # required - does not need to be unique
schedule: "0 */12 * * *" # required - does not need to be unique
- name: "audit"
url: "/audit"
schedule: "0 23 * * *"
自動スケーリングされた環境で一度だけ実行するという保険が、メッセージキュー(SQS)を介して利用されることを想像します。 cronデーモンがイベントをトリガーすると、その呼び出しはSQSキューに入れられ、キュー内のメッセージは1回だけ評価されます。ドキュメントでは、SQSに処理するメッセージが多数ある場合、実行が遅延する可能性があると述べています。
私はこの質問に3度目に遭遇し、私はチップを入れるだろうと考えました。私たちはしばらくこのジレンマを抱えてきました。私はまだ本当にここでAWSに機能が欠けていると感じています。
私たちの場合、可能な解決策を検討した後、2つの選択肢があると判断しました。
cloud-init
スクリプトを実行してcronjobを実行します。もちろん、これにはダウンタイムが伴うため、cronジョブを逃します(特定のタスクを毎分実行する場合など)。rcron
が使用するロジックを使用します。もちろん、魔法はrcron
自体にあるのではなく、障害のあるノードを検出するために使用するロジック(ここではkeepalived
を使用)とマスターに別のノードを「アップグレード」します。2番目のオプションを使用することにしました。これは、それが非常に高速であり、これらのcronジョブを実行するWebサーバーでの経験が既にあるためです(AWS以前の時代)。
もちろん、このソリューションは、タイミングが決定要因である従来の1ノードcronジョブアプローチを置き換えることを特に意図しています(例"午前5時に1日1回ジョブAを実行したい"、または私たちのケース「ジョブBを毎分1回実行したい」)。 cronjobsを使用してバッチ処理ロジックをトリガーする場合、実際にSQS
を確認する必要があります。アクティブ/パッシブのジレンマはありません。つまり、単一のサーバーまたは従業員全体を使用してキューを処理できます。また、従業員の規模を拡大するためにSWF
を確認することをお勧めします(ただし、auto scaling
は、ほとんどの場合、同様のトリックを実行できる可能性があります。
他のサードパーティに依存することは避けたいものでした。
「Amazon」の方法は配布することです。つまり、かさばるcronを多くの小さなジョブに分割し、適切なマシンに渡す必要があります。 SQSを使用して結合することにより、各ジョブが1台のマシンのみから見えるようになります。また、マシンがスピンアップするまでキューがバッファリングするため、障害も許容されます。
また、これらの操作を本当に「バッチ処理」する必要があるかどうかも検討してください。ある夜の更新が予想よりかなり大きい場合はどうなりますか?動的リソースを使用しても、十分なマシンがスピンアップするまで処理が遅れる可能性があります。代わりに、SDBにデータを保存し、SQSを介してマシンに更新を通知し、オンザフライで(キャッシングを使用して)RSSフィードを作成します。
バッチジョブは、処理リソースが制限され、「ライブ」サービスが優先されていた時代のものです。クラウドでは、そうではありません。
すでにRedisサービスが稼働している場合、これは良い解決策のように見えます。
なぜ独自のものを構築するのですか? Quartzのようなもの(クラスタースケジューリングを使用)を使用しないのはなぜですか。ドキュメントを参照してください。
http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering
私たちがやっていることは、特定のサーバーでジョブを実行できるように、特定のDNS名が割り当てられたELBの背後にあるWebアプリケーションクラスターの一部である特定のサーバーがあることです。これには、そのジョブによってサーバーの速度が低下した場合、ELBがクラスターからそれを削除し、ジョブが終了して再び正常になったときにそれを返すという利点もあります。
チャンピオンのように機能します。
AWS以外のサービスを使用する場合は、 Microsoft Azure をご覧ください。 Azureは、素晴らしい ジョブスケジューラ を提供します。
誰も CloudWatch Event に言及していないので、cronジョブを実行するAWSの方法だと思います。 Lambda関数、ECSタスクなど、多くのアクションを実行できます。