Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Tātad jÅ«s apkopojat metriku. Kādi esam. Mēs arÄ« apkopojam metriku. Protams, nepiecieÅ”ams biznesam. Å odien mēs runāsim par mÅ«su uzraudzÄ«bas sistēmas paÅ”u pirmo saiti - ar statsd saderÄ«gu apkopoÅ”anas serveri bioyino, kāpēc mēs to rakstÄ«jām un kāpēc mēs atteicāmies no brubeck.

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

No mÅ«su iepriekŔējiem rakstiem (1, 2) varat uzzināt, ka lÄ«dz kādu laiku mēs vācām atzÄ«mes, izmantojot brubeks. Tas ir rakstÄ«ts C valodā. No koda viedokļa tas ir tikpat vienkārÅ”s kā spraudnis (tas ir svarÄ«gi, ja vēlaties sniegt ieguldÄ«jumu), un, pats galvenais, tas apstrādā mÅ«su 2 miljonu metrikas sekundē (MPS) apjomu. bez problēmām. Dokumentācijā ar zvaigznÄ«ti norādÄ«ts atbalsts 4 miljoniem MPS. Tas nozÄ«mē, ka jÅ«s saņemsit norādÄ«to skaitli, ja pareizi konfigurēsit tÄ«klu operētājsistēmā Linux. (Mēs nezinām, cik MPS varat iegÅ«t, ja atstājat tÄ«klu tādu, kāds tas ir). Neskatoties uz Ŕīm priekÅ”rocÄ«bām, mums bija vairākas nopietnas sÅ«dzÄ«bas par brubeku.

1. pretenzija. Github, projekta izstrādātājs, pārtrauca to atbalstÄ«t: publicēt ielāpus un labojumus, pieņemt mÅ«sējos un (ne tikai mÅ«su) PR. Pēdējos mēneÅ”os (kaut kur no 2018. gada februāra-marta) darbÄ«ba ir atsākusies, bet pirms tam gandrÄ«z 2 gadi pilnÄ«gs miers. Turklāt projekts tiek izstrādāts iekŔējām Gihub vajadzÄ«bām, kas var kļūt par nopietnu Ŕķērsli jaunu funkciju ievieÅ”anai.

2. pretenzija. Aprēķinu precizitāte. Brubeck apkopoÅ”anai kopumā apkopo 65536 30 vērtÄ«bas. MÅ«su gadÄ«jumā dažiem rādÄ«tājiem apkopoÅ”anas periodā (1 sekundes) var iegÅ«t daudz vairāk vērtÄ«bu (527 392 XNUMX maksimumā). Å Ä«s paraugu ņemÅ”anas rezultātā maksimālās un minimālās vērtÄ«bas Ŕķiet bezjēdzÄ«gas. Piemēram, Ŕādi:

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs
Kā tas bija

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs
Kā tam vajadzēja būt

Tā paÅ”a iemesla dēļ summas parasti tiek aprēķinātas nepareizi. Pievienojiet Å”eit kļūdu ar 32 bitu peldoÅ”o pārplÅ«di, kas parasti nosÅ«ta serveri uz segfault, saņemot Ŕķietami nevainÄ«gu metriku, un viss kļūst lieliski. Kļūda, starp citu, nav novērsta.

Un, visbeidzot, PieprasÄ«t X. RakstÄ«Å”anas laikā mēs esam gatavi to prezentēt visām 14 vairāk vai mazāk strādājoÅ”ajām statsd implementācijām, kuras mums izdevās atrast. Iedomāsimies, ka kāda atseviŔķa infrastruktÅ«ra ir tik ļoti izaugusi, ka ar 4 miljonu MPS pieņemÅ”anu vairs nepietiek. Vai arÄ« tad, ja tas vēl nav pieaudzis, bet rādÄ«tāji jums jau ir tik svarÄ«gi, ka pat Ä«si, 2-3 minÅ«Å”u kritumi topos jau var kļūt kritiski un izraisÄ«t nepārvaramas depresijas lēkmes vadÄ«tāju vidÅ«. Tā kā depresijas ārstÄ“Å”ana ir nepateicÄ«gs uzdevums, ir nepiecieÅ”ami tehniski risinājumi.

Pirmkārt, kļūdu tolerance, lai pēkŔņa servera problēma neizraisÄ«tu psihiatrisku zombiju apokalipsi birojā. Otrkārt, mērogoÅ”ana, lai varētu pieņemt vairāk nekā 4 miljonus MPS, neiedziļinoties Linux tÄ«kla stekā un mierÄ«gi augot ā€œplatumāā€ lÄ«dz vajadzÄ«gajam izmēram.

Tā kā mums bija vietas mērogoÅ”ana, mēs nolēmām sākt ar kļūdu toleranci. "PAR! Kļūdu tolerance! Tas ir vienkārÅ”i, mēs to varam,ā€ mēs nodomājām un iedarbinājām divus serverus, katrā izveidojot brubeck kopiju. Lai to izdarÄ«tu, mums bija jākopē trafiks ar metriku uz abiem serveriem un pat jāraksta maza lietderÄ«ba. Mēs ar to atrisinājām kļūdu tolerances problēmu, bet... ne pārāk labi. Sākumā viss Ŕķita lieliski: katrs brubeks savāc savu apkopojuma versiju, ieraksta datus Graphite reizi 30 sekundēs, pārrakstot veco intervālu (tas tiek darÄ«ts Graphite pusē). Ja kāds serveris pēkŔņi neizdodas, mums vienmēr ir otrs ar savu apkopoto datu kopiju. Bet Å”eit ir problēma: ja serveris neizdodas, grafikos parādās ā€œzāģisā€. Tas ir saistÄ«ts ar faktu, ka brubeka 30 sekunžu intervāli netiek sinhronizēti, un avārijas brÄ«dÄ« viens no tiem netiek pārrakstÄ«ts. Kad tiek startēts otrais serveris, notiek tas pats. Diezgan pacieÅ”ami, bet gribas labāk! ArÄ« mērogojamÄ«bas problēma nav pazudusi. Visi rādÄ«tāji joprojām ā€œlidoā€ uz vienu serveri, un tāpēc mēs esam ierobežoti ar tiem paÅ”iem 2ā€“4 miljoniem MPS atkarÄ«bā no tÄ«kla lÄ«meņa.

Ja jÅ«s nedaudz padomājat par problēmu un vienlaikus ar lāpstu izrok sniegu, jums var ienākt prātā Ŕāda acÄ«mredzama ideja: jums ir nepiecieÅ”ams statsd, kas var darboties sadalÄ«tā režīmā. Tas ir, tāds, kas ievieÅ” sinhronizāciju starp mezgliem laikā un metrikā. ā€œProtams, Ŕāds risinājums, iespējams, jau pastāv,ā€ mēs teicām un devāmies uz Googleā€¦. Un viņi neko neatrada. Pēc dažādu statistikas datu dokumentācijas izskatÄ«Å”anas (https://github.com/etsy/statsd/wiki#server-implementations uz 11.12.2017. gada XNUMX. decembri), mēs absolÅ«ti neko neatradām. AcÄ«mredzot ne Å”o risinājumu izstrādātāji, ne lietotāji vēl nav saskāruÅ”ies ar TIK daudz metriku, citādi noteikti kaut ko izdomātu.

Un tad atcerējāmies par ā€œrotaļlietuā€ statsd - bioyino, kas tika rakstÄ«ts Just for Fun hakatonā (projekta nosaukumu Ä£enerēja scenārijs pirms hakatona sākuma) un sapratām, ka mums steidzami ir nepiecieÅ”ams savs statsd. Par ko?

  • jo pasaulē ir pārāk maz statsd klonu,
  • jo ir iespējams nodroÅ”ināt vēlamo vai tuvu vēlamajai kļūdu toleranci un mērogojamÄ«bu (ieskaitot apkopoto metrikas sinhronizāciju starp serveriem un sÅ«tÄ«Å”anas konfliktu risināŔanu),
  • jo ir iespējams aprēķināt metriku precÄ«zāk nekā Brubeck,
  • jo jÅ«s pats varat savākt detalizētāku statistiku, ko brubeks mums praktiski nesniedza,
  • jo man bija iespēja ieprogrammēt savu hyperperformance distributed scale lab lietojumprogrammu, kas pilnÄ«bā neatkārtos cita lÄ«dzÄ«ga hiperfora arhitektÅ«ru... nu, lÅ«k.

Uz ko rakstīt? Protams, Rustā. Kāpēc?

  • jo jau bija risinājuma prototips,
  • jo raksta autors jau toreiz pazina Rustu un ļoti gribēja tajā kaut ko ierakstÄ«t ražoÅ”anai ar iespēju ievietot to atvērtā pirmkoda formātā,
  • jo valodas ar GC mums nav piemērotas saņemtās trafika rakstura dēļ (gandrÄ«z reāllaikā), un GC pauzes ir praktiski nepieņemamas,
  • jo jums ir nepiecieÅ”ama maksimāla veiktspēja, kas ir salÄ«dzināma ar C
  • jo Rust nodroÅ”ina mums bezbailÄ«gu vienlaicÄ«gumu, un, ja mēs to sāktu rakstÄ«t C/C++, mēs bÅ«tu iekrājuÅ”i vēl vairāk ievainojamÄ«bu, bufera pārpildes, sacensÄ«bu apstākļus un citus biedējoÅ”us vārdus nekā brubeck.

Bija arÄ« arguments pret Rustu. Uzņēmumam nebija pieredzes projektu veidoÅ”anā Rustā, un tagad mēs arÄ« neplānojam to izmantot galvenajā projektā. Tāpēc bija nopietnas bažas, ka nekas neizdosies, taču nolēmām riskēt un mēģinājām.

Laiks pagāja...

Beidzot pēc vairākiem neveiksmīgiem mēģinājumiem pirmā darba versija bija gatava. Kas notika? Tā tas notika.

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Katrs mezgls saņem savu metrikas kopu un uzkrāj tos, kā arÄ« neapkopo metriku tiem veidiem, kuru pilna kopa ir nepiecieÅ”ama galÄ«gai apkopoÅ”anai. Mezgli ir savienoti viens ar otru ar kaut kādu izplatÄ«tu bloÄ·Ä“Å”anas protokolu, kas ļauj no tiem atlasÄ«t vienÄ«go (Å”eit mēs raudājām), kas ir cienÄ«gs sÅ«tÄ«t metriku Lielajam. Å o problēmu paÅ”laik risina Konsuls, bet nākotnē autora ambÄ«cijas sniedzas lÄ«dz paÅ”u Ä«stenoÅ”ana Plosts, kur cienÄ«gākais, protams, bÅ«s konsensa lÄ«dera mezgls. Papildus vienprātÄ«bai mezgli diezgan bieži (pēc noklusējuma reizi sekundē) nosÅ«ta saviem kaimiņiem tās iepriekÅ” apkopotās metrikas daļas, kuras viņiem izdevās savākt Å”ajā sekundē. Izrādās, ka tiek saglabāta mērogoÅ”ana un kļūdu tolerance - katrā mezglā joprojām ir pilns metrikas komplekts, bet metrika tiek nosÅ«tÄ«ta jau apkopota, izmantojot TCP un iekodēta binārajā protokolā, tāpēc dublÄ“Å”anas izmaksas ir ievērojami samazinātas salÄ«dzinājumā ar UDP. Neskatoties uz diezgan lielo ienākoÅ”o rādÄ«tāju skaitu, uzkrāŔanai ir nepiecieÅ”ams ļoti maz atmiņas un vēl mazāk CPU. MÅ«su ļoti saspiežamajiem mertics tas ir tikai daži desmiti megabaitu datu. Kā papildu bonuss mēs nesaņemam nevajadzÄ«gu datu pārrakstÄ«Å”anu programmā Graphite, kā tas bija Burbeck gadÄ«jumā.

UDP paketes ar metriku tiek nelÄ«dzsvarotas starp tÄ«kla aprÄ«kojuma mezgliem, izmantojot vienkārÅ”u Round Robin. Protams, tÄ«kla aparatÅ«ra neparsē pakeÅ”u saturu un tāpēc var izvilkt daudz vairāk par 4M pakeÅ”u sekundē, nemaz nerunājot par rādÄ«tājiem, par kuriem tā vispār neko nezina. Ja ņemam vērā, ka katrā paketē rādÄ«tāji nenāk pa vienam, tad Å”ajā vietā nekādas veiktspējas problēmas neparedzam. Ja serveris avarē, tÄ«kla ierÄ«ce ātri (1-2 sekunžu laikā) konstatē Å”o faktu un noņem avarējuÅ”o serveri no rotācijas. Tā rezultātā pasÄ«vos (t.i., ne-lÄ«dera) mezglus var ieslēgt un izslēgt praktiski, nepamanot diagrammu samazinājumus. Maksimālais, ko mēs zaudējam, ir daļa no rādÄ«tājiem, kas tika ievadÄ«ti pēdējā sekundē. PēkŔņs lÄ«dera zaudējums/izslēgÅ”ana/pārslēgÅ”ana joprojām radÄ«s nelielu anomāliju (30 sekunžu intervāls joprojām nav sinhronizēts), taču, ja starp mezgliem notiek saziņa, Ŕīs problēmas var samazināt, piemēram, izsÅ«tot sinhronizācijas paketes. .

Mazliet par iekŔējo struktÅ«ru. Lietojumprogramma, protams, ir daudzpavedienu, taču vÄ«tņu arhitektÅ«ra atŔķiras no brubeckā izmantotās. Pavedieni brubekā ir vienādi ā€“ katrs atbild gan par informācijas vākÅ”anu, gan apkopoÅ”anu. Bioyino darba ņēmēji tiek iedalÄ«ti divās grupās: tie, kas ir atbildÄ«gi par tÄ«klu, un tie, kas ir atbildÄ«gi par apkopoÅ”anu. Å is sadalÄ«jums ļauj elastÄ«gāk pārvaldÄ«t aplikāciju atkarÄ«bā no metrikas veida: kur nepiecieÅ”ama intensÄ«va apkopoÅ”ana, var pievienot agregatorus, kur ir liela tÄ«kla trafika, var pievienot tÄ«kla plÅ«smu skaitu. Å obrÄ«d uz mÅ«su serveriem strādājam 8 tÄ«kla un 4 agregācijas plÅ«smās.

SkaitÄ«Å”anas daļa (atbildÄ«ga par apkopoÅ”anu) ir diezgan garlaicÄ«ga. TÄ«kla plÅ«smām aizpildÄ«tie buferi tiek sadalÄ«ti starp skaitÄ«Å”anas plÅ«smām, kur tās pēc tam tiek parsētas un apkopotas. Pēc pieprasÄ«juma tiek dota metrika nosÅ«tÄ«Å”anai uz citiem mezgliem. Tas viss, ieskaitot datu sÅ«tÄ«Å”anu starp mezgliem un darbu ar Consul, tiek veikts asinhroni, darbojas sistēmā Tokija.

Daudz vairāk problēmu izstrādes laikā radÄ«ja tÄ«kla daļa, kas ir atbildÄ«ga par metriku saņemÅ”anu. Galvenais mērÄ·is, sadalot tÄ«kla plÅ«smas atseviŔķās vienÄ«bās, bija vēlme samazināt plÅ«smas pavadÄ«to laiku nē lai nolasÄ«tu datus no ligzdas. Opcijas, kas izmanto asinhrono UDP un parasto recvmsg, ātri pazuda: pirmais patērē pārāk daudz lietotāja vietas CPU notikumu apstrādei, otrais prasa pārāk daudz konteksta slēdžu. Tāpēc tagad tas tiek izmantots recvmmsg ar lieliem buferiem (un buferi, kungi virsnieki, jums nav nekas!). Parastā UDP atbalsts ir paredzēts vieglajiem gadÄ«jumiem, kad recvmmsg nav nepiecieÅ”ams. Vairāku ziņojumu režīmā ir iespējams sasniegt galveno: lielāko daļu laika tÄ«kla pavediens grābj OS rindu - nolasa datus no ligzdas un pārsÅ«ta tos uz userspace buferi, tikai reizēm pārslēdzoties uz aizpildÄ«tā bufera nodoÅ”anu agregatori. Rinda ligzdā praktiski neuzkrājas, izmesto pakeÅ”u skaits praktiski nepieaug.

Piezīme

Noklusējuma iestatÄ«jumos bufera izmērs ir iestatÄ«ts diezgan liels. Ja pēkŔņi nolemjat izmēģināt serveri pats, jÅ«s varat saskarties ar faktu, ka pēc neliela skaita metrikas nosÅ«tÄ«Å”anas tie nenonāks Graphite, paliekot tÄ«kla straumes buferÄ«. Lai strādātu ar nelielu skaitu metrikas, konfigurācijā ir jāiestata bufsize un uzdevumu rindas lielums uz mazākām vērtÄ«bām.

Visbeidzot, dažas diagrammas diagrammu mīļotājiem.

Statistika par katra servera ienākoŔo metrikas skaitu: vairāk nekā 2 miljoni MPS.

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Viena no mezgliem atspējoÅ”ana un ienākoÅ”o metrikas pārdalÄ«Å”ana.

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Statistika par izejoÅ”ajiem rādÄ«tājiem: vienmēr sÅ«ta tikai viens mezgls - raid boss.

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Katra mezgla darbības statistika, ņemot vērā kļūdas dažādos sistēmas moduļos.

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Detalizēta informācija par ienākoÅ”ajiem rādÄ«tājiem (metriku nosaukumi ir paslēpti).

Bioyino ā€” izplatÄ«ts, mērogojams metrikas apkopotājs

Ko mēs ar Å”o visu plānojam darÄ«t tālāk? Protams, raksti kodu, sasodÄ«ts...! Sākotnēji tika plānots, ka projekts bÅ«s atvērtā koda avots, un tāds tas paliks visu tā darbÄ«bas laiku. MÅ«su tuvākajos plānos ietilpst pāreja uz mÅ«su paÅ”u Raft versiju, vienādranga protokola maiņa uz pārnēsājamāku, papildu iekŔējās statistikas ievieÅ”ana, jauna veida metrika, kļūdu labojumi un citi uzlabojumi.

Protams, ikviens laipni aicināts palīdzēt projekta izstrādē: veidot PR, Issues, ja iespējams reaģēsim, uzlabosim utt.

Tā sakot, tas arī viss, ļaudis, pērciet mūsu ziloņus!



Avots: www.habr.com

Pievieno komentāru