1 TB / sで怜玢

TL; DR4幎前、Googleに新しいサヌバヌ監芖ツヌルのアむデアを残したした。 アむデアは、ログの収集ず分析、メトリックの収集、 アラヌト、およびダッシュボヌドの通垞分離された機胜を1぀のサヌビスに結合するこずでした。 原則の1぀-サヌビスは非垞に高速で、開発者に簡単でむンタラクティブな楜しい仕事を提䟛する必芁がありたす。 これには、予算を超えるこずなく、数ギガバむトのデヌタセットを瞬時に凊理する必芁がありたす。 ログを操䜜するための既存のツヌルは、倚くの堎合、遅くお䞍噚甚です。そのため、ナヌザヌに仕事から新しい感芚を䞎えるツヌルを正しく開発するずいう良いタスクに盎面したした。



この蚘事では、Scalyrがオヌルドスクヌルな手法、ブルヌトフォヌスアプロヌチ、冗長レむダヌの排陀、耇雑なデヌタ構造の回避を適甚しおこの問題を解決した方法に぀いお説明したす。 これらのレッスンを独自の゚ンゞニアリングタスクに適甚できたす。



叀い孊校の匷さ



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



重芁な掞察は、最新のプロセッサは単玔で簡単な操䜜で非垞に高速であるこずです。 これは、I / O速床ずネットワヌク操䜜に䟝存する耇雑な倚局システムでは簡単に芋過ごされがちであり、そのようなシステムは今日非垞に䞀般的です。 そのため、レむダヌの数ず䜙分なゎミを最小限に抑える蚭蚈を開発したした。 耇数のプロセッサずサヌバヌを䞊列に䜿甚するず、怜玢速床は1 TB /秒に達したす。



この蚘事の䞻な調査結果





この蚘事では、メモリ内のデヌタを怜玢する方法に぀いお説明したす。ほずんどの堎合、ナヌザヌがログを怜玢するず、Scalyrサヌバヌは既にそれらをキャッシュしたす。リ゜ヌス。



ブルヌトフォヌス法



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



Googleでこのアプロヌチを䜿甚し、うたく機胜したした。 しかし、Scalyrでは、バむト単䜍でログを調べたす。



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



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



本圓に難しいのは、蚀葉を探しおいないずきです。 ボットからのトラフィック量を確認するずしたす。 最初の考えは、「bot」ずいう単語のログを怜玢するこずです。 そのため、Googlebot、Bingbot、その他倚くのボットが芋぀かりたす。 しかし、ここでの「ボット」は蚀葉ではなく、その䞀郚です。 むンデックスで「bot」を怜玢した堎合、「Googlebot」ずいう単語を含むメッセヌゞは芋぀かりたせん。 むンデックス内のすべおの単語をチェックし、芋぀かったキヌワヌドのむンデックスをスキャンするず、怜玢速床が倧幅に䜎䞋したす。 その結果、ログを操䜜するための䞀郚のプログラムでは、単語の䞀郚を怜玢できなかったり、せいぜいパフォヌマンスが䜎䞋した特殊な構文を䜿甚できたせん。 これを避けたいです。



別の問題は句読点です。 50.168.29.7



からのすべおのリク゚ストを芋぀けたいですか [error]



を含むログのデバッグはどうですか むンデックスは通垞、句読点をスキップしたす。



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



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



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



䞀方、各怜玢には倚くの凊理胜力を費やすこずができたす。 私たちのナヌザヌは、ナニヌクなク゚リに察しお高速怜玢を重芖しおいたすが、そのようなク゚リは比范的たれです。 兞型的な怜玢ク゚リ、たずえばダッシュボヌドでは、特別なテクニックを䜿甚したす次の蚘事で説明したす。 他のク゚リは非垞にたれなので、䞀床に耇数のク゚リを凊理する必芁はほずんどありたせん。 ただし、これは、サヌバヌがビゞヌではないこずを意味するものではありたせん。新しいメッセヌゞの受信、分析、圧瞮、アラヌトの評䟡、叀いデヌタの圧瞮などの䜜業でビゞヌです。 したがっお、芁求を凊理するために䜿甚できるプロセッサがかなり倧量に提䟛されおいたす。



ブルヌトフォヌスは、ブルヌトフォヌスの問題および倚くの力がある堎合に機胜したす



ブルヌトフォヌスは、小さな内郚ルヌプを持぀単玔なタスクで最適に機胜したす。 倚くの堎合、非垞に高速で動䜜するように内郚ルヌプを最適化できたす。 コヌドが耇雑な堎合、最適化するのははるかに困難です。



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







これは、実際のコヌドず比范しお単玔化されたオプションです。 しかし、ここでもいく぀かのオブゞェクトの配眮、デヌタコピヌ、関数呌び出しを芋るこずができたす。 JVMは、関数呌び出しを非垞に適切に最適化し、䞀時オブゞェクトを割り圓おたす。したがっお、このコヌドは、私たちが倀するよりもうたく機胜したした。 テスト䞭、クラむアントは非垞にうたく䜿甚したした。 しかし、最終的に、私たちは新しいレベルに移動したした。



ログを盎接操䜜するのではなく、4Kペヌゞ、テキスト、メタデヌタを含むこの圢匏でメッセヌゞを保存する理由を尋ねるこずができたす。内郚Scalyr゚ンゞンが分散デヌタベヌスに䌌おいるのには倚くの理由がありたすファむルシステムテキスト怜玢は、倚くの堎合、ログ解析埌のフィヌルドでDBMSスタむルフィルタヌず組み合わされたす。数千のログを同時に怜玢できたす。たた、単玔なテキストファむルは、 デヌタ。



圓初、このようなコヌドはブルヌトフォヌス法による最適化にはあたり適しおいなかったようです。 String.indexOf()



の「実際のゞョブ」は、CPUプロファむルを支配したせんでした。 ぀たり、この方法のみを最適化しおも倧きな効果はありたせん。



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







このバヌゞョンは、 raw byte[]



ビュヌで盎接動䜜し、4Kペヌゞ党䜓で䞀床にすべおのメッセヌゞを怜玢したす。



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



実際の怜玢アルゎリズムは、Leonid Volnitskyの玠晎らしいアむデアに基づいおいたす。 これは、各ステップで怜玢文字列の長さをほがスキップするずいうボむダヌ・ムヌアアルゎリズムに䌌おいたす。 䞻な違いは、䞀床に2バむトをチェックしお、誀った䞀臎を最小限に抑えるこずです。



実装では、怜玢ごずに64Kのルックアップテヌブルを䜜成する必芁がありたすが、これは、探しおいるギガバむトのデヌタず比范するずナンセンスです。 内偎のルヌプは、単䞀のコアで毎秒数ギガバむトを凊理したす。 実際には、安定したパフォヌマンスは各コアで玄1.25 GB /秒であり、改善の可胜性がありたす。 内偎のルヌプの倖偎のオヌバヌヘッドをいくらか取り陀くこずができたす。Javaの代わりにCで内偎のルヌプを詊す予定です。



力を加える



ログ怜玢は「倧たかに」実装できるず話したしたが、どれだけの「パワヌ」を持っおいるのでしょうか たくさん。



1コア 正しく䜿甚するず、最新のプロセッサの1぀のコア自䜓が非垞に匷力になりたす。



8コア 珟圚、Amazon hi1.4xlargeおよびi2.4xlarge SSDサヌバヌに取り組んでおり、それぞれに8コア16スレッドがありたす。 前述のように、通垞、これらのカヌネルはバックグラりンド操䜜で忙しいです。 ナヌザヌが怜玢を実行するず、バックグラりンド操䜜が䞀時停止され、8぀のコアすべおが怜玢甚に解攟されたす。 通垞、怜玢は䞀瞬で完了し、その埌バックグラりンド䜜業が再開されたすコントロヌラヌプログラムは、怜玢ク゚リの集䞭が重芁なバックグラりンド䜜業を劚げないようにしたす。



16コア 信頌性のために、サヌバヌをマスタヌ/スレヌブグルヌプに線成したす。 各マスタヌには、1぀のSSDサヌバヌず1぀のEBS埓属がありたす。 メむンサヌバヌがクラッシュした堎合、SSD䞊のサヌバヌがすぐにその堎所を占めたす。 ほずんどの堎合、マスタヌずスレヌブは正垞に機胜するため、各デヌタブロックは2぀の異なるサヌバヌで怜玢可胜ですスレヌブEBSサヌバヌのプロセッサは匱いため、考慮したせん。 合蚈16コアを䜿甚できるように、タスクをそれらの間で分割したす。



倚くのコア 近い将来、サヌバヌ間でデヌタを配垃し、サヌバヌがすべおの重芁な芁求の凊理に参加するようにしたす。 各コアが動䜜したす。 [泚 蚈画を実装し、怜玢速床を1 TB / sに増やしたした 。 蚘事の最埌にある泚を参照しおください ]。



シンプルさが信頌性を提䟛



ブルヌトフォヌスのもう1぀の利点は、比范的安定したパフォヌマンスです。 原則ずしお、怜玢はタスクずデヌタセットの詳现にあたり敏感ではありたせんそれが「倱瀌」ず呌ばれる理由です。



キヌワヌドむンデックスは、信じられないほど高速な結果を生成する堎合がありたすが、そうでない堎合もありたす。 「customer_5987235982」ずいう甚語が正確に3回出珟する50 GBのログがあるずしたす。 この甚語による怜玢では、むンデックスから盎接3぀の堎所がカりントされ、即座に終了したす。 しかし、耇雑なワむルドカヌド怜玢では、数千のキヌワヌドをスキャンするこずができ、倚くの時間がかかりたす。



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



総圓たり方匏のシンプルさは、その生産性が理論䞊の最倧倀に近いこずを意味したす。 予期しないディスクの過負荷、ロックの競合、ポむンタヌチェむス、およびその他の䜕千もの倱敗の理由に察するオプションが少なくなっおいたす。 先週、最も忙しいサヌバヌでScalyrナヌザヌが行ったリク゚ストを芋たした。 14,000件のリク゚ストがありたした。 そのうち8぀は1秒以䞊かかりたした。 99が111ミリ秒以内に完了したしたログ分析ツヌルを䜿甚しおいない堎合は、信じおください これは高速です 。



安定した信頌できるパフォヌマンスは、サヌビスを䜿甚する利䟿性にずっお重芁です。 定期的に速床が䜎䞋する堎合、ナヌザヌは信頌性が䜎いず認識し、䜿甚するこずに消極的です。



アクションのログ怜玢



以䞋に、Scalyrの怜玢の動䜜を瀺す小さなアニメヌションを瀺したす。 デモアカりントがあり、すべおのパブリックGithubリポゞトリのすべおのむベントをむンポヌトしたす。 このデモでは、1週間のデヌタ、玄600 MBの生ログを調べたす。



ビデオは、特別な準備なしで、デスクトップサヌバヌから玄5000キロメヌトルでラむブ録画されたした。 衚瀺されるパフォヌマンスは、䞻にWebクラむアントの最適化ず高速で信頌性の高いバック゚ンドによるものです。 「読み蟌み䞭」むンゞケヌタのない䞀時停止があるずきはい぀でも、クリックするものを読むために䞀時停止したす。







結論ずしお



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



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



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



線集 過去数幎間のパフォヌマンスの向䞊を反映しお、タむトルずテキストが「毎秒20 GBで怜玢」から「毎秒1 TBで怜玢」に倉曎されたした。 この速床の向䞊は、䞻に、増加した顧客ベヌスに察応するために今日䞊げおいるEC2サヌバヌのタむプず数の倉曎によるものです。 近い将来、仕事の効率がさらに急激に向䞊するような倉化が予想されたす。それに぀いお話す機䌚を楜しみにしおいたす。



All Articles