Svo þú safnar mælingum. Eins og við erum. Við söfnum líka mælingum. Auðvitað, nauðsynlegt fyrir fyrirtæki. Í dag munum við tala um fyrsta hlekkinn á vöktunarkerfi okkar - statsd-samhæfan söfnunarþjón
Frá fyrri greinum okkar (
Krafa 1. Github, verktaki verkefnisins, hætti að styðja það: birti plástra og lagfæringar, samþykkti okkar og (ekki aðeins okkar) PR. Undanfarna mánuði (einhvers staðar frá febrúar-mars 2018) hefur starfsemin hafist á ný en þar áður var næstum 2 ár af algjörri ró. Auk þess er verið að þróa verkefnið
Krafa 2. Nákvæmni útreikninga. Brubeck safnar samtals 65536 gildum fyrir samansafn. Í okkar tilviki, fyrir suma mælikvarða, á söfnunartímabilinu (30 sekúndur), gætu miklu fleiri gildi borist (1 þegar mest var). Sem afleiðing af þessari sýnatöku virðast hámarks- og lágmarksgildin gagnslaus. Til dæmis, svona:
Eins og það var
Hvernig það hefði átt að vera
Af sömu ástæðu eru upphæðir almennt rangt reiknaðar. Bættu hér við villu með 32-bita flotflæði, sem venjulega sendir þjóninn í aðskilgreina þegar hann fær að því er virðist saklausa mælikvarða, og allt verður frábært. Villan, við the vegur, hefur ekki verið lagaður.
Og, að lokum, Krafa X. Þegar þetta er skrifað erum við tilbúin að kynna það fyrir öllum 14 meira eða minna starfandi tölfræðiútfærslum sem við gátum fundið. Við skulum ímynda okkur að einhver einstök innviði hafi stækkað svo mikið að það er ekki lengur nóg að samþykkja 4 milljónir MPS. Eða jafnvel þótt það hafi ekki stækkað enn, en mælikvarðar eru nú þegar svo mikilvægir fyrir þig að jafnvel stuttar, 2-3 mínútur í töflunum geta þegar orðið mikilvægar og valdið óyfirstíganlegu þunglyndi meðal stjórnenda. Þar sem að meðhöndla þunglyndi er vanþakklátt verkefni er þörf á tæknilegum lausnum.
Í fyrsta lagi, bilanaþol, svo að skyndilegt vandamál á þjóninum valdi ekki geðrænum uppvakningaheimild á skrifstofunni. Í öðru lagi, skala til að geta tekið við meira en 4 milljón MPS, án þess að grafa djúpt í Linux netstafla og stækka rólega „í breidd“ í nauðsynlega stærð.
Þar sem við höfðum pláss fyrir mælikvarða ákváðum við að byrja með bilanaþol. „UM! Bilanaþol! Það er einfalt, við getum gert það,“ hugsuðum við og settum af stað 2 netþjóna og bjuggum til eintak af brubeck á hverjum. Til að gera þetta þurftum við að afrita umferð með mæligildum á báða netþjóna og jafnvel skrifa fyrir þetta
Ef þú hugsar aðeins um vandamálið og á sama tíma grafir upp snjó með skóflu, þá gæti eftirfarandi augljós hugmynd komið upp í hugann: þú þarft statsd sem getur virkað í dreifðri stillingu. Það er, einn sem útfærir samstillingu milli hnúta í tíma og mæligildum. „Auðvitað er slík lausn líklega þegar til,“ sögðum við og fórum á Google…. Og þeir fundu ekkert. Eftir að hafa farið í gegnum skjölin fyrir mismunandi tölfræði (
Og svo minntumst við á „leikfang“ statsd - bioyino, sem var skrifað á Just for Fun hackaþoninu (nafn verkefnisins var búið til af handritinu áður en hackathonið hófst) og komumst að því að okkur vantaði okkar eigin tölfræði brýn. Til hvers?
- vegna þess að það eru of fáir statd klónar í heiminum,
- vegna þess að það er hægt að veita æskilegt eða nálægt æskilegu bilanaþoli og sveigjanleika (þar á meðal að samstilla samanlagðar mæligildi milli netþjóna og leysa vandamálið við að senda átök),
- vegna þess að það er hægt að reikna mælikvarða nákvæmari en Brubeck gerir,
- vegna þess að þú getur safnað ítarlegri tölfræði sjálfur, sem Brubeck gaf okkur nánast ekki,
- vegna þess að ég hafði tækifæri til að forrita mína eigin ofurframmistöðu dreifða mælikvarða, sem mun ekki alveg endurtaka arkitektúr annarrar svipaðrar hyperfor... jæja, það er það.
Hvað á að skrifa á? Auðvitað í Rust. Hvers vegna?
- vegna þess að það var þegar til frumgerð lausn,
- vegna þess að höfundur greinarinnar þekkti Rust þegar á þeim tíma og var fús til að skrifa eitthvað í hana til framleiðslu með tækifæri til að setja það í opinn uppspretta,
- vegna þess að tungumál með GC henta okkur ekki vegna eðlis móttekinnar umferðar (næstum rauntíma) og GC hlé eru nánast óviðunandi,
- vegna þess að þú þarft hámarksafköst sambærileg við C
- vegna þess að Rust veitir okkur óttalausa samveru, og ef við hefðum byrjað að skrifa það í C/C++, þá hefðum við rakað inn enn fleiri veikleika, buffer overflows, keppnisaðstæður og önnur skelfileg orð en brubeck.
Það voru líka rök gegn Rust. Fyrirtækið hafði enga reynslu af því að búa til verkefni í Rust og nú ætlum við heldur ekki að nota það í aðalverkefninu. Það var því alvarlegur ótti um að ekkert myndi ganga upp en við ákváðum að taka sénsinn og reyndum.
Tíminn leið...
Að lokum, eftir nokkrar misheppnaðar tilraunir, var fyrsta virka útgáfan tilbúin. Hvað gerðist? Þetta er það sem gerðist.
Hver hnút fær sitt eigið mælikvarða og safnar þeim saman, og safnar ekki saman mæligildum fyrir þær gerðir þar sem þarf fullt sett þeirra fyrir endanlega samansöfnun. Hnútarnir eru tengdir hver öðrum með einhvers konar dreifðri læsasamskiptareglu, sem gerir þér kleift að velja meðal þeirra þann eina (hér grétum við) sem er verðugt að senda mælikvarða til Stóra. Nú er verið að leysa þetta vandamál af
UDP pakkar með mæligildum eru í ójafnvægi á milli hnúta á netbúnaði í gegnum einfaldan Round Robin. Auðvitað greinir netvélbúnaðurinn ekki innihald pakka og getur því dregið miklu meira en 4M pakka á sekúndu, svo ekki sé minnst á mælikvarða sem hann veit ekkert um. Ef við tökum með í reikninginn að mæligildin koma ekki ein í einu í hverjum pakka, þá sjáum við ekki frammistöðuvandamál á þessum stað. Ef netþjónn hrynur skynjar nettækið fljótt (innan 1-2 sekúndna) þessa staðreynd og fjarlægir netþjóninn sem hrundi úr snúningi. Sem afleiðing af þessu er hægt að kveikja og slökkva á óvirkum hnútum (þ. Hámarkið sem við töpum er hluti af mælingunum sem komu inn á síðustu sekúndu. Skyndilegt tap/lokun/skipti á leiðara mun samt skapa minniháttar frávik (30 sekúndna bilið er enn ósamstillt), en ef samskipti eru á milli hnúta er hægt að lágmarka þessi vandamál, til dæmis með því að senda út samstillingarpakka .
Smá um innri uppbyggingu. Forritið er að sjálfsögðu fjölþráður en þráðararkitektúrinn er öðruvísi en notaður er í brubeck. Þræðirnir í brubeck eru þeir sömu - hver þeirra ber ábyrgð á bæði upplýsingasöfnun og samansöfnun. Í bioyino er starfsmönnum skipt í tvo hópa: þá sem bera ábyrgð á netinu og þá sem bera ábyrgð á samsöfnun. Þessi skipting gerir þér kleift að stjórna forritinu á sveigjanlegri hátt eftir tegund mæligilda: þar sem mikil samsöfnun er krafist geturðu bætt við söfnun, þar sem netumferð er mikil, geturðu bætt við fjölda netflæðis. Í augnablikinu, á netþjónum okkar, vinnum við í 8 net- og 4 söfnunarflæði.
Talningarhlutinn (ábyrgur fyrir söfnun) er frekar leiðinlegur. Stuðlarum sem fylltir eru af netflæði er dreift á talningarflæði, þar sem þeir eru síðan flokkaðir og teknir saman. Ef óskað er eftir, eru gefin mæligildi fyrir sendingu til annarra hnúta. Allt þetta, þar með talið að senda gögn á milli hnúta og vinna með Consul, er framkvæmt ósamstillt og keyrt á rammanum
Miklu fleiri vandamál við þróun voru af völdum nethlutans sem ber ábyrgð á móttöku mæligilda. Meginmarkmið þess að aðgreina netflæði í aðskildar einingar var viljinn til að draga úr þeim tíma sem flæði eyðir ekki til að lesa gögn úr innstungunni. Valkostir sem nota ósamstillta UDP og venjulegt recvmsg hurfu fljótt: sá fyrsti eyðir of miklu notendarými CPU fyrir atburðavinnslu, sá seinni krefst of margra samhengisrofa. Þess vegna er það nú notað
Athugið
Í sjálfgefnum stillingum er biðminni stillt á að vera frekar stór. Ef þú ákveður skyndilega að prófa netþjóninn sjálfur gætirðu lent í þeirri staðreynd að eftir að hafa sent lítinn fjölda mælikvarða, munu þeir ekki berast í Graphite, sem eru eftir í netstraumsbuffi. Til að vinna með lítinn fjölda mæligilda þarftu að stilla bufsize og task-queue-stærð á minni gildi í stillingunni.
Að lokum, nokkur töflur fyrir kortaunnendur.
Tölfræði um fjölda komandi mæligilda fyrir hvern netþjón: meira en 2 milljónir MPS.
Slökkva á einum af hnútunum og endurdreifa mæligildum fyrir komandi.
Tölfræði um mælikvarða á útleið: aðeins einn hnútur sendir alltaf - árásarstjórinn.
Tölfræði um rekstur hvers hnúts, að teknu tilliti til villna í ýmsum kerfiseiningum.
Upplýsingar um mæligildi sem koma inn (mælingarheiti eru falin).
Hvað ætlum við að gera við þetta allt næst? Auðvitað, skrifaðu kóða, fjandinn...! Upphaflega var áætlað að verkefnið væri opið uppspretta og verður það áfram alla ævi. Strax áætlanir okkar fela í sér að skipta yfir í okkar eigin útgáfu af Raft, breyta jafningjasamskiptareglunum í færanlegri, kynna frekari innri tölfræði, nýjar gerðir mæligilda, villuleiðréttingar og aðrar endurbætur.
Að sjálfsögðu eru allir velkomnir að hjálpa til við þróun verkefnisins: búa til PR, málefni, ef mögulegt er munum við bregðast við, bæta o.s.frv.
Með því að segja, það er allt gott fólk, keyptu fílana okkar!
Heimild: www.habr.com