Ruby
 Computer >> コンピューター >  >> プログラミング >> Ruby

Sidekiqをきれいにスケーリングする

今年の初めに、専用サーバーホスティング施設からAWSに移行しましたが、移行できてとてもうれしく思います。そうすることでサーバーをいじる時間を減らすことができるので、たくさんの自動化が整っていることを嬉しく思います。 :)この投稿では、処理を行うエラー通知の量が変更されたときにインフラストラクチャで何が起こるかについて説明します。

スケーリング方法

私たちの処理パイプラインは、私たちにとって堅実なSidekiqに大きく依存しています。パイプラインでの作業の大部分は、自動スケーリンググループに属するインスタンスによって処理されます。 Sidekiqbacklogが増加すると、CloudWatchアラームがトリガーされ、このグループで新しいインスタンスが開始されます。トラフィックが減少し、バックログが消えると、インスタンスは終了します。

スタイルを使用したスケーリング方法

この設定での唯一の問題は、インスタンスが起動する前に、Sidekiqworkersがすべての作業を完了していることを確認したいということです。 Sidekiqは、完了前に終了したジョブの再スケジュールをサポートしていますが、可能な場合はそれを回避することをお勧めします。ジョブを再スケジュールして再起動するよりも、ジョブを完了するのに数秒余分にかかる方がよいでしょう。幸いなことに、Sidekiqには、現在の仕事が完了した後、新しい仕事の受け入れを停止するように労働者のプロセスに指示する方法があり、退職に備えて労働者を簡単に排水できます。秘訣は、それらのワーカーに排水を開始する必要があることを知らせることです。そのために、ライフサイクルフック、CloudWatch Events + Lambda、EC2 Simple Systems Manager、およびほんの少しのコードを組み合わせて使用​​します。

この投稿の残りの部分では、セットアップをコピーして、おやすみに穏やかに入るインスタンスを取得する方法を説明します。

前提条件

当然、定義したルールに基づいてインスタンスを終了するスケーリングポリシーを持つ自動スケーリンググループが必要になります。さらに、SSMエージェントを実行するようにインスタンスを構成し、SSMアクセス権を持つロールで実行する必要があります。これらのインスタンスには、自動スケーリングAPIと対話するための権限も必要です。インスタンスロールのポリシードキュメントは次のとおりです。

コード

これらのアイテムが配置されたら、ピースを一緒に接続し始めることができます。プロセスの最後(インスタンス上に存在し、Sidekiqのドレインを処理するスクリプト)から開始し、逆方向に作業します。まず、ワーカーを静め、作業が終了するのを待つRubyコード:

Sidekiq APIを介して現在のインスタンスで実行されているSidekiqプロセスのリストを取得し、新しい作業の受け入れを停止するように指示してから、すべてのプロセスにアクティブなジョブがなくなるまで待ちます。

インスタンスを終了するときにそのスクリプトをトリガーするシェルスクリプトは次のとおりです。

やるべきことはたくさんありますが、このスクリプトの要点は8行目から始まります。まず、ライフサイクルフックに取り組んでいることを自動スケーリンググループに通知します。これには、ガードになるという副作用があります。このインスタンスが自動スケーリンググループによって終了するようにスケジュールされていない場合、このコマンドは失敗し、ワーカーシャットダウンスクリプトは呼び出されません。このスクリプトは、インスタンスの終了がスケジュールされていない限り呼び出すべきではありませんが、少し防御的であっても問題はありません。 :)前進していると仮定して、ワーカーをシャットダウンしてから、自動スケーリンググループに終了を続行するように指示します。そのAPI呼び出しを行わない場合、インスタンスはフックのタイムアウトが期限切れになるまで実行され続けます。 (これについては後で説明します)。

SSMドキュメント

ここで、このシェルスクリプトをトリガーするものが必要です。そこでSSMエージェントが登場します。SSMエージェントはバックグラウンドで正常に実行されており、SendCommandを介してドキュメントが表示されて何をすべきかを指示するのを待っています。 OurDocumentは、エージェントに終了スクリプトを実行するように指示します:

ドキュメントをクリックすると、ドキュメントを作成できます EC2コンソールのSystemsManagerShared Resourcesセクション(サイドバーの下部近く)にあるリンクをクリックし、ドキュメントの作成をクリックします。 ボタンをクリックし、そのJSONをコンテンツボックスにドロップします。

ラムダ関数

ドキュメントを配置したら、インスタンスを終了するときにターゲットインスタンスで実行するLambda関数を作成します。そのためのコードは次のとおりです。

PrepInstanceForTerminationを置き換える必要があります ドキュメントに選択した名前を使用しますが、それ以外の場合、このコードはコピーアンドペーストです。

このLambda関数には(通常のLambdaパーミッションに加えて)いくつかのパーミッションが必要です。そのためのIAMポリシードキュメントは次のとおりです。

繰り返しになりますが、ドキュメント名を置き換える必要がある場合があります。

フックとイベントルール

ちょっと待ってください—もうすぐです! Cloudwatchイベントとライフサイクルフックを作成するという2つのことが残っています。まず、イベント:

CloudWatch管理コンソールで、[イベント]をクリックします サイドバーで、[ルールの作成]をクリックします ボタン。これが、作成したばかりのLambdafunctionをトリガーするものです。

Sidekiqをきれいにスケーリングする

左側では、監視するイベントとそのイベントに関する追加の特性(このイベントをトリガーする自動スケーリンググループの制限など)を選択し、右側では、ルールのターゲット(この場合は、前に作成したLambda関数)を選択します。 Lambda関数ターゲットのデフォルトを変更する必要はありません。

それが完了したら、EC2管理コンソールに戻り、管理するインスタンスがある自動スケーリンググループに移動します。ライフサイクルフックをクリックした後、 タブをクリックすると、フックを作成できます。次のようになります。

Sidekiqをきれいにスケーリングする

終了は、関心のある遷移であり、600秒(ハートビートタイムアウト)が経過した後、何らかの理由でシェルスクリプトでAPI呼び出しが発生しない場合は、終了を続行します(デフォルトの結果:CONTINUE)。これにより、Sidekiqワーカーが完了していなくても、10分後にインスタンスが何らかの方法で終了します。

それはラップです

やった!これで、人道的な方法でitsSidekiqインスタンスを終了できる自動スケーリンググループができました。お楽しみください!

追伸:クレジットはawslabsに送られ、これらの要素のいくつかをまとめた非常に役立つチュートリアルが提供されます。


  1. Ubuntu19.04の新機能

    光沢のある新しいソフトウェアが好きなら、CanonicalがUbuntuの新しいバージョンをリリースしたことをすでにご存知かもしれません。エキサイティングかもしれませんが、アップグレードする価値はありますか?あなたが新しいことを気にしない人の一人である場合も、同じ質問が当てはまります。古い(古い)Ubuntuインストールで作業が完了します。しかし、バージョン19.04は、現在発生している問題を解決しますか? Gnomeのパフォーマンスの向上 Gnomeは、品質、パフォーマンス、機能性に関して常にジェットコースターに乗っているようです。何年にもわたって、それは人々が愛したり嫌ったりした機能を導

  2. Rubyで例外が発生したときにローカル変数とインスタンス変数をログに記録する

    簡単に再現できないバグがあったことはありますか?それは、人々があなたのアプリをしばらく使用したときにのみ起こるようです。そして、エラーメッセージとバックトレースは驚くほど役に立ちません。 例外が発生する直前のアプリの状態のスナップショットを撮ることができれば、このような場合に非常に便利です。たとえば、すべてのローカル変数とその値のリストを作成できる場合。ええと、できます-そしてそれはそれほど難しいことではありません! この投稿では、例外時にローカルをキャプチャする方法を紹介します。しかし、最初に、私はあなたに警告する必要があります。 これらの手法はいずれも本番環境では使用しないでください。