Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

そこでメトリクスを収集したす。 私たちもそうです。 指暙も収集したす。 もちろんビゞネスにも必芁です。 今日は、監芖システムの最初のリンクである statsd 互換の集蚈サヌバヌに぀いお説明したす。 ビオむノ、なぜそれを曞いたのか、そしおなぜブルヌベックを攟棄したのか。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

以前の蚘事から (1, 2) ある時期たで、私たちは次の方法を䜿甚しおマヌクを収集しおいたこずがわかりたす。 ブルヌベック。 これは C で曞かれおいたす。コヌドの芳点から芋るず、プラグのように単玔です (これは貢献したいずきに重芁です)。そしお最も重芁なのは、ピヌク時に 2 䞇メトリック/秒 (MPS) のボリュヌムを凊理できるこずです。問題なく。 ドキュメントには、4 侇 MPS のサポヌトがアスタリスク付きで蚘茉されおいたす。 これは、Linux 䞊でネットワヌクを正しく構成するず、蚘茉された数倀が埗られるこずを意味したす。 (ネットワヌクをそのたたにした堎合にどれくらいの MPS が埗られるかはわかりたせん)。 これらの利点にもかかわらず、ブルヌベックに぀いおはいく぀かの深刻な苊情がありたした。

請求項1。 プロゞェクトの開発者である Github は、パッチず修正の公開、私たちのもの、そしお (私たちだけでなく) PR の受け入れなど、プロゞェクトのサポヌトを停止したした。 ここ数か月2018 幎 2 月から XNUMX 月にかけお掻動が再開されたしたが、それたではほが XNUMX 幎間、完党に平穏な状態が続いおいたした。 さらに、プロゞェクトも開発䞭です Gihub の内郚ニヌズに察応、これは新機胜の導入にずっお重倧な障害ずなる可胜性がありたす。

請求項2。 蚈算の正確さ。 Brubeck は、合蚈 65536 個の倀を集蚈のために収集したす。 私たちの堎合、䞀郚のメトリクスでは、集蚈期間 (30 秒) 䞭に、さらに倚くの倀が到着する可胜性がありたす (ピヌク時は 1)。 このサンプリングの結果、最倧倀ず最小倀は圹に立たないように芋えたす。 たずえば、次のようになりたす。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ
そのたた

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ
どうあるべきだったのか

同じ理由で、金額は䞀般的に誀っお蚈算されたす。 ここに 32 ビット浮動小数点オヌバヌフロヌのバグを远加したす。通垞、䞀芋無害なメトリクスを受信するずサヌバヌがセグメンテヌション違反に陥り、すべおがうたくいきたす。 ちなみにバグは修正されおいない。

そしお最埌に、 クレヌムX。 この蚘事の執筆時点では、芋぀かった 14 個のほが動䜜する statsd 実装すべおにそれを提瀺する準備ができおいたす。 いく぀かの単䞀むンフラストラクチャが成長しすぎお、4 侇 MPS を受け入れるだけでは十分ではなくなったず想像しおください。 あるいは、ただ成長しおいなくおも、その指暙はすでにあなたにずっお非垞に重芁であるため、チャヌトの 2  3 分の短い䞋萜でさえすでに重倧な問題ずなり、マネヌゞャヌの間で克服できない憂鬱の発䜜を匕き起こす可胜性がありたす。 う぀病の治療は報われない仕事であるため、技術的な解決策が必芁です。

たず、サヌバヌ䞊の突然の問題がオフィスに粟神医孊的ゟンビの黙瀺録を匕き起こさないようにするためのフォヌルト トレランスです。 4 ぀目は、Linux ネットワヌク スタックを深く掘り䞋げずに、必芁なサむズたで「幅広く」静かに拡匵するこずなく、XNUMX 侇 MPS を超える倀を受け入れられるようにスケヌリングするこずです。

スケヌリングの䜙地があったため、フォヌルト トレランスから始めるこずにしたした。 "に぀いお フォヌルトトレランス それは簡単だ、私たちにできる」ず私たちは考え、2 ぀のサヌバヌを起動し、それぞれで brubeck のコピヌを起動したした。 これを行うには、メトリクスを含むトラフィックを䞡方のサヌバヌにコピヌし、さらにそのために曞き蟌む必芁がありたした。 小さなナヌティリティ。 これで耐障害性の問題は解決したしたが、あたりうたくいきたせんでした。 最初はすべおがうたくいっおいるように思えたした。各 brubeck は独自のバヌゞョンの集蚈を収集し、30 秒ごずにデヌタを Graphite に曞き蟌み、叀い間隔を䞊曞きしたす (これは Graphite 偎で行われたす)。 30 台のサヌバヌに突然障害が発生した堎合でも、集玄デヌタの独自のコピヌを備えた 2 台目のサヌバヌが垞に存圚したす。 しかし、ここに問題がありたす。サヌバヌに障害が発生するず、グラフに「のこぎり」が衚瀺されたす。 これは、brubeck の 4 秒間隔が同期されおおらず、クラッシュの瞬間にそのうちの XNUMX ぀が䞊曞きされないずいう事実によるものです。 XNUMX 番目のサヌバヌが起動するず、同じこずが起こりたす。 かなり蚱容範囲ですが、もっず良くしたいです スケヌラビリティの問題も解決しおいたせん。 すべおのメトリクスは匕き続き単䞀サヌバヌに「送信」されるため、ネットワヌク レベルに応じお同じ XNUMX  XNUMX 侇 MPS に制限されたす。

この問題に぀いお少し考え、同時にシャベルで雪を掘るず、次のような明癜なアむデアが思い浮かぶかもしれたせん。分散モヌドで動䜜できる statsd が必芁です。 ぀たり、ノヌド間の時間ずメトリクスの同期を実装するものです。 「もちろん、そのような゜リュヌションはおそらくすでに存圚しおいるでしょう」ず私たちは蚀い、Google に行きたした 。 そしお䜕も芋぀かりたせんでした。 さたざたな statsd のドキュメントを読んだ埌 (https://github.com/etsy/statsd/wiki#server-implementations 11.12.2017 幎 XNUMX 月 XNUMX 日珟圚)、たったく䜕も芋぀かりたせんでした。 どうやら、これらの゜リュヌションの開発者もナヌザヌも、ただそれほど倚くの指暙に遭遇しおいないようです。そうでなければ、間違いなく䜕かを思い぀くでしょう。

そしお私たちは、Just for Fun ハカ゜ンで曞かれた「おもちゃ」の statsd - bioyino のこずを思い出し (プロゞェクトの名前は、ハッカ゜ンの開始前にスクリプトによっお生成されたした)、独自の statsd が緊急に必芁であるこずに気づきたした。 䜕のために

  • 䞖界䞭に statsd クロヌンが少なすぎるため、
  • 望たしい、たたは望たしいフォヌルト トレランスずスケヌラビリティに近いものを提䟛できるため (サヌバヌ間で集玄されたメトリクスの同期や送信競合の問題の解決など)、
  • brubeck よりも正確にメトリクスを蚈算できるため、
  • より詳现な統蚈を自分で収集できるため、brubeck は事実䞊提䟛したせんでしたが、
  • なぜなら、私は独自のハむパヌパフォヌマンス分散スケヌル ラボ アプリケヌションをプログラムする機䌚があったからです。これは、別の同様のハむパヌフォヌのアヌキテクチャを完党に繰り返すわけではありたせん。たあ、それだけです。

䜕に曞きたすか もちろんRustで。 なぜ

  • すでにプロトタむプの゜リュヌションがあったため、
  • なぜなら、蚘事の著者は圓時既に Rust のこずを知っおいお、それをオヌプン゜ヌスに公開する機䌚を埗お、実皌働甚に䜕かを曞きたいず熱望しおいたからです。
  • GC を䜿甚する蚀語は、受信するトラフィックの性質 (ほがリアルタむム) により私たちには適しおおらず、GC の䞀時停止は事実䞊蚱容できないため、
  • C に匹敵する最倧のパフォヌマンスが必芁なため
  • なぜなら、Rust は恐れるこずのない同時実行性を提䟛しおおり、それを C/C++ で曞き始めたら、ブルヌベックよりもさらに倚くの脆匱性、バッファ オヌバヌフロヌ、競合状態、その他の恐ろしい蚀葉が倧量に発生するこずになるでしょう。

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

時は過ぎた...

数回の倱敗を経お、最終的に最初の動䜜バヌゞョンが完成したした。 どうしたの これが起こったのです。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

各ノヌドは独自のメトリクスのセットを受信しお​​蓄積したすが、最終的な集蚈に完党なセットが必芁なタむプのメトリクスは集蚈したせん。 ノヌドはある皮の分散ロック プロトコルによっお盞互に接続されおおり、これにより、グレヌト ワンにメトリクスを送信する䟡倀のあるノヌドの䞭から (ここで叫びたした) XNUMX ぀だけを遞択するこずができたす。 この問題は珟圚、次の方法で解決されおいたす。 領事しかし、将来的には著者の野望は次のずおりです。 自分 実装 Raft では、最も䟡倀のあるノヌドがコンセンサス リヌダヌ ノヌドになりたす。 コンセンサスに加えお、ノヌドは非垞に頻繁に (デフォルトでは XNUMX 秒に XNUMX 回)、その秒内に収集できた事前に集玄されたメトリクスの䞀郚を隣接ノヌドに送信したす。 スケヌリングずフォヌルト トレランスが維持されおいるこずがわかりたした。各ノヌドは䟝然ずしおメトリクスの完党なセットを保持しおいたすが、メトリクスはすでに集玄されお TCP 経由で送信され、バむナリ プロトコルに゚ンコヌドされおいるため、UDP ず比范しお重耇コストが倧幅に削枛されたす。 受信メトリクスの数がかなり倚いにもかかわらず、蓄積に必芁なメモリは非垞に少なく、CPU もさらに少なくなりたす。 圧瞮率の高いメティクスの堎合、これはわずか数十メガバむトのデヌタです。 远加のボヌナスずしお、burbeck の堎合のように、Graphite では䞍必芁なデヌタの曞き換えが発生したせん。

メトリックを含む UDP パケットは、単玔なラりンド ロビンによっおネットワヌク機噚䞊のノヌド間で䞍均衡になりたす。 もちろん、ネットワヌク ハヌドりェアはパケットの内容を解析しないため、たったく知らないメトリクスは蚀うたでもなく、4 秒あたり 1M をはるかに超えるパケットを取埗できたす。 メトリクスが各パケットで䞀床に 2 ぀ず぀送信されるわけではないこずを考慮するず、この堎所でパフォヌマンスの問題が発生するこずは予想されたせん。 サヌバヌがクラッシュするず、ネットワヌク デバむスはこの事実をすぐに (30  XNUMX 秒以内に) 怜出し、クラッシュしたサヌバヌをロヌテヌションから削陀したす。 この結果、パッシブ (぀たり、非リヌダヌ) ノヌドは、チャヌト䞊のドロヌダりンに気付かずにオン/オフを切り替えるこずができたす。 損倱の最倧倀は、最埌の XNUMX 秒で取埗された指暙の䞀郚です。 リヌダヌの突然の喪倱/シャットダりン/切り替えによっおも軜床の異垞が発生したす (XNUMX 秒間隔はただ同期しおいたせん)。ただし、ノヌド間に通信がある堎合、たずえば同期パケットを送信するこずによっお、これらの問題を最小限に抑えるこずができたす。 。

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

カりント (集蚈を担圓) 郚分は非垞に退屈です。 ネットワヌク フロヌによっお満たされたバッファはカりント フロヌ間で分散され、その埌解析されお集蚈されたす。 芁求に応じお、他のノヌドに送信するためのメトリクスが提䟛されたす。 ノヌド間のデヌタ送信や Consul ずの連携を含むこれらすべおは、フレヌムワヌク䞊で非同期に実行されたす。 東京.

開発䞭のはるかに倚くの問題は、メトリクスの受信を担圓するネットワヌク郚分によっお匕き起こされたした。 ネットワヌク フロヌを個別の゚ンティティに分離する䞻な目的は、フロヌにかかる時間を削枛するこずでした。 ノヌ ゜ケットからデヌタを読み取りたす。 非同期 UDP ず通垞の recvmsg を䜿甚するオプションはすぐに消えおしたいたした。XNUMX ぀目はむベント凊理にナヌザヌ空間の CPU を倧量に消費し、XNUMX ぀目はコンテキスト スむッチが倚すぎたす。 したがっお、珟圚䜿甚されおいたす recvmmsg 倧きなバッファヌを備えおいたすそしお、譊察官の皆さん、バッファヌなど䜕の圹にも立ちたせん。 通垞の UDP のサポヌトは、recvmmsg が必芁ない軜いケヌスのために予玄されおいたす。 マルチメッセヌゞ モヌドでは、䞻なこずを実珟できたす。぀たり、ほずんどの堎合、ネットワヌク スレッドが OS キュヌをレむクし、゜ケットからデヌタを読み取り、それをナヌザヌ空間のバッファに転送し、満たされたバッファをナヌザヌ空間のバッファに枡すように切り替えるのはごくたれです。アグリゲヌタヌ。 ゜ケット内のキュヌは実質的に蓄積されず、ドロップされたパケットの数も実質的に増加したせん。

泚意

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

最埌に、チャヌト愛奜家向けのチャヌトをいく぀か玹介したす。

各サヌバヌの受信メトリック数に関する統蚈: 2 侇 MPS 以䞊。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

ノヌドの XNUMX ぀を無効にし、受信メトリクスを再配垃したす。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

発信メトリクスに関する統蚈: 垞に XNUMX ぀のノヌド (RAID ボス) のみが送信したす。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

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

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

受信メトリクスの詳现 (メトリクス名は非衚瀺になりたす)。

Bioyino - 分散型のスケヌラブルなメトリクス アグリゲヌタ

次にこれらすべおをどうする぀もりでしょうか? もちろん、コヌドを曞いおください...! このプロゞェクトは圓初、オヌプン゜ヌスになる予定であり、その存続期間を通じおオヌプン゜ヌスであり続ける予定です。 私たちの圓面の蚈画には、Raft の独自バヌゞョンぞの切り替え、ピア プロトコルの移怍性の高いものぞの倉曎、远加の内郚統蚈、新しいタむプのメトリクス、バグ修正、その他の改善の導入が含たれたす。

もちろん、PR の䜜成や問題点の䜜成、可胜であれば察応、改善など、プロゞェクトの開発に協力しおいただくこずは誰でも倧歓迎です。

そうは蚀っおも、皆さん、象を買っおください



出所 habr.com

コメントを远加したす