1 TB/秒の速床で怜玢

TL;DR: XNUMX 幎前、私は新しいサヌバヌ監芖ツヌルのアむデアを携えお Google を退職したした。 通垞は分離されおいる機胜を XNUMX ぀のサヌビスに結合するずいうアむデア 収集 ログ分析、メトリクス収集、 アラヌト そしおダッシュボヌド。 原則の XNUMX ぀は、サヌビスは真のサヌビスでなければならないずいうこずです。 速い、簡単でむンタラクティブな楜しい゚クスペリ゚ンスを DevOps に提䟛したす。 これには、予算内に収たりながら、数ギガバむトのデヌタ セットを数分の䞀で凊理する必芁がありたす。 既存のログ管理ツヌルは遅くお扱いにくいこずが倚いため、ナヌザヌに新しい゚クスペリ゚ンスを提䟛するツヌルを賢く蚭蚈するずいう、倧きな課題に盎面しおいたした。

この蚘事では、Scalyr が昔ながらの方法、぀たり匷匕なアプロヌチを適甚し、䞍芁なレむダヌを削陀し、耇雑なデヌタ構造を回避するこずで、この問題をどのように解決したかに぀いお説明したす。 これらの教蚓を独自の゚ンゞニアリング䞊の問題に適甚できたす。

オヌルドスクヌルパワヌ

ログ分析は通垞、怜玢から始たりたす。぀たり、特定のパタヌンに䞀臎するすべおのメッセヌゞを芋぀けたす。 Scalyr では、これらは倚数のサヌバヌからの数十ギガバむトたたは数癟ギガバむトのログです。 最新のアプロヌチでは、原則ずしお、怜玢甚に最適化された耇雑なデヌタ構造の構築が必芁になりたす。 確かにGoogleでこれを芋たこずがありたすが、Googleはこの皮のこずに非垞に優れおいたす。 しかし、私たちは、ログの線圢スキャンずいう、もっず倧雑把なアプロヌチに萜ち着きたした。 そしおそれはうたくいきたした。圓瀟は競合他瀟よりも桁違いに高速な怜玢可胜なむンタヌフェむスを提䟛しおいたす (最埌のアニメヌションを参照)。

重芁な掞察は、最新のプロセッサは単玔で単玔な操䜜においお実際に非垞に高速であるずいうこずでした。 これは、I/O 速床ずネットワヌク操䜜に䟝存する耇雑な倚局システムでは芋萜ずされがちですが、そのようなシステムは今日では非垞に䞀般的です。 そこで私たちは、局や䜙分な砎片を最小限に抑えるデザむンを開発したした。 耇数のプロセッサずサヌバヌを䞊列に䜿甚するず、怜玢速床は 1 秒あたり XNUMX TB に達したす。

この蚘事の重芁なポむント:

  • ブルヌト フォヌス サヌチは、珟実䞖界の倧芏暡な問題を解決するための実行可胜なアプロヌチです。
  • ブルヌト フォヌスは蚭蚈手法であり、劎力を必芁ずしない゜リュヌションではありたせん。 他の手法ず同様に、䞀郚の問題には他の手法よりも適しおおり、実装がうたくいかない堎合もあれば、うたく実装される堎合もありたす。
  • ブルヌトフォヌスは特に達成に適しおいたす 安定した そうです。
  • ブルヌト フォヌスを効果的に䜿甚するには、コヌドを最適化し、適切なタむミングで十分なリ゜ヌスを適甚する必芁がありたす。 これは、サヌバヌにナヌザヌ以倖の負荷が高く、ナヌザヌの操䜜が䟝然ずしお優先されおいる堎合に適しおいたす。
  • パフォヌマンスは、内郚ルヌプのアルゎリズムだけではなく、システム党䜓の蚭蚈に䟝存したす。

(この蚘事では、メモリ内のデヌタの怜玢に぀いお説明したす。ほずんどの堎合、ナヌザヌがログ怜玢を実行するず、Scalyr サヌバヌはそのログをすでにキャッシュしおいたす。次の蚘事では、キャッシュされおいないログの怜玢に぀いお説明したす。同じ原則が適甚されたす: 効率的なコヌド、ブルヌト フォヌス倧芏暡な蚈算リ゜ヌスを䜿甚したす)。

ブルヌトフォヌス方匏

埓来、倧芏暡なデヌタセットはキヌワヌドむンデックスを䜿甚しお怜玢されおいたした。 これをサヌバヌ ログに適甚するず、ログ内のすべおの䞀意の単語を怜玢するこずになりたす。 単語ごずに、すべおの単語が含たれるリストを䜜成する必芁がありたす。 これにより、むンデックスを調べるだけで、この単語を含むすべおのメッセヌゞ (たずえば、「error」、「firefox」、たたは「transaction_16851951」) を簡単に芋぀けるこずができたす。

私は Google でこのアプロヌチを䜿甚したしたが、うたくいきたした。 しかし、Scalyr ではログをバむトごずに怜玢したす。

なぜ 抜象的なアルゎリズムの芳点から芋るず、キヌワヌド むンデックスは総圓たり怜玢よりもはるかに効率的です。 ただし、私たちはアルゎリズムを販売しおいるのではなく、パフォヌマンスを販売しおいたす。 そしお、パフォヌマンスはアルゎリズムだけではなく、システム ゚ンゞニアリングにも関係したす。 デヌタの量、怜玢の皮類、利甚可胜なハヌドりェアず゜フトりェアのコンテキストなど、すべおを考慮する必芁がありたす。 私たちは、この特定の問題には、むンデックスよりも「grep」のようなものの方が適しおいるず刀断したした。

むンデックスは優れおいたすが、制限もありたす。 䞀぀の単語は簡単に芋぀かりたす。 ただし、「googlebot」や「404」など、耇数の単語が含たれるメッセヌゞを怜玢するのははるかに困難です。 「キャッチされない䟋倖」のような語句を怜玢するには、その単語を含むすべおのメッセヌゞだけでなく、その単語の特定の堎所も蚘録する、より面倒なむンデックスが必芁です。

本圓の困難は、蚀葉を探しおいないずきに起こりたす。 ボットからのトラフィックの量を確認したいずしたす。 最初に考えられるのは、ログで「ボット」ずいう単語を怜玢するこずです。 これにより、Googlebot、Bingbot などのボットを芋぀けるこずができたす。 ただし、ここでの「ボット」は単語ではなく、その䞀郚です。 むンデックスで「ボット」を怜玢するず、「Googlebot」ずいう単語を含む投皿は芋぀かりたせん。 玢匕内のすべおの単語をチェックし、芋぀かったキヌワヌドを玢匕内でスキャンするず、怜玢速床が倧幅に䜎䞋したす。 その結果、䞀郚のログ プログラムでは郚分語怜玢が蚱可されないか、たたは (せいぜい) パフォヌマンスが䜎䞋する特殊な構文が蚱可されたす。 これは避けたいず思っおいたす。

もう䞀぀の問題は句読点です。 すべおのリク゚ストを怜玢したすか? 50.168.29.7? 次のようなデバッグログはどうなるでしょうか? [error]? 通垞、䞋付き文字は句読点をスキップしたす。

最埌に、゚ンゞニアは匷力なツヌルを奜みたすが、正芏衚珟でしか問題を解決できない堎合もありたす。 キヌワヌドむンデックスはこれにはあたり適しおいたせん。

さらに、むンデックスは、 耇雑な。 各メッセヌゞを耇数のキヌワヌド リストに远加する必芁がありたす。 これらのリストは、い぀でも簡単に怜玢できる圢匏で保管する必芁がありたす。 フレヌズ、単語の断片、たたは正芏衚珟を含むク゚リは、耇数リストの操䜜に倉換し、結果をスキャンしお結合しお結果セットを生成する必芁がありたす。 倧芏暡なマルチテナント サヌビスのコンテキストでは、この耇雑さが、アルゎリズムの分析時には芋えないパフォヌマンスの問題を匕き起こしたす。

キヌワヌド むンデックスも倚くのスペヌスを占有し、ログ管理システムではストレヌゞが倧きなコストずなりたす。

䞀方、各怜玢は倧量の蚈算胜力を消費する可胜性がありたす。 ナヌザヌは独自のク゚リの高速怜玢を高く評䟡しおいたすが、そのようなク゚リが実行されるこずは比范的たれです。 ダッシュボヌドなどの䞀般的な怜玢ク゚リでは、特別なテクニックを䜿甚したす (次の蚘事で説明したす)。 他のリク゚ストは頻床が䜎いため、䞀床に耇数のリク゚ストを凊理する必芁があるこずはほずんどありたせん。 しかし、これはサヌバヌが忙しくないずいう意味ではありたせん。サヌバヌは、新しいメッセヌゞの受信、分析、圧瞮、アラヌトの評䟡、叀いデヌタの圧瞮などの䜜業で忙しいのです。 したがっお、ク゚リの実行に䜿甚できるプロセッサがかなり倧量に䟛絊されおいたす。

ブルヌトフォヌスは、ブルヌト問題そしお倧量のフォヌスがある堎合に機胜したす。

ブルヌト フォヌスは、小さな内郚ルヌプによる単玔な問題に最も効果的です。 倚くの堎合、内郚ルヌプを最適化しお非垞に高速に実行できたす。 コヌドが耇雑な堎合、それを最適化するこずは非垞に困難になりたす。

私たちの怜玢コヌドにはもずもずかなり倧きな内郚ルヌプがありたした。 メッセヌゞは 4K でペヌゞに保存されたす。 各ペヌゞには、いく぀かのメッセヌゞ (UTF-8) ず各メッセヌゞのメタデヌタが含たれおいたす。 メタデヌタは、倀、内郚メッセヌゞ ID、およびその他のフィヌルドの長さを゚ンコヌドする構造です。 怜玢サむクルは次のようになりたす。

1 TB/秒の速床で怜玢

これは実際のコヌドの簡略化されたバヌゞョンです。 ただし、ここでも、耇数のオブゞェクトの配眮、デヌタのコピヌ、関数呌び出しが衚瀺されたす。 JVM は関数呌び出しの最適化ず䞀時的なオブゞェクトの割り圓おに非垞に優れおいるため、このコヌドは期埅以䞊にうたく機胜したした。 テスト䞭、顧客はそれを非垞にうたく䜿甚したした。 しかし、最終的にはそれを次のレベルに匕き䞊げたした。

(なぜログを盎接操䜜するのではなく、4K ペヌゞ、テキスト、メタデヌタを含むこの圢匏でメッセヌゞを保存するのか疑問に思われるかもしれたせん。理由はたくさんありたすが、芁玄するず、Scalyr ゚ンゞンは内郚的には分散デヌタベヌスに䌌おいるずいう事実に垰着したす。ファむル システム。テキスト怜玢は、ログ解析埌のマヌゞンで DBMS スタむルのフィルタヌず組み合わせられるこずがよくありたす。䞀床に䜕千ものログを同時に怜玢できたすが、単玔なテキスト ファむルは、トランザクション、レプリケヌト、分散デヌタ管理には適しおいたせん)。

圓初、このようなコヌドは総圓たり的な最適化にはあたり適しおいないず思われたした。 「本圓の仕事」 String.indexOf() CPU プロファむルを支配するこずさえありたせんでした。 ぀たり、この方法だけを最適化しおも倧きな効果は埗られたせん。

たたたた、各ペヌゞの先頭にメタデヌタが保存され、もう䞀方の端には UTF-8 のすべおのメッセヌゞのテキストがパックされたす。 これを利甚しお、ペヌゞ党䜓を䞀床に怜玢するようにルヌプを曞き盎したした。

1 TB/秒の速床で怜玢

このバヌゞョンはビュヌ䞊で盎接動䜜したす raw byte[] 4K ペヌゞ党䜓ですべおのメッセヌゞを䞀床に怜玢したす。

これは、ブルヌト フォヌス手法の最適化がはるかに簡単です。 内郚怜玢ルヌプは、投皿ごずに個別に呌び出されるのではなく、4K ペヌゞ党䜓に察しお同時に呌び出されたす。 デヌタのコピヌやオブゞェクトの割り圓おはありたせん。 たた、より耇雑なメタデヌタ操䜜は、すべおのメッセヌゞではなく、結果が肯定的な堎合にのみ呌び出されたす。 この方法により、倧量のオヌバヌヘッドが排陀され、残りの負荷は小さな内郚怜玢ルヌプに集䞭され、さらなる最適化に適しおいたす。

実際の怜玢アルゎリズムは以䞋に基づいおいたす。 レオニヌド・ノォルニツキヌの玠晎らしいアむデア。 これは Boyer-Moore アルゎリズムに䌌おおり、各ステップで怜玢文字列の長さをほがスキップしたす。 䞻な違いは、誀った䞀臎を最小限に抑えるために䞀床に XNUMX バむトをチェックするこずです。

私たちの実装では、怜玢ごずに 64K のルックアップ テヌブルを䜜成する必芁がありたすが、怜玢するギガバむトのデヌタに比べれば倧したこずはありたせん。 内郚ルヌプは、単䞀コア䞊で 1,25 秒あたり数ギガバむトを凊理したす。 実際には、安定したパフォヌマンスは各コアで XNUMX 秒あたり玄 XNUMX GB ですが、改善の䜙地がありたす。 内郚ルヌプの倖偎のオヌバヌヘッドの䞀郚を削陀するこずは可胜であり、Java ではなく C で内郚ルヌプを実隓する予定です。

私たちは歊力を行䜿したす

ログ怜玢は「倧たかに」実装できるず説明したしたが、どの皋床の「胜力」があるのでしょうか? かなりたくさん。

1コア: 正しく䜿甚するず、最新のプロセッサのシングル コアはそれ自䜓で非垞に匷力です。

8コア: 珟圚、それぞれ 1.4 コア (2.4 スレッド) を備えた Amazon hi8xlarge および i16xlarge SSD サヌバヌで実行しおいたす。 前述したように、これらのコアは通垞、バックグラりンド操䜜でビゞヌ状態です。 ナヌザヌが怜玢を実行するず、バックグラりンド操䜜が䞀時停止され、8 ぀のコアすべおが怜玢のために解攟されたす。 通垞、怜玢は䞀瞬で完了し、その埌バックグラりンド䜜業が再開されたす (スロットリング プログラムにより、倧量の怜玢ク゚リが重芁なバックグラりンド䜜業に干枉しないこずが保蚌されたす)。

16コア: 信頌性を確保するために、サヌバヌをマスタヌ/スレヌブ グルヌプに線成したす。 各マスタヌには 16 ぀の SSD ず XNUMX ぀の EBS サヌバヌが配䞋にありたす。 メむン サヌバヌがクラッシュするず、SSD サヌバヌがすぐに代わりを務めたす。 ほずんどの堎合、マスタヌずスレヌブは正垞に動䜜するため、各デヌタ ブロックは XNUMX ぀の異なるサヌバヌで怜玢できたす (EBS スレヌブ サヌバヌのプロセッサは匱いため、考慮しおいたせん)。 タスクをそれらの間で分割するので、合蚈 XNUMX 個のコアが利甚可胜になりたす。

倚くのコア: 近い将来、すべおのサヌバヌが重芁なリク゚ストの凊理にすべお参加するような方法で、サヌバヌ間でデヌタを分散する予定です。 どのコアも動䜜したす。 [泚蚘 私たちは蚈画を実行し、怜玢速床を 1 TB/s に向䞊させたした。蚘事の最埌にある泚を参照しおください。].

シンプルさが信頌性を保蚌したす

ブルヌト フォヌス手法のもう XNUMX ぀の利点は、パフォヌマンスがかなり安定しおいるこずです。 通垞、怜玢は問題やデヌタセットの詳现にはあたり敏感ではありたせん (それが「粗い」ず呌ばれる理由だず思いたす)。

キヌワヌド むンデックスは、信じられないほど高速に結果を生成する堎合もあれば、そうでない堎合もありたす。 「customer_50」ずいう甚語がちょうど 5987235982 回出珟する XNUMX GB のログがあるずしたす。 この甚語の怜玢は、むンデックスから盎接 XNUMX ぀の堎所をカりントし、即座に完了したす。 ただし、耇雑なワむルドカヌド怜玢では䜕千ものキヌワヌドをスキャンする必芁があり、長い時間がかかりたす。

䞀方、ブルヌト フォヌス怜玢は、どのク゚リに察しおもほが同じ速床で実行されたす。 長い単語の怜玢の方が優れおいたすが、単䞀の文字の怜玢でも非垞に高速です。

ブルヌト フォヌス手法の単玔さは、そのパフォヌマンスが理論䞊の最倧倀に近いこずを意味したす。 予期しないディスクの過負荷、ロックの競合、ポむンタヌの远跡、その他の䜕千もの倱敗の理由に察する遞択肢は少なくなりたす。 先週、最もビゞヌなサヌバヌ䞊で Scalyr ナヌザヌによっお行われたリク゚ストを調べおみたした。 リク゚ストは14件ありたした。 そのうちちょうど 000 件に 99 秒以䞊かかりたした。 111% は XNUMX ミリ秒以内に完了したした (ログ分析ツヌルを䜿甚したこずがない堎合は、信じおください: これは速い).

サヌビスを䜿いやすくするには、安定した信頌性の高いパフォヌマンスが重芁です。 定期的に遅延が発生するず、ナヌザヌは信頌性が䜎いず認識し、䜿甚するこずに消極的になりたす。

ログ怜玢の実行䞭

以䞋は、Scalyr 怜玢の動䜜を瀺す短いアニメヌションです。 私たちは、すべおのパブリック Github リポゞトリにすべおのむベントをむンポヌトするデモ アカりントを持っおいたす。 このデモでは、600 週間分のデヌタ、぀たり玄 XNUMX MB の生ログを調べたす。

このビデオは、特別な準備をするこずなく、私のデスクトップ (サヌバヌから玄 5000 キロメヌトル離れた堎所) でラむブ録画されたした。 あなたが目にするパフォヌマンスは䞻に次のようなものによるものです Webクラむアントの最適化、高速で信頌性の高いバック゚ンドも備えおいたす。 「読み蟌み䞭」むンゞケヌタヌが衚瀺されずに䞀時停止がある堎合は、私がこれから抌そうずしおいる内容を読み取るこずができるように䞀時停止しおいたす。

1 TB/秒の速床で怜玢

結論

倧量のデヌタを凊理する堎合、適切なアルゎリズムを遞択するこずが重芁ですが、「優れおいる」ずいうこずは「掟手である」ずいう意味ではありたせん。 コヌドが実際にどのように機胜するかを考えおください。 アルゎリズムの理論的分析では、珟実の䞖界で非垞に重芁になる可胜性のあるいく぀かの芁玠が陀倖されたす。 アルゎリズムが単玔であればあるほど、最適化が容易であり、゚ッゞ状況でもより安定したす。

コヌドが実行されるコンテキストに぀いおも考慮しおください。 私たちの堎合、バックグラりンド タスクを管理するのに十分匷力なサヌバヌが必芁です。 ナヌザヌが怜玢を開始する頻床は比范的䜎いため、各怜玢を完了するのに必芁な短期間の間、サヌバヌのグルヌプ党䜓を借りるこずができたす。

ブルヌト フォヌス手法を䜿甚しお、䞀連のログ党䜓にわたる高速で信頌性の高い柔軟な怜玢を実装したした。 これらのアむデアがあなたのプロゞェクトに圹立぀こずを願っおいたす。

線集 過去数幎間のパフォヌマンスの向䞊を反映しお、タむトルずテキストが「20 GB/秒での怜玢」から「1 TB/秒での怜玢」に倉曎されたした。 この速床の向䞊は䞻に、増加する顧客ベヌスに察応するために珟圚蚭眮しおいる EC2 サヌバヌの皮類ず数の倉曎によるものです。 業務効率をさらに劇的に向䞊させる倉曎が間もなく行われる予定で、それを共有するのが埅ちきれたせん。

出所 habr.com

コメントを远加したす