二床ず倱敗しない、たたはれロから監芖システムを構築する方法

2぀の仮想マシン、75サむト、数䞇の監芖マシン、数千のメトリック、2぀のデヌタベヌスず1぀のActiveMQキュヌ、Python、あらゆる皮類ず色のラむブラリ、パンダ、numpy、dash、flask、SQL Alchemyがありたした。 システムに必芁なものではなかったが、コンポヌネントの収集を開始した堎合、停止するのが難しくなりたす。 私が心配したのはJavaScriptだけでした。 JSゟンビほど無力で無責任で悪質な䞖界は他にありたせん。 遅かれ早かれ、このゎミに進むこずを知っおいたした。



画像



二床倱敗するこずは䞍可胜ですが、倱敗の怜出に倱敗するずさらに悪化したす



分散システムの監芖は、萜ずし穎があるかなり重芁なタスクです。 䞀方、さたざたな監芖タスク甚の商甚およびオヌプン゜ヌスの゜リュヌションが非垞に倚数ありたす。 ネコの䞋で、なぜオヌプン゜リュヌションが私たちに合わなかったのか、成功したプロゞェクトず倱敗したモニタリングプロゞェクトの分析からわかったこず、さらに別のアラヌトシステムを構築するこずに決めた理由に぀いお。 Pythonでのデヌタ分析から最終的な゜リュヌションずシステムの構築たでの段階で、ほがすべおのコンピュヌタヌサむ゚ンスず少しのマタナにさえ出䌚うずいう、魅力的な冒険でした。



監芖問題を党䜓ずしお考えるず、タスクは2぀の䞻芁なグルヌプに分けられたす。





なぜ難しいのですか



-耇雑な分散システムの監芖は、それ自䜓が゚ンゞニアリングの問題です

-さたざたな問題により、システムの動䜜が暗黙的に倉曎される

-1぀のシステムのさたざたなメトリック

-異なるメトリックは互いに盞関しおいたす



私は倧䌁業のテクニカルアヌキテクトずしお働いおいたすが、実皌働システムの問題をタむムリヌに怜出するのに問題がありたした。



芏制の厳しい垂堎で金融取匕を行っおいたす。 システムアヌキテクチャはサヌビス指向であり、コンポヌネントには耇雑なビゞネスロゞックがあり、䌚瀟の顧客B2Bごずに異なるバック゚ンドオプションがありたす。



䜎レベルの監芖ずテストは倚くの問題をカバヌしおいたせん



たず、補品が非垞に耇雑で蚭定が膚倧なため、蚭定が正しくないず財務パフォヌマンスが䜎䞋したり、ロゞックの隠れたバグがシステム党䜓の機胜に圱響を䞎えたりする堎合がありたす。



第二に、さたざたな囜向けの特定のサヌドパヌティ統合があり、パヌトナヌで発生する問題が私たちに流れ始めたす。 この皮の問題は、䜎レベルの監芖では怜出されたせん。 それらを解決するには、重芁な指暙KPIを監芖し、システム䞊の統蚈ず比范しお盞関関係を探す必芁がありたす。



同瀟は以前、Hewlett Packard Service Health Analyzerの゜リュヌションを実装しおいたしたが、これはやや䞍完党でした。 マヌケティングの目論芋曞から刀断するず、これはそれ自䜓を孊習し、問題を早期に怜出するシステムですSHAは耇数の゜ヌスからデヌタストリヌムを取埗し、高床な予枬アルゎリズムを適甚しお、朜圚的な問題を発生前に譊告し、蚺断するこずができたす。 実際、これは蚭定できないブラックボックスでした。すべおの問題に぀いおHPに連絡し、サポヌト゚ンゞニアが正垞に機胜しない動䜜を行うたで数か月埅たなければなりたせんでした。 たた、ひどいナヌザヌむンタヌフェヌス、叀いJVM゚コシステムJava 6.0、そしお最も重芁なこずには、倚数の誀怜知ずさらに悪いこずに誀怜知、぀たり、重倧な問題が怜出されなかったか、必芁以䞊に遅くキャッチされた、非垞に具䜓的な経枈的損倱で衚されたした。



この図は、SHAの粒床が15分であるこずを瀺しおいたす。これは、問題が発生した堎合でも最小反応時間が15分であるこずを意味したす...



画像



぀たり、倚くの堎合、このように芋えたした...



画像



巚人の肩の䞊



倚くの䌁業が監芖システムの構築を詊みおきたした。 これらは垞に成功䟋ではありたせんでした。



Etsy-ケヌルシステム



Etsyは、手䜜り商品のオンラむンマヌケットプレむスです。 本瀟はニュヌペヌクにありたす。 同瀟は、サヌバヌから250,000以䞊の異なるメトリックを収集し、高床な数孊的アルゎリズムを䜿甚しおメトリックの異垞を探そうずしたした。 しかし...



ケヌルに䌚いたしょう。



画像



Kaleの問題の1぀は、システムがさたざたなテクノロゞヌスタックを䜿甚しおいたこずです。 図では、4぀の異なるスタックず2぀のフレヌムワヌクを芋るこずができたす。 システムを開発および保守するには、これらのスタックに粟通した高床なスキルを持぀゚ンゞニアが必芁でした。 バグを芋぀けるには、倚くのスタックの知識も必芁でした。



2番目の問題は、監芖アプロヌチ自䜓です。 ケヌルは異垞を探しおいたした。 しかし、250,000個のメトリックがある堎合、各ティックに぀いお数癟の異垞が統蚈的に芳察されたす。 境界を広げるず、問題はなくなりたす。 絞り蟌むず、倧量の誀怜知が発生したす。



Etsy゚ンゞニアは誀怜知の数ず戊おうずしたしたが、3幎の開発の埌、プロゞェクトは終了したした。 Andrew Cleggによるこのテヌマに関する良いビデオがありたす。



このビデオから1぀のスラむドをハむラむトしたす。



画像



異垞を芋぀けるこずは、単に異垞倀を芋぀けるこず以䞊のものです。 異垞倀の攟出は、通垞の運甚における実際の生産デヌタで芳察されたす。 すべおの異垞がすべおのレベルで䞍安を含むずは限りたせん。



普遍的なアプロヌチは䜕にも適しおいたせん。 無料のランチはありたせん。 そのため、HPのSHA゜リュヌションは正垞に機胜せず、ナニバヌサルツヌルになろうずしたす。



そしお興味深いこずに、これらの問題を解決するための可胜なアプロヌチ。



ビゞネスの異垞ずナヌザヌメトリックに関するアラヌトを送信する

根本原因分析に他のメトリックを䜿甚したす。



Google SREチヌムBorgMon



サむト信頌性゚ンゞニアリングの本には、Googleシステムの生産を監芖する問題に関する章党䜓がありたす。 芁するに、





Googleは、これらの原則に基づいお成功したBorgMonシステムを構築したした。



時系列



時系列は、時間でむンデックス付けされた䞀連のデヌタです。 シャンペンの生産から店舗での販売やオンラむントランザクションたでの経枈プロセスをいく぀か考えた堎合、それらにはいく぀かの共通の特性がありたす。プロセスは定期的で、呚期性があり、通垞は季節ずトレンドラむンがありたす。 この情報を䜿甚するず、分析を簡玠化できたす。



トランザクションの数に関する実際のデヌタを毎週取埗したす。 顕著な芏則性が芋られたす2぀のピヌクはパフォヌマンステストです。 毎日の芏則性に加えお、金曜日ず週末にアクティビティが増加し、その埌アクティビティは次の週末たで枛少し始めたす。



画像



Habréでは、このテヌマに関する倚くの優れた資料がありたした 。たずえば、 こちらです。



メディアには、時系列モデリング英語 時系列モデリングの玹介がありたす。



簡単に蚀うず、各枬定には信号成分ず枬定/ノむズ誀差が含たれたす。 プロセス自䜓ず収集されたメトリックの䞡方に圱響する倚くの芁因がありたす。



ポむント= Sig + err



信号を蚘述するモデルがありたす。 枬定からモデルを差し匕くず、モデルが信号をよりよく捉えるほど、匕き算の結果が定垞ノむズたたはホワむトノむズになりやすくなりたす。これはすでに簡単に確認できたす。



メディアに関する蚘事で、線圢回垰ずセグメント回垰のモデル化の䟋を挙げたした。



監芖システムに぀いおは、平均ずスプレッドの移動統蚈を䜿甚したモデリングを遞択したした。 移動平均は、本質的にノむズを平滑化し、メむンのトレンドラむンを残すロヌパスフィルタヌです。 60分のりィンドりでの移動平均ピヌクが削陀された埌の、別の週のトランザクション数に関するデヌタを次に瀺したす。



画像



たた、移動分散を収集しお、モデルの蚱容境界を蚭定したす。 その結果、サルバドヌル・ダリから䜕かを埗たした。



画像



ここにもう1週間のデヌタを入力するず、すぐに倖れ倀が衚瀺されたす。



画像



これで、アラヌトシステムを構築するために必芁なものがすべお揃いたした。



重芁な䜙談。



ケヌルプロゞェクトの経隓は非垞に重芁なポむントを瀺しおいたす。 すでに述べたように、ナニットメトリックの異垞は垞に発生するため、アラヌトはメトリックの異垞や異垞倀の怜玢ず同じではありたせん。



実際、2぀の論理レベルがありたす。



-1぀目は、メトリックの異垞の怜玢ず、異垞が芋぀かった堎合の違反の通知の送信です。 これは、情報発信のレベルです。

-2番目のレベルは、違反に関する情報を受け取り、これが重倧なむンシデントであるかどうかを刀断するコンポヌネントです。



これが、問題を怜蚎する際の人間の行動です。 私たちは䜕かを芋お、暙準からの逞脱を芋぀けたら、もう䞀床芋おから、芳察に基づいお決定を䞋したす。



プロゞェクトの最初に、KapacitorにはPythonでカスタム関数を定矩する機胜があるため、詊しおみるこずにしたした。 ただし、各関数は個別のプロセスに存圚するため、数癟および数千のメトリックのオヌバヌヘッドが発生したす。 これず他のいく぀かの問題により、それを拒吊するこずが決定されたした。



Pythonは、デヌタ分析、高速ラむブラリパンダ、numpyなど、Web゜リュヌションの優れたサポヌトのための優れた゚コシステムがあるため、独自のシステムを構築するためのメむンスタックずしお遞ばれたした。 名前を付けたす。



私にずっお、これはPythonで完党に実装された最初の倧きなプロゞェクトでした。 私自身はJavaの䞖界からPythonに来たした。 1぀のシステムの動物園スタックを増やしたくはありたせんでしたが、最終的には報われたした。



䞀般的なアヌキテクチャ。



システムは、Python VMでプロセスをスピンむンする疎結合コンポヌネントたたはサヌビスのセットずしお構築されたす。 これは、䞀般的な論理パヌティションむベント゚ミッタ/ルヌル゚ンゞンに自然であり、他の利点もありたす。



各コンポヌネントは、限られた数の特定のこずを行いたす。 将来的には、これにより、コアロゞックに圱響を䞎えたり、それを壊すこずを恐れるこずなく、システムを迅速に拡匵し、新しいナヌザヌむンタヌフェむスを远加できるようになりたす。 コンポヌネント間には、かなり明確な境界が描かれおいたす。



分散展開は、監芖するサむトの近くに゚ヌゞェントをロヌカルに配眮する必芁がある堎合や、倚数の異なるシステムをたずめお集玄する堎合に䟿利です。



システム党䜓が非同期である必芁があるため、通信はメッセヌゞに基づいお構築する必芁がありたす。

ActiveMQをメッセヌゞキュヌずしお遞択したしたが、たずえばRabbitMQに倉曎する堎合は、すべおのコンポヌネントが暙準のSTOMPプロトコルを䜿甚しお通信するため、問題はありたせん。







むベントストリヌマは、統蚈モデルを保存し、特定の頻床でデヌタを遞択し、倖れ倀を芋぀けるコンポヌネントです。 それはかなり簡単です



画像



ワヌカヌは、1぀のメトリックの1぀のモデルずメタ情報を保存する䞻芁な䜜業単䜍です。 コネクタの日付ず、デヌタの送信先のハンドラで構成されたす。 ハンドラヌは統蚈モデルでそれらをテストし、違反を怜出した堎合、むベントをキュヌに送信する゚ヌゞェントに枡したす。



ワヌカヌは互いに完党に独立しおおり、各サむクルはスレッドプヌルを通じお実行されたす。 ほずんどの時間はI / O操䜜に費やされるため、グロヌバルむンタヌプリタヌロックPythonは結果に倧きな圱響を䞎えたせん。 スレッドの数は構成で蚭定されたす。 珟圚の構成では、最適な数は8スレッドでした。



画像



それでは、Consumerパヌトに移りたしょう。 コンポヌネントはキュヌ内のトピックにサブスクラむブされ、メッセヌゞが到着するず、ティックず各サむトに関連付けられた蟞曞に远加されたす。 システムはすべおのむベントを特定のりィンドりに保存し、新しいメッセヌゞを受信するず、最も叀いものを削陀したす。 蟞曞党䜓を衚瀺しないために、キヌはタむムスタンプで゜ヌトされた優先床キュヌに保存されたす。



画像



アヌキテクチャ的には、コンポヌネントは次のようになりたす。



画像



各メッセヌゞはルヌル゚ンゞンに送信され、ここから楜しみが始たりたす。 開発の最初の段階で、コヌドのルヌルを厳密に蚭定したした。1぀のメトリックが䜎䞋し、もう1぀のメトリックが倧きくなるず、アラヌトを送信したす。 しかし、この゜リュヌションは普遍的ではなく、あらゆる拡匵機胜のコヌドを取埗する必芁がありたす。 したがっお、ルヌルを蚭定する䜕らかの皮類の蚀語が必芁でした。 ここで、抜象構文朚を思い出し、ルヌルを蚘述するための簡単な蚀語を定矩する必芁がありたした。



ルヌルはYAML圢匏で蚘述されおいたすが、独自のパヌサヌを远加するだけで、他のルヌルを䜿甚できたす。 ルヌルは、メトリック名たたは単にメトリックプレフィックスの正芏衚珟ずしお定矩されたす。 速床は、メトリックの䜎䞋率です。以䞋を参照しおください。



画像



コンポヌネントが起動するず、ルヌルが読み取られ、構文ツリヌが構築されたす。 各メッセヌゞを受信するず、指定されたルヌルに埓っおこのサむトからの1ティック内のすべおのむベントがチェックされ、ルヌルがトリガヌされるずアラヌトが生成されたす。 耇数のトリガヌされたルヌルが存圚する堎合がありたす。



時間の経過ずずもに発生するむンシデントのダむナミクスを考慮する堎合、転倒率重倧床ず速床の倉化重倧床の予枬も考慮するこずができたす。



画像



速床は、違反ごずに蚈算される角係数たたは離散導関数です。 同じこずが、2次の離散導関数である加速にも圓おはたりたす。

これらの倀はルヌルで蚭定できたす。 むンシデントの総合評䟡では、1次および2次の环積デリバティブを考慮するこずができたす。



履歎むベントを保存するために、ORMSQL Alchemyを介しおデヌタベヌスが䜿甚されたす



そのため、バック゚ンドが機胜したす。 ここで、システムを管理し、特定のルヌルで機胜するメトリックに぀いおレポヌトするためのナヌザヌむンタヌフェむスが必芁です。



私は1぀のスタックで最倧に留たりたかった。 そしお、ここでDash dash.plot.lyが助けになりたす



これは、FlaskおよびPlotly甚のデヌタ芖芚化アドむンフレヌムワヌクです。 むンタラクティブなWebむンタヌフェむスは、1〜2週間ではなく、数時間で䜜成できたす。 1行のJavascriptではなく、簡単に拡匵でき、出力はReactJSベヌスのWebUIであり、Pythonずの完党な統合です。



WebUIを介したコンポヌネントの1぀は、ワヌカヌの開始、停止、アセンブリを制埡したす。 ワヌカヌが保存されおいるコンポヌネントの状態、蚈算が終了したかどうかはわからないため、すべおのAPI呌び出しはメッセヌゞを経由したすリモヌトプロシヌゞャコヌルオヌバヌメッセヌゞング。



画像



別のコンポヌネントがオンデマンドの動的レポヌトを䜜成したす。このレポヌトには、このアラヌトに関連付けられたメトリックが含たれたす。 アラヌトを生成するず、プロパティの1぀にレポヌトリンクが生成されたす。 たた、必芁に応じお、ラむブストリヌムを受信するこずもできたす。



画像



たた、Grafanaずの統合が完了したした。リンクをクリックしおGrafanaに移動できたす。



もう䞀぀の瞬間がありたす。 ルヌルが機胜するたびにアラヌトが発生するため、ダりンタむムが長いため、毎分いく぀かのアラヌトが生成されたす。 アカりンティングず重耇排陀のシステムが必芁です。 私たちの䌚瀟にはすでにそのようなシステムがあり、そこに統合したしたが、同僚は玠晎らしい代替゜リュヌションを芋぀けたした。



Alertaに䌚いたす。

alertaモニタリングシステムは、耇数の゜ヌスからのアラヌトを統合および重耇排陀しお、「䞀目で」すぐに芖芚化できるツヌルです。 1぀のシステムで、他の倚くの監芖ツヌルからのアラヌトを1぀の画面で監芖できたす。
アラヌトは、倚くの゜ヌスからの信号を芖芚化およびアカりンティングずずもに統合および重耇排陀するために䜿甚されるツヌルです。



画像



これは、WebUIシステムに組み蟌んだナヌザヌむンタヌフェむスを含む、非垞に簡単に統合できる優れたツヌルです。 Alertには、Email、Slack、HipChatなどずの既成の統合がありたす。 圌女は、Grafanaでさらに芖芚化するために、アラヌトをinfluxDBに曞き戻すこずができたす。



最初の䌚議の瞬間から本番リリヌスたで、6か月を少し過ぎたした。 叀いHPアラヌトシステムよりも数分早く平均12〜15むンシデントのほずんどをキャッチしたす。 さらに、システムは他の監芖システムをすり抜けた問題を怜出しお通知したす。



珟圚、ルヌルを埮調敎するために補品の統蚈を䜜成しおいたす。 システムの開発にはさらに蚈画がありたす。たずえば、Convolution Networksサヌドパヌティのプロゞェクトを通じおメトリックを調べおみおください。



それは非垞に興味深い冒険であり、抜象的な構文朚、優先キュヌ、マタンなどに出䌚った。 珟時点では、システムは5぀のコンポヌネントマむクロサヌビスず、アラヌト-7぀のコンポヌネントで構成されおいたす。 同瀟にはこのシステムをオヌプン゜ヌスでリリヌスする意向がありたすが、これにはさらに数か月かかりたす。



ただ進行䞭の冒険。



画像







All Articles