Bioyino - verdeelt, skalierbar Metrikaggregator

Also sammelt Dir Metriken. Wéi mir sinn. Mir sammelen och Metriken. Natierlech, néideg fir Betrib. Haut wäerte mir iwwer den éischte Link vun eisem Iwwerwaachungssystem schwätzen - e statsd-kompatibele Aggregatiounsserver bioyino, firwat mir et geschriwwen hunn a firwat mir brubeck opginn.

Bioyino - verdeelt, skalierbar Metrikaggregator

Vun eise fréieren Artikelen (1, 2) Dir kënnt erausfannen, datt bis eng Zäit mir Marken gesammelt hunn benotzt Brubeck. Et ass am C geschriwwen. Aus enger Code Siicht ass et sou einfach wéi e Stecker (dëst ass wichteg wann Dir bäidroe wëllt) an, am wichtegsten, handhabt et eis Bänn vun 2 Millioune Metriken pro Sekonn (MPS) um Peak ouni Problemer. D'Dokumentatioun seet Ënnerstëtzung fir 4 Millioune MPS mat engem Asterisk. Dëst bedeit datt Dir déi uginn Figur kritt wann Dir d'Netzwierk korrekt op Linux konfiguréiert. (Mir wëssen net wéivill MPS Dir kënnt kréien wann Dir de Reseau verléisst wéi et ass). Trotz dëse Virdeeler hu mir e puer sérieux Reklamatiounen iwwer Brubeck.

Fuerderung 1. Github, den Entwéckler vum Projet, huet opgehalen et z'ënnerstëtzen: Patches a Fixen ze verëffentlechen, eis an (net nëmmen eis) PR akzeptéieren. An de leschte Méint (irgendwo vu Februar-Mäerz 2018) ass d'Aktivitéit erëm opgaang, awer virdru war et bal 2 Joer komplett Rou. Zousätzlech gëtt de Projet entwéckelt fir intern Gihub Besoinen, wat e seriöse Hindernis fir d'Aféierung vun neie Fonctiounen ka ginn.

Fuerderung 2. Genauegkeet vun Berechnungen. Brubeck sammelt insgesamt 65536 Wäerter fir Aggregatioun. An eisem Fall, fir e puer Metriken, während der Aggregatiounsperiod (30 Sekonnen), kënne vill méi Wäerter ukommen (1 um Héichpunkt). Als Resultat vun dëser Echantillon schéngen déi maximal a Minimum Wäerter nëtzlos. Zum Beispill, wéi dëst:

Bioyino - verdeelt, skalierbar Metrikaggregator
Wéi et war

Bioyino - verdeelt, skalierbar Metrikaggregator
Wéi et sollt sinn

Aus deemselwechte Grond ginn d'Bomme generell falsch berechent. Füügt hei e Bug mat engem 32-Bit Float-Iwwerfluss, deen allgemeng de Server op Segfault schéckt wann hien eng scheinbar onschëlleg Metrik kritt, an alles gëtt super. De Feeler ass iwwregens net fixéiert ginn.

An, endlech, Fuerderung X. Zu der Zäit vum Schreiwen si mir prett et un all 14 méi oder manner Aarbechtsstatistiken Implementatiounen ze presentéieren déi mir konnten fannen. Loosst eis virstellen datt eng eenzeg Infrastruktur sou vill gewuess ass datt 4 Millioune MPS net méi duergeet. Oder och wann et nach net gewuess ass, awer d'Metriken si scho sou wichteg fir Iech, datt souguer kuerz, 2-3 Minutte Dips an den Charts scho kritesch kënne ginn an d'Baut vun oniwwersiichtlecher Depressioun tëscht Manager verursaachen. Well d'Behandlung vun Depressioun eng dankbar Aufgab ass, sinn technesch Léisunge gebraucht.

Éischtens, Feeler Toleranz, sou datt e plötzleche Problem um Server keng psychiatresch Zombie Apokalypse am Büro verursaacht. Zweetens, Skaléieren fir méi wéi 4 Millioune MPS ze akzeptéieren, ouni déif an de Linux Netzwierkstack ze gräifen a roueg "an der Breet" op déi erfuerderlech Gréisst ze wuessen.

Well mir Plaz fir Skaléieren haten, hu mir decidéiert mat Feeler Toleranz unzefänken. "IWWER! Feeler Toleranz! Et ass einfach, mir kënnen et maachen ", hu mir geduecht an 2 Server lancéiert, eng Kopie vu Brubeck op jidderee erhéicht. Fir dëst ze maachen, hu mir de Traffic mat Metriken op béid Serveren kopéiert a souguer fir dëst schreiwen kleng Utility. Mir geléist de Feeler Toleranz Problem mat dëser, mee ... net ganz gutt. Am Ufank war alles super: all Brubeck sammelt seng eege Versioun vun der Aggregatioun, schreift Daten op Graphite eemol all 30 Sekonnen, iwwerschreift den alen Intervall (dëst gëtt op der Graphite Säit gemaach). Wann ee Server op eemol klappt, hu mir ëmmer en zweeten mat senger eegener Kopie vun den aggregéierten Donnéeën. Awer hei ass de Problem: wann de Server klappt, erschéngt eng "Sow" op de Grafike. Dëst ass wéinst der Tatsaach, datt d'30 Sekonnen Intervalle vu Brubeck net synchroniséiert sinn, an am Moment vun engem Crash gëtt ee vun hinnen net iwwerschriwwen. Wann den zweeten Server ufänkt, geschitt datselwecht. Ganz tolerabel, awer ech wëll besser! De Problem vun der Skalierbarkeet ass och net fortgaang. All Metriken "fléien" nach ëmmer op een eenzegen Server, an dofir si mir limitéiert op déiselwecht 2-4 Milliounen MPS, jee no dem Netzwierkniveau.

Wann Dir e bëssen iwwer de Problem denkt a gläichzäiteg Schnéi mat enger Schaufel gräift, da kënnt déi folgend offensichtlech Iddi am Kapp: Dir braucht e Statsd deen am verdeelt Modus funktionéiere kann. Dat ass, een deen d'Synchroniséierung tëscht Noden an der Zäit a Metrik implementéiert. "Natierlech existéiert esou eng Léisung méiglecherweis scho," hu mir gesot a sinn op Google gaang .... A si hunn näischt fonnt. Nodeems Dir d'Dokumentatioun fir verschidde Statistiken duerchgaang ass (https://github.com/etsy/statsd/wiki#server-implementations vum 11.12.2017. Dezember XNUMX), hu mir absolut näischt fonnt. Anscheinend hunn weder d'Entwéckler nach d'Benotzer vun dëse Léisungen nach SOU vill Metriken begéint, soss géifen se definitiv mat eppes kommen.

An dann hu mir eis un d'"Spillsaach" Statsd - bioyino erënnert, déi um Just for Fun Hackathon geschriwwe gouf (den Numm vum Projet gouf vum Skript virum Ufank vum Hackathon generéiert) a realiséiert datt mir dréngend eis eege Statistiken brauchen. Fir wat?

  • well et ze wéineg statsd Klonen op der Welt sinn,
  • well et méiglech ass déi gewënscht oder no un der gewënschter Feeler Toleranz a Skalierbarkeet ze bidden (inklusiv Synchroniséierung vun aggregéierte Metriken tëscht Serveren an d'Léisung vum Problem vu Konflikter ze schécken),
  • well et méiglech ass Metriken méi genee ze berechnen wéi Brubeck mécht,
  • well Dir kënnt selwer méi detailléiert Statistike sammelen, déi brubeck eis praktesch net geliwwert huet,
  • well ech hat eng Chance meng eegen hyperperformance verdeelt Skala Labo Applikatioun ze programméieren, déi wäert net komplett d'Architektur vun engem aneren ähnlechen hyperfor widderhuelen ... gutt, dat ass et.

Op wat ze schreiwen? Natierlech, zu Rust. Firwat?

  • well et schonn eng Prototyp Léisung gouf,
  • well den Auteur vum Artikel deemools Rust scho kannt huet an et gär huet eppes dran ze schreiwen fir d'Produktioun mat der Geleeënheet et an Open-Source ze setzen,
  • well Sprooche mat GC fir eis net gëeegent sinn wéinst der Natur vum kritt Traffic (bal Echtzäit) a GC Pausen si praktesch inakzeptabel,
  • well Dir braucht maximal Leeschtung vergläichbar mat C
  • well Rust stellt eis mat ängschtlech concurrency, a wa mir ugefaang et an C / C ze schreiwen ++, mir hätten an nach méi Schwachstelle raked, Puffer Iwwerschwemmungen, Course Konditiounen an aner grujeleg Wierder wéi Brubeck.

Et gouf och en Argument géint Rust. D'Firma hat keng Erfarung fir Projeten am Rust ze kreéieren, an elo plangen mir et och net am Haaptprojet ze benotzen. Dofir gouf et sérieux Ängscht, datt näischt géif klappen, mä mir hu beschloss eng Chance ze huelen a probéiert.

Zäit ass vergaang ...

Endlech, no e puer gescheitert Versich, war déi éischt Aarbecht Versioun prett. Wat ass geschitt? Dëst ass wat geschitt ass.

Bioyino - verdeelt, skalierbar Metrikaggregator

All Node kritt säin eegene Set vu Metriken a accumuléiert se, an aggregéiert keng Metriken fir déi Aarte wou hire komplette Set fir endgülteg Aggregatioun erfuerderlech ass. D'Node si matenee verbonne mat enger Aart vu verdeelt Sperrprotokoll, wat Iech erlaabt ënnert hinnen deen eenzegen ze wielen (hei hu mir gekrasch) dee wäert ass, Metriken un de Grousse ze schécken. Dëse Problem gëtt am Moment geléist duerch Consul, mä an Zukunft verlängeren den Auteur seng Ambitiounen op eege Ëmsetzung Raft, wou dee wäertvollste wäert natierlech de Konsens Leader Node sinn. Zousätzlech zum Konsens schécken Noden zimlech dacks (eemol pro Sekonn als Standard) un hir Noperen déi Deeler vu viraggregéierte Metriken, déi se et fäerdeg bruecht hunn an där Sekonn ze sammelen. Et stellt sech eraus datt d'Skaléierung an d'Fehlertoleranz bewahrt sinn - all Node hält nach ëmmer e ganze Set vu Metriken, awer d'Metriken ginn scho aggregéiert geschéckt, iwwer TCP an encodéiert an e binäre Protokoll, sou datt d'Duplikatiounskäschte wesentlech reduzéiert ginn am Verglach zum UDP. Trotz der zimlech grousser Zuel vun erakommen Metriken, Akkumulation erfuerdert ganz wéineg Erënnerung an nach manner CPU. Fir eis héich kompriméierbar Mertik ass dëst nëmmen e puer Zénger vu Megabytes vun Daten. Als zousätzleche Bonus kréie mir keng onnéideg Datenrewrites am Graphite, sou wéi de Fall mat Burbeck.

UDP Päck mat Metriken sinn onbalancéiert tëscht Noden op Netzwierkausrüstung duerch eng einfach Round Robin. Natierlech parséiert d'Netzwierk Hardware net den Inhalt vu Paketen a kann dofir vill méi wéi 4M Pakete pro Sekonn zéien, fir net Metriken ze ernimmen iwwer déi et guer näischt weess. Wa mir berücksichtegen datt d'Metriken net eng Kéier an all Paket kommen, da gesi mir keng Leeschtungsproblemer op dëser Plaz vir. Wann e Server Crash, de Reseau Apparat séier (bannent 1-2 Sekonnen) detektéieren dëser Tatsaach an läscht der ofgebrach Server aus Rotatioun. Als Resultat vun dësem kënne passiv (dh net-Leader) Knäppercher praktesch ausschalten an ausgeschalt ginn ouni Zeechnungen op den Charts ze bemierken. De Maximum dee mir verléieren ass Deel vun de Metriken déi an der leschter Sekonn erakomm sinn. E plötzlechen Verloscht / Shutdown / Switch vun engem Leader wäert nach ëmmer eng kleng Anomalie kreéieren (den 30 Sekonnen Intervall ass nach ëmmer aus der Synchroniséierung), awer wann et Kommunikatioun tëscht Noden ass, kënnen dës Probleemer miniméiert ginn, zum Beispill andeems Dir Synchroniséierungspäck ausschéckt .

E bëssen iwwer d'intern Struktur. D'Applikatioun ass natierlech multithreaded, awer d'Threadingarchitektur ass anescht wéi déi zu Brubeck benotzt. D'Threads zu Brubeck sinn déiselwecht - jidderee vun hinnen ass verantwortlech fir d'Informatiounssammlung an d'Aggregatioun. Am Bioyino sinn d'Aarbechter an zwou Gruppen opgedeelt: déi verantwortlech fir d'Netzwierk an déi verantwortlech fir d'Aggregatioun. Dës Divisioun erlaabt Iech d'Applikatioun méi flexibel ze verwalten ofhängeg vun der Aart vu Metriken: wou intensiv Aggregatioun erfuerderlech ass, kënnt Dir Aggregatoren addéieren, wou et vill Netzverkéier ass, kënnt Dir d'Zuel vun de Netzwierkfloss addéieren. Am Moment schaffen mir op eise Serveren an 8 Netzwierker a 4 Aggregatiounsfloss.

De zielen (verantwortlech fir d'Aggregatioun) Deel ass zimmlech langweileg. Bufferen, déi duerch Netzwierkfloss gefëllt sinn, ginn ënner Zielfréi verdeelt, wou se duerno parséiert a aggregéiert ginn. Op Ufro gi Metriken fir d'Schécken an aner Noden uginn. All dëst, inklusiv d'Schécken vun Daten tëscht Noden a mam Consul schaffen, gëtt asynchron duerchgefouert, am Kader lafen tokio.

Vill méi Probleemer wärend der Entwécklung goufen verursaacht vum Netzdeel verantwortlech fir Metriken ze kréien. D'Haaptziel fir d'Netzflëss an getrennten Entitéiten ze trennen war de Wonsch d'Zäit ze reduzéieren déi e Floss verbréngt Net fir Daten aus der Socket ze liesen. Optiounen, déi asynchron UDP a regelméisseg Recvmsg benotzen, sinn séier verschwonnen: déi éischt verbraucht ze vill Benotzerraum CPU fir Eventveraarbechtung, déi zweet erfuerdert ze vill Kontextschalter. Dofir gëtt et elo benotzt recvmmsg mat grousse Puffer (an Puffer, Hären Offizéier, si näischt fir Iech!). Ënnerstëtzung fir regelméisseg UDP ass fir liicht Fäll reservéiert wou recvmmsg net néideg ass. Am Multimessage Modus ass et méiglech d'Haaptsach z'erreechen: déi grouss Majoritéit vun der Zäit, de Netzgewënn raket d'OS-Schlaang - liest Daten aus der Socket an iwwerdréit se an de Userspace-Puffer, wiesselt nëmmen heiansdo op de gefëllte Puffer ze ginn aggregators. D'Schlaang an der Socket akkumuléiert praktesch net, d'Zuel vun de gefallene Päckchen praktesch net wuessen.

Remarque

An de Standardastellungen ass d'Puffergréisst zimmlech grouss gesat. Wann Dir op eemol décidéiert de Server selwer ze probéieren, kënnt Dir op d'Tatsaach begéinen datt se no enger klenger Zuel vu Metriken geschéckt ginn, se net a Graphite ukommen, bleiwen am Netzstroumbuffer. Fir mat enger klenger Zuel vu Metriken ze schaffen, musst Dir Bufsize an Task-Quee-Gréisst op méi kleng Wäerter an der Configuratioun setzen.

Endlech e puer Charts fir Chartliebhaber.

Statistiken iwwer d'Zuel vun erakommen Metriken fir all Server: méi wéi 2 Millioune MPS.

Bioyino - verdeelt, skalierbar Metrikaggregator

Ee vun den Noden auszeschalten an erakommen Metriken ëmverdeelen.

Bioyino - verdeelt, skalierbar Metrikaggregator

Statistiken iwwer erausginn Metriken: nëmmen een Node schéckt ëmmer - de Razzia Chef.

Bioyino - verdeelt, skalierbar Metrikaggregator

Statistike vun der Operatioun vun all Node, berücksichtegt Feeler a verschiddene Systemmoduler.

Bioyino - verdeelt, skalierbar Metrikaggregator

Detailer vun erakommen Metriken (metresch Nimm si verstoppt).

Bioyino - verdeelt, skalierbar Metrikaggregator

Wat plangen mir dann mat all deem ze maachen? Natierlech, Code schreiwen, Verdammt ...! De Projet war ursprénglech geplangt fir Open-Source ze sinn a wäert dat während hirem Liewen bleiwen. Eis direkt Pläng enthalen de Wiessel op eis eege Versioun vu Raft, d'Verännerung vum Peer-Protokoll op e méi portablen, d'Aféierung vun zousätzlech intern Statistiken, nei Aarte vu Metriken, Bugfixes an aner Verbesserungen.

Natierlech ass jidderee wëllkomm fir bei der Entwécklung vum Projet ze hëllefen: PR schafen, Themen, wa méiglech reagéiere mir, verbesseren, etc.

Mat deem gesot, dat ass alles Leit, kaaft eis Elefanten!



Source: will.com

Setzt e Commentaire