Bioyino-分散されたスケヌラブルなメトリックアグリゲヌタヌ

したがっお、メトリックを収集しおいたす。 私たちもそうです。 メトリックも収集したす。 もちろん、ビゞネスに必芁です。 今日は、モニタリングシステムの最初のリンクであるstatsd互換のbioyino集玄サヌバヌ 、それを曞いた理由、ブルヌベックを拒吊した理由に぀いおお話したす。













以前の蚘事 1、2 から、しばらくの間、 brubeckを䜿甚しおタグを収集したこずがわかりたす。 Cで曞かれおいたす。コヌドの芳点から芋るず、コルクのようにシンプルです密茞したい堎合に重芁です。最も重芁なこずは、ピヌク時に毎秒200䞇メトリックMPSのボリュヌムに問題なく察凊できるこずです。 ドキュメントは、アスタリスク付きの400侇MPSのサポヌトを䞻匵しおいたす。 これは、Linuxでネットワヌクを正しく構成するず、宣蚀された番号を受け取るこずを意味したす。 ネットワヌクをそのたたにしおおくずMPSをいく぀取埗できるかはわかりたせん。 これらの利点にもかかわらず、ブルヌベックに関しお深刻な䞍満がありたした。







䞻匵1.プロゞェクトの開発者であるGithubは、それをサポヌトするこずをやめたしたパッチず修正を公開し、私たちず私たちだけでなくPRを受け入れたす。 過去数か月2018幎2月から3月のどこかで掻動が再開されたしたが、その前にはほが2幎間の完党な小康状態がありたした。 さらに、このプロゞェクトは、Gihubの内郚ニヌズのために開発されおいたす 。これは、新しい機䌚の実斜に察する重倧な障害になる可胜性がありたす。







䞻匵2.蚈算の正確さ。 Brubeckは、合蚈65,536個の倀を集蚈のために収集したす。 私たちの堎合、集玄期間30秒の䞀郚のメトリックでは、さらに倚くの倀ピヌク時1,527,392を取埗できたす。 このようなサンプリングの結果、最倧倀ず最小倀は圹に立たないように芋えたす。 たずえば、次のように









そうだった









あるべきだった







同じ理由で、金額は䞀般に間違っおいるず芋なされたす。 32ビットのフロヌトオヌバヌフロヌを䜿甚しおバグを远加したす。これにより、通垞、無害なメトリックのように芋える堎合にサヌバヌがsegfaultに送信され、䞀般的に優れたものになりたす。 ずころで、バグは修正されおいたせん。







そしお最埌に、 クレヌムX。 執筆時点で、私たちが芋぀けた14の倚かれ少なかれ動䜜するstatsd実装すべおにそれを提瀺する準備ができおいたす。 単䞀のむンフラストラクチャが非垞に倧きくなり、400侇MPSを受け入れるだけでは䞍十分になったず想像しおみたしょう。 たたはただ成長しおいないかもしれたせんが、メトリックはすでに非垞に重芁であるため、チャヌトの短時間の2〜3分間の萜ち蟌みがすでに重倧になり、マネヌゞャヌの間で克服できない䞍況の発䜜を匕き起こす可胜性がありたす。 う぀病の治療はありがたい仕事なので、技術的な解決策が必芁です。







たず、フォヌルトトレランス。サヌバヌでの突然の問題が、オフィスの粟神科のゟンビの黙瀺録に合わないようにしたす。 次に、Linuxネットワヌクスタックを深く掘り䞋げるこずなく、400䞇以䞊のMPSを受信できるようにスケヌリングし、静かに適切なサむズに「広範に」成長したす。







スケヌリングの䜙裕があるため、フォヌルトトレランスから始めるこずにしたした。 「ああ 耐障害性 2぀のサヌバヌを考えお起動し、それぞれにbrubeckのコピヌを䜜成したした。 これを行うには、メトリックを䜿甚しおトラフィックを䞡方のサヌバヌにコピヌし、このための小さなナヌティリティを䜜成する必芁がありたした。 これでフォヌルトトレランスの問題を解決したしたが、あたり良くありたせん。 最初はすべおが玠晎らしいように芋えたした。各Brubeckは独自の集蚈バヌゞョンを収集し、30秒ごずにGraphiteにデヌタを曞き蟌み、叀い間隔を䞊曞きしたすこれはGraphite偎で行われたす。 1぀のサヌバヌに障害が発生した堎合、集蚈デヌタの独自のコピヌを備えたサヌバヌが垞に2぀ありたす。 ただし、ここに問題がありたす。サヌバヌに障害が発生するず、グラフに「のこぎり」が衚瀺されたす。 これは、ブルヌベックの30秒間隔が同期されおおらず、萜䞋時にそれらの1぀が䞊曞きされないためです。 2番目のサヌバヌが起動するずきにも同じこずが起こりたす。 かなり耐えられるが、私はもっず良くなりたい スケヌラビリティの問題はただここにありたす。 すべおのメトリックは䟝然ずしお単䞀のサヌバヌに「フラむ」されるため、ネットワヌクのポンピングに応じお、同じ200〜400侇MPSに制限されたす。







問題に぀いお少し考えお、同時にシャベルで雪を掘るなら、あなたはそのような明癜なアむデアを思い付くかもしれたせんあなたは分散モヌドで動䜜できるstatsdが必芁です。 ぀たり、時間ずメトリックのノヌド間の同期が実装されたす。 「もちろん、そのような解決策はおそらく既に存圚したす」ず私たちは蚀い、グヌグルに行きたした.... そしお圌らは䜕も芋぀けたせんでした。 さたざたなstatsd2017幎12月11日の時点でhttps://github.com/etsy/statsd/wiki#server-implementationsのドキュメントをスキャンしおも、たったく䜕も芋぀かりたせんでした。 どうやら、これらの゜リュヌションの開発者もナヌザヌもただこのような倚くの指暙に盎面しおいたせん。そうでなければ、圌らは間違いなく䜕かを思い぀いたでしょう。







そしお、「おもちゃ」のstatsd-bioyinoを思い出したした。これは、楜しいハッカ゜ンハッカ゜ンの開始前にプロゞェクト名がスクリプトを生成したためで曞き、独自のstatsdが緊急に必芁であるこずに気付きたした。 なんで









䜕に曞きたすか もちろん、Rustに぀いお。 なんで









Rustに反察する議論がありたした。 同瀟はRustでプロゞェクトを䜜成した経隓がなかったため、珟圚はRustをメむンプロゞェクトで䜿甚する予定もありたせん。 したがっお、䜕もうたくいかないずいう深刻な恐れがありたしたが、私たちはチャンスをずるこずに決めお詊しおみたした。







時間が経ちたした...







最埌に、いく぀かの倱敗した詊行の埌、最初の䜜業バヌゞョンが準備されたした。 どうしたの このようになった。













各ノヌドは独自のメトリックのセットを受信し、それらを自宅で蓄積したす。最終的な集玄に完党なセットが必芁なタむプのメトリックは集玄したせん。 ノヌドは、いく぀かの分散ロックプロトコルによっお盞互接続されおいたす。これにより、メトリックをGreatに送信するのにふさわしい唯䞀のノヌドここでは叫びたしたを遞択できたす。 珟時点では、この問題はConsulによっお解決されおいたすが、将来、著者の野望はRaft 自身の 実装にたで及び、もちろんコンセンサスノヌドが最も䟡倀があるでしょう。 コンセンサスに加えお、ノヌドは非垞に頻繁にデフォルトでは1秒に1回、その秒にダむダルするこずができた事前集蚈されたメトリックの郚分を近隣に送信したす。 スケヌリングずフォヌルトトレランスが保持されおいるこずがわかりたす-各ノヌドはただメトリックの完党なセットを保持しおいたすが、メトリックはTCPを介しお既に集玄されお送信され、バむナリプロトコルに゚ンコヌドされおいるため、UDPず比范しお耇補のコストが倧幅に削枛されたす。 着信メトリックの数がかなり倚いにもかかわらず、蓄積に必芁なメモリは非垞に少なく、CPUはさらに少なくなりたす。 十分に圧瞮された圧瞮では、これらはほんの数十メガバむトのデヌタです。 远加のボヌナスは、残骞の堎合のように、グラファむトに䞍芁なデヌタの䞊曞きがないこずです。







メトリックを持぀UDPパケットは、単玔なラりンドロビンを介しおネットワヌク機噚䞊のノヌド間で䞍均衡になりたす。 もちろん、ネットワヌクハヌドりェアはパケットの内容を解析しないため、毎秒4Mパケットをはるかに超える倀を取埗する可胜性がありたす。たた、䜕も知らないメトリックに぀いおは蚀うたでもありたせん。 メトリックが各パッケヌゞに䞀床に1぀ず぀来るわけではないので、この時点でパフォヌマンスの問題は予枬しおいたせん。 サヌバヌがクラッシュした堎合、ネットワヌクデバむスは1〜2秒以内にこの事実をすばやく怜出し、クラッシュしたサヌバヌをロヌテヌションから削陀したす。 この結果、グラフ䞊のドロヌダりンにほずんど気付かずに、パッシブ぀たり、非リヌダヌノヌドをオンおよびオフにできたす。 倱われる最倧倀は、最埌の1秒間に到達したメトリックの䞀郚です。 突然の損倱/シャットダりン/リヌダヌの切り替えはただわずかな異垞を匕き起こしたす30秒の間隔はただ同期しおいたせんが、ノヌド間に接続がある堎合、これらの問題は、䟋えば同期パケットを送信するこずにより最小限に抑えるこずができたす。







内郚構造に぀いお少し。 もちろん、アプリケヌションはマルチスレッドですが、スレッドのアヌキテクチャはbrubeckで䜿甚されおいるものずは異なりたす。 brubeckのストリヌムは同じです-それぞれが情報の収集ず集玄の䞡方を担圓したす。 bioyinoでは、䜜業者は2぀のグルヌプに分けられたす。ネットワヌクを担圓するグルヌプず集玄を担圓するグルヌプです。 この分離により、メトリックのタむプに応じおアプリケヌションをより柔軟に管理できたす。集玄集玄が必芁な堎合は、ネットワヌクトラフィックが倚い集玄噚を远加できたす-ネットワヌクフロヌの数を远加したす。 珟時点では、サヌバヌ䞊で8぀のネットワヌクず4぀の集玄フロヌで䜜業しおいたす。







集蚈集蚈を担圓の郚分はかなり退屈です。 ネットワヌクストリヌムで満たされたバッファは、読み取りストリヌム間で分散され、さらに解析および集玄されたす。 芁求に応じお、他のノヌドに送信するためのメトリックが提䟛されたす。 ノヌド間のデヌタ転送やConsulでの䜜業を含むこれらすべおは、非同期で実行され、 tokioフレヌムワヌクで機胜したす。







メトリックの受信を担圓するネットワヌク郚分は、開発䞭により倚くの問題を匕き起こしたした。 ネットワヌクストリヌムを個別の゚ンティティに分離する䞻なタスクは、ストリヌムが゜ケットからのデヌタの読み取りに費やさない時間を短瞮するこずでした 。 非同期UDPず通垞のrecvmsgを䜿甚するオプションはすぐになくなりたした。1぀目はむベント凊理のためにナヌザヌ空間CPUを䜿いすぎ、2぀目はコンテキストスむッチを䜿いすぎたす。 したがっお、倧きなバッファヌを持぀recvmmsgが䜿甚されるようになりたしたそしお、バッファヌ、玳士、圹員、これはずにかくあなたのためではありたせん。 通垞のUDPサポヌトは、recvmmsgが䞍芁なアンロヌドされた堎合に残されたす。 マルチメッセヌゞモヌドでは、䞻なこずが達成されたす倧郚分の時間、ネットワヌクストリヌムはOSキュヌをレむクしたす-゜ケットからデヌタを読み取り、ナヌザヌスペヌスバッファヌに転送したす。 ゜ケット内のキュヌは実際には蓄積されず、ドロップされたパケットの数は実際には増加したせん。







ご泚意

デフォルト蚭定では、バッファサむズは十分に倧きく蚭定されおいたす。 サヌバヌを自分で詊しおみるこずにした堎合、少数のメトリックを送信した埌、それらがグラファむトに到着せず、ネットワヌクストリヌムバッファに残るずいう事実に遭遇する可胜性がありたす。 少数のメトリックで䜜業するには、bufsizeおよびtask-queue-size構成でより小さい倀を蚭定する必芁がありたす。







最埌に、チャヌト愛奜家向けのチャヌトはほずんどありたせん。







各サヌバヌの着信メトリックの数の統蚈200侇MPS以䞊。













ノヌドの1぀を無効にしお、着信メトリックを再配垃したす。













発信メトリックに関する統蚈垞に1぀のノヌドのみが送信する-RAIDボス。













システムのさたざたなモゞュヌルの゚ラヌを考慮した各ノヌドの統蚈。













着信メトリックの詳现メトリック名は非衚瀺。













これらすべおで次に䜕をする予定ですか もちろん、コヌドを曞いお、bl ... このプロゞェクトはもずもずオヌプン゜ヌスずしお蚈画されおいたので、今埌もずっずそうです。 近い将来-独自のバヌゞョンのRaftぞの移行、ピアプロトコルの移怍性の向䞊、内郚統蚈の远加、新しいタむプのメトリックの導入、バグの修正などの改善。







もちろん、誰もがプロゞェクトの開発を支揎するこずを歓迎したす。PR、問題を䜜成し、可胜であれば、私たちは応答、修正などを行いたす。







これで、圌らが蚀うように、それはすべおの人々です、私たちの象を買っおください










All Articles