web-dev-qa-db-ja.com

Linux cronジョブを「Amazon方式」に変換する方法は?

良くも悪くも、専用のマシンからクラウド(Amazon EC2マシン)に [〜#〜] lamp [〜#〜] Webアプリケーション全体を移行しました。これまでのところ順調に進んでいますが、私たちのやり方 crons は最適ではありません。 「Amazonの方法」を使用してクラウドでcronジョブを最適に管理する方法について、Amazon固有の質問があります。

問題:複数のウェブサーバーがあり、RSSフィードの作成、電子メールのトリガーなど、実際にはさまざまなことを行うバッチジョブのcronを実行する必要があります。ただし、cronジョブは1つのマシンでのみ実行する必要があります。データベースに頻繁に書き込むため、複数のマシンで実行すると結果が重複するためです。

これまで、Webサーバーの1つを「マスターWebサーバー」として指定しましたが、他のWebサーバーにはない「特別な」タスクがいくつかあります。クラウドコンピューティングのトレードオフは信頼性です。これは単一障害点であるため、「マスターWebサーバー」は必要ありません。それらをすべて同一にし、マスターWebサーバーをクラスターから外さないことを忘れずにアップスケールおよびダウンスケールできるようにします。

Linux cronジョブを単一障害点のない一時的な作業項目に変換するために、アプリケーションをどのように再設計できますか?

これまでの私のアイデア:

  • Cronの実行専用のマシンを用意します。これはもう少し管理しやすくなりますが、それでも単一障害点であり、余分なインスタンスがあるといくらかのお金を無駄にします。
  • 一部のジョブはLinux cronから MySQL Events に移動できると考えられますが、アプリケーションロジックをデータベースレイヤーに入れたくないので、このアイデアはあまり好きではありません。
  • おそらく、すべてのマシンですべてのcronを実行できますが、1つのサーバーだけが実際にアクションを実行し、他のサーバーは単にスキップするように、ロックメカニズムを実装する少しのロジックですべてが開始されるようにcronスクリプトを変更します。バグの可能性があるので、私はこのアイデアのファンではありません。私たちは独自の方法よりもAmazonのベストプラクティスを使用することを好みます。
  • ジョブがどこかにスケジュールされ、キューに追加され、Webサーバーがそれぞれワーカーになる可能性がある状況を想像しています。これは「ちょっと、これを取ります」と言うことができます。 Amazon Simple Workflow Service はまさにこの種のことのように聞こえますが、現時点ではあまり詳しくないので、具体的には参考になります。 cronのような単純なものにとっては、かなり重いように思えますか?適切なサービスですか、それともより適切なAmazonサービスがありますか?

更新:質問をしてから 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にありません。プロセスを説明するチュートリアルはないようです。基本的に、私はまだアドバイスやヒントを探しています。

111
Tom

2016年2月12日、Amazonは AWS Lambdaを使用したSSHジョブのスケジューリング についてブログに書きました。これで質問に答えられると思います。

6
Tom

私はAmazonゴールドサポートにサインアップしてこの質問をしました。これが彼らの回答でした。

トム

私は同僚の何人かを簡単に調査し、cronで空っぽになりましたが、その上で寝た後、重要なステップはロックに限定される可能性があることに気付きました。そこで、「分散cronジョブロック」を探して、ApacheプロジェクトであるZookeeperへの参照を見つけました。

http://zookeeper.Apache.org/doc/r3.2.2/recipes.html

http://highscalability.com/blog/2010/3/22/7-secrets-to-successfully-scaling-with-scalr-on-Amazon-by-se.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.アマゾンウェブサービス

37
Tom

このビデオはあなたの正確な質問に答えると思います-cronjobs awsの方法(スケーラブルでフォールトトレラント):

Amazon Simple WorkflowでクラウドでCronを使用

ビデオでは、cronジョブを実装する特定のユースケースを使用した [〜#〜] swf [〜#〜] サービスについて説明しています。

Crontabから直接アクセスする場合、ソリューションの相対的な複雑さを飲み込むのは困難です。最後にケーススタディがあり、この複雑さがあなたに何をもたらすかを理解するのに役立ちました。ケーススタディを見て、スケーラビリティとフォールトトレランスの要件を検討して、既存のcrontabソリューションから移行する必要があるかどうかを判断することをお勧めします。

13
Nathan Buesgens

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人だけがそれを実行することを保証します。何人のワーカーがいるかは関係ありません(特に自動スケーリングを使用している場合)。

このソリューションの問題は次のとおりです。

  • Gearmanサーバーは、たとえばmemcachedまたは何らかのデータベースを使用して分散ストレージで構成しない限り、単一障害点です
  • 次に、複数のGearmanサーバーを使用して、cronjobを介してタスクを作成するサーバーを選択する必要があるため、再び同じ問題に戻ります。しかし、Gearmanを使用してこの種の単一障害点に耐えることができれば、非常に優れたソリューションのように見えます。特に、そのために大きなインスタンスを必要としないこと(この場合、マイクロインスタンスで十分です)。
11
Maciej Majewski

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に処理するメッセージが多数ある場合、実行が遅延する可能性があると述べています。

10
user541905

私はこの質問に3度目に遭遇し、私はチップを入れるだろうと考えました。私たちはしばらくこのジレンマを抱えてきました。私はまだ本当にここでAWSに機能が欠けていると感じています。

私たちの場合、可能な解決策を検討した後、2つの選択肢があると判断しました。

  • 一度に1回だけ実行するジョブを実行するcronjobサーバーをセットアップし、自動スケーリングして、特定のCloudWatch統計が本来の値ではない場合に置き換えられるようにします。を使用しております cloud-initスクリプトを実行してcronjobを実行します。もちろん、これにはダウンタイムが伴うため、cronジョブを逃します(特定のタスクを毎分実行する場合など)。
  • rcronが使用するロジックを使用します。もちろん、魔法はrcron自体にあるのではなく、障害のあるノードを検出するために使用するロジック(ここではkeepalivedを使用)とマスターに別のノードを「アップグレード」します。

2番目のオプションを使用することにしました。これは、それが非常に高速であり、これらのcronジョブを実行するWebサーバーでの経験が既にあるためです(AWS以前の時代)。

もちろん、このソリューションは、タイミングが決定要因である従来の1ノードcronジョブアプローチを置き換えることを特に意図しています(例"午前5時に1日1回ジョブAを実行したい"、または私たちのケース「ジョブBを毎分1回実行したい」)。 cronjobsを使用してバッチ処理ロジックをトリガーする場合、実際にSQSを確認する必要があります。アクティブ/パッシブのジレンマはありません。つまり、単一のサーバーまたは従業員全体を使用してキューを処理できます。また、従業員の規模を拡大するためにSWFを確認することをお勧めします(ただし、auto scalingは、ほとんどの場合、同様のトリックを実行できる可能性があります。

他のサードパーティに依存することは避けたいものでした。

6
Jaap Haagmans

「Amazon」の方法は配布することです。つまり、かさばるcronを多くの小さなジョブに分割し、適切なマシンに渡す必要があります。 SQSを使用して結合することにより、各ジョブが1台のマシンのみから見えるようになります。また、マシンがスピンアップするまでキューがバッファリングするため、障害も許容されます。

また、これらの操作を本当に「バッチ処理」する必要があるかどうかも検討してください。ある夜の更新が予想よりかなり大きい場合はどうなりますか?動的リソースを使用しても、十分なマシンがスピンアップするまで処理が遅れる可能性があります。代わりに、SDBにデータを保存し、SQSを介してマシンに更新を通知し、オンザフライで(キャッシングを使用して)RSSフィードを作成します。

バッチジョブは、処理リソースが制限され、「ライブ」サービスが優先されていた時代のものです。クラウドでは、そうではありません。

4
vsekhar

すでにRedisサービスが稼働している場合、これは良い解決策のように見えます。

https://github.com/kvz/cronlock

続きを読む: http://kvz.io/blog/2012/12/31/lock-your-cronjobs/

4
barbolo

なぜ独自のものを構築するのですか? Quartzのようなもの(クラスタースケジューリングを使用)を使用しないのはなぜですか。ドキュメントを参照してください。

http://quartz-scheduler.org/documentation/quartz-2.x/configuration/ConfigJDBCJobStoreClustering

1
Rama Nallamilli

私たちがやっていることは、特定のサーバーでジョブを実行できるように、特定のDNS名が割り当てられたELBの背後にあるWebアプリケーションクラスターの一部である特定のサーバーがあることです。これには、そのジョブによってサーバーの速度が低下した場合、ELBがクラスターからそれを削除し、ジョブが終了して再び正常になったときにそれを返すという利点もあります。

チャンピオンのように機能します。

1
Patrick Steil

AWS以外のサービスを使用する場合は、 Microsoft Azure をご覧ください。 Azureは、素晴らしい ジョブスケジューラ を提供します。

0
johnnyodonnell

誰も CloudWatch Event に言及していないので、cronジョブを実行するAWSの方法だと思います。 Lambda関数、ECSタスクなど、多くのアクションを実行できます。

0
wanghq