TL;DR: Pirms Äetriem gadiem es atstÄju Google ar ideju par jaunu servera uzraudzÄ«bas rÄ«ku. Ideja bija apvienot parasti izolÄtas funkcijas vienÄ pakalpojumÄ
Å ajÄ rakstÄ ir aprakstÄ«ts, kÄ mÄs Scalyr atrisinÄjÄm Å”o problÄmu, izmantojot vecÄs skolas metodes, brutÄlÄ spÄka pieeju, novÄrÅ”ot nevajadzÄ«gus slÄÅus un izvairoties no sarežģītÄm datu struktÅ«rÄm. Å Ä«s nodarbÄ«bas varat izmantot savÄm inženiertehniskajÄm problÄmÄm.
VecÄs skolas spÄks
ŽurnÄla analÄ«ze parasti sÄkas ar meklÄÅ”anu: atrodiet visus ziÅojumus, kas atbilst noteiktam modelim. ProgrammÄ Scalyr tie ir desmitiem vai simtiem gigabaitu žurnÄlu no daudziem serveriem. MÅ«sdienu pieejas, kÄ likums, ietver sarežģītas datu struktÅ«ras izveidi, kas optimizÄta meklÄÅ”anai. Es noteikti to esmu redzÄjis Google tÄ«klÄ, kur viÅi ir diezgan labi Å”ajÄs lietÄs. Bet mÄs izvÄlÄjÄmies daudz rupjÄku pieeju: baļķu lineÄro skenÄÅ”anu. Un tas darbojÄs ā mÄs nodroÅ”inÄm meklÄjamu saskarni, kas ir vairÄkas reizes ÄtrÄka nekÄ mÅ«su konkurenti (skatiet animÄciju beigÄs).
Galvenais ieskats bija tÄds, ka mÅ«sdienu procesori patieÅ”Äm ir ļoti Ätri, veicot vienkÄrÅ”as un vienkÄrÅ”as darbÄ«bas. To var viegli nepamanÄ«t sarežģītÄs, daudzslÄÅu sistÄmÄs, kas balstÄs uz I/O Ätrumu un tÄ«kla darbÄ«bÄm, un Å”Ädas sistÄmas mÅ«sdienÄs ir ļoti izplatÄ«tas. TÄpÄc mÄs izstrÄdÄjÄm dizainu, kas samazina slÄÅus un liekos gružus. Ja paralÄli ir vairÄki procesori un serveri, meklÄÅ”anas Ätrums sasniedz 1 TB sekundÄ.
GalvenÄs atziÅas no Ŕī raksta:
- BrutÄla meklÄÅ”ana ir dzÄ«votspÄjÄ«ga pieeja reÄlu, liela mÄroga problÄmu risinÄÅ”anai.
- BrutÄlais spÄks ir dizaina tehnika, nevis risinÄjums bez darba. TÄpat kÄ jebkura tehnika, tÄ ir labÄk piemÄrota dažÄm problÄmÄm nekÄ citÄm, un to var Ä«stenot slikti vai labi.
- BrutÄls spÄks ir Ä«paÅ”i labs, lai sasniegtu stabils produktivitÄte.
- Lai efektÄ«vi izmantotu brutÄlu spÄku, ir nepiecieÅ”ams optimizÄt kodu un piemÄrot pietiekamus resursus Ä«stajÄ laikÄ. Tas ir piemÄrots, ja jÅ«su serveri ir pakļauti lielai lietotÄju slodzei un lietotÄju darbÄ«bas joprojÄm ir prioritÄte.
- VeiktspÄja ir atkarÄ«ga no visas sistÄmas konstrukcijas, nevis tikai no iekÅ”ÄjÄs cilpas algoritma.
(Å ajÄ rakstÄ ir aprakstÄ«ta datu meklÄÅ”ana atmiÅÄ. VairumÄ gadÄ«jumu, kad lietotÄjs veic meklÄÅ”anu žurnÄlÄ, Scalyr serveri to jau ir saglabÄjuÅ”i keÅ”atmiÅÄ. NÄkamajÄ rakstÄ tiks apspriesta nekeÅ”atmiÅÄ saglabÄto žurnÄlu meklÄÅ”ana. Tiek piemÄroti tie paÅ”i principi: efektÄ«vs kods, brutÄls spÄks ar lieliem skaitļoÅ”anas resursiem).
BrutÄlÄ spÄka metode
TradicionÄli liela datu kopa tiek meklÄta, izmantojot atslÄgvÄrdu indeksu. Lietojot servera žurnÄlos, tas nozÄ«mÄ, ka žurnÄlÄ ir jÄmeklÄ katrs unikÄlais vÄrds. Katram vÄrdam ir jÄizveido visu ieslÄgumu saraksts. TÄdÄjÄdi ir viegli atrast visus ziÅojumus ar Å”o vÄrdu, piemÄram, 'error', 'firefox' vai "transaction_16851951" ā vienkÄrÅ”i skatieties rÄdÄ«tÄjÄ.
Es izmantoju Å”o pieeju Google, un tÄ darbojÄs labi. Bet Scalyr mÄs meklÄjam žurnÄlus pa baitam.
KÄpÄc? No abstraktÄ algoritmiskÄ viedokļa atslÄgvÄrdu indeksi ir daudz efektÄ«vÄki nekÄ meklÄÅ”ana ar brutÄlu spÄku. TomÄr mÄs nepÄrdodam algoritmus, bet gan veiktspÄju. Un veiktspÄja ir saistÄ«ta ne tikai ar algoritmiem, bet arÄ« par sistÄmu inženieriju. Mums jÄÅem vÄrÄ viss: datu apjoms, meklÄÅ”anas veids, pieejamÄ aparatÅ«ra un programmatÅ«ras konteksts. MÄs nolÄmÄm, ka mÅ«su konkrÄtajai problÄmai kaut kas lÄ«dzÄ«gs āgrepā ir labÄk piemÄrots nekÄ indekss.
Indeksi ir lieliski, taÄu tiem ir ierobežojumi. Vienu vÄrdu ir viegli atrast. TaÄu meklÄt ziÅojumus ar vairÄkiem vÄrdiem, piemÄram, āgooglebotā un ā404ā, ir daudz grÅ«tÄk. Lai meklÄtu tÄdu frÄzi kÄ ānepieÄ·erts izÅÄmumsā, ir nepiecieÅ”ams apgrÅ«tinoÅ”Äks rÄdÄ«tÄjs, kas reÄ£istrÄ ne tikai visus ziÅojumus ar Å”o vÄrdu, bet arÄ« konkrÄtÄ vÄrda atraÅ”anÄs vietu.
ÄŖstÄs grÅ«tÄ«bas rodas, kad nemeklÄ vÄrdus. PieÅemsim, ka vÄlaties redzÄt, cik daudz trafika nÄk no robotprogrammatÅ«rÄm. PirmÄ doma ir žurnÄlos meklÄt vÄrdu 'bot'. Å Ädi jÅ«s atradÄ«siet dažus robotus: Googlebot, Bingbot un daudzus citus. Bet Å”eit "bots" nav vÄrds, bet gan tÄ daļa. Ja indeksÄ meklÄsim ābotā, mÄs neatradÄ«sim nevienu ziÅu ar vÄrdu āGooglebotā. Ja pÄrbaudÄ«sit katru vÄrdu rÄdÄ«tÄjÄ un pÄc tam pÄrmeklÄsiet indeksÄ atrastos atslÄgvÄrdus, meklÄÅ”ana ievÄrojami palÄninÄsies. RezultÄtÄ dažas žurnÄlprogrammas neļauj meklÄt vÄrdu daļu vai (labÄkajÄ gadÄ«jumÄ) atļauj Ä«paÅ”u sintaksi ar zemÄku veiktspÄju. MÄs vÄlamies no tÄ izvairÄ«ties.
VÄl viena problÄma ir pieturzÄ«mes. Vai vÄlaties atrast visus pieprasÄ«jumus no 50.168.29.7
? Kas par atkļūdoÅ”anas žurnÄliem, kas satur [error]
? ApakŔraksti parasti izlaiž pieturzīmes.
Visbeidzot, inženieri mÄ«l spÄcÄ«gus rÄ«kus, un dažreiz problÄmu var atrisinÄt tikai ar regulÄru izteiksmi. AtslÄgvÄrdu rÄdÄ«tÄjs tam nav Ä«paÅ”i piemÄrots.
TurklÄt indeksi komplekss. Katrs ziÅojums ir jÄpievieno vairÄkiem atslÄgvÄrdu sarakstiem. Å ie saraksti vienmÄr ir jÄsaglabÄ viegli meklÄjamÄ formÄtÄ. VaicÄjumi ar frÄzÄm, vÄrdu fragmentiem vai regulÄrÄm izteiksmÄm ir jÄpÄrvÄrÅ” vairÄku sarakstu operÄcijÄs, un rezultÄti jÄskenÄ un jÄapvieno, lai izveidotu rezultÄtu kopu. Liela mÄroga, vairÄku nomnieku pakalpojuma kontekstÄ Å”Ä« sarežģītÄ«ba rada veiktspÄjas problÄmas, kas nav redzamas, analizÄjot algoritmus.
AtslÄgvÄrdu indeksi arÄ« aizÅem daudz vietas, un uzglabÄÅ”ana ir lielas izmaksas žurnÄlu pÄrvaldÄ«bas sistÄmÄ.
No otras puses, katra meklÄÅ”ana var patÄrÄt daudz skaitļoÅ”anas jaudas. MÅ«su lietotÄji novÄrtÄ ÄtrdarbÄ«gu unikÄlu vaicÄjumu meklÄÅ”anu, taÄu Å”Ädi vaicÄjumi tiek veikti salÄ«dzinoÅ”i reti. Tipiskiem meklÄÅ”anas vaicÄjumiem, piemÄram, informÄcijas panelim, mÄs izmantojam Ä«paÅ”us paÅÄmienus (mÄs tos aprakstÄ«sim nÄkamajÄ rakstÄ). Citi pieprasÄ«jumi ir pietiekami reti, tÄpÄc jums reti ir jÄapstrÄdÄ vairÄki pieprasÄ«jumi vienlaikus. TaÄu tas nenozÄ«mÄ, ka mÅ«su serveri nav aizÅemti: tie ir aizÅemti ar jaunu ziÅojumu saÅemÅ”anu, analÄ«zi un saspieÅ”anu, brÄ«dinÄjumu izvÄrtÄÅ”anu, veco datu saspieÅ”anu utt. TÄdÄjÄdi mums ir diezgan ievÄrojams procesoru piedÄvÄjums, ko var izmantot vaicÄjumu izpildei.
BrutÄlais spÄks darbojas, ja jums ir rupja problÄma (un daudz spÄka)
BrutÄlais spÄks vislabÄk darbojas vienkÄrÅ”Äm problÄmÄm ar mazÄm iekÅ”ÄjÄm cilpÄm. Bieži vien jÅ«s varat optimizÄt iekÅ”Äjo cilpu, lai tÄ darbotos ļoti lielÄ ÄtrumÄ. Ja kods ir sarežģīts, to optimizÄt ir daudz grÅ«tÄk.
MÅ«su meklÄÅ”anas kodam sÄkotnÄji bija diezgan liela iekÅ”ÄjÄ cilpa. MÄs saglabÄjam ziÅojumus lapÄs 4K; katrÄ lapÄ ir daži ziÅojumi (UTF-8) un katra ziÅojuma metadati. Metadati ir struktÅ«ra, kas kodÄ vÄrtÄ«bas garumu, iekÅ”ÄjÄ ziÅojuma ID un citus laukus. MeklÄÅ”anas cikls izskatÄ«jÄs Å”Ädi:
Å Ä« ir faktiskÄ koda vienkÄrÅ”ota versija. Bet pat Å”eit ir redzami vairÄki objektu izvietojumi, datu kopijas un funkciju izsaukumi. JVM diezgan labi spÄj optimizÄt funkciju izsaukumus un pieŔķirt Ä«slaicÄ«gus objektus, tÄpÄc Å”is kods darbojÄs labÄk, nekÄ bijÄm pelnÄ«juÅ”i. TestÄÅ”anas laikÄ klienti to diezgan veiksmÄ«gi izmantoja. Bet galu galÄ mÄs to pacÄlÄm uz nÄkamo lÄ«meni.
(Varat jautÄt, kÄpÄc mÄs glabÄjam ziÅojumus Å”ajÄ formÄtÄ ar 4K lapÄm, tekstu un metadatiem, nevis strÄdÄjam tieÅ”i ar žurnÄliem. Ir daudz iemeslu, kas izriet no tÄ, ka iekÅ”Äji Scalyr dzinÄjs vairÄk atgÄdina izkliedÄtu datu bÄzi, nevis failu sistÄma. Teksta meklÄÅ”ana bieži tiek apvienota ar DBVS stila filtriem malÄs pÄc žurnÄlu parsÄÅ”anas. MÄs varam vienlaikus meklÄt daudzos tÅ«kstoÅ”os žurnÄlu vienlaikus, un vienkÄrÅ”i teksta faili nav piemÄroti mÅ«su darÄ«jumu, replicÄto, izplatÄ«to datu pÄrvaldÄ«bai).
SÄkotnÄji Ŕķita, ka Å”Äds kods nav Ä«paÅ”i piemÄrots brutÄlÄ spÄka optimizÄcijai. "ÄŖsts darbs". String.indexOf()
pat nedominÄja CPU profilÄ. Tas ir, Ŕīs metodes optimizÄÅ”ana vien nedotu bÅ«tisku efektu.
GadÄs, ka mÄs glabÄjam metadatus katras lapas sÄkumÄ, un visu UTF-8 ziÅojumu teksts tiek iesaiÅots otrÄ galÄ. Izmantojot Å”o iespÄju, mÄs pÄrrakstÄ«jÄm cilpu, lai meklÄtu visÄ lapÄ uzreiz:
Å Ä« versija darbojas tieÅ”i skatÄ raw byte[]
un meklÄ visus ziÅojumus vienlaikus visÄ 4K lapÄ.
To ir daudz vieglÄk optimizÄt brutÄlÄ spÄka metodei. IekÅ”ÄjÄ meklÄÅ”anas cilpa tiek izsaukta vienlaikus visai 4K lapai, nevis atseviŔķi katrÄ ziÅÄ. Nav datu kopÄÅ”anas, objektu pieŔķirÅ”anas. Un sarežģītÄkas metadatu darbÄ«bas tiek izsauktas tikai tad, ja rezultÄts ir pozitÄ«vs, nevis katram ziÅojumam. TÄdÄ veidÄ mÄs esam likvidÄjuÅ”i tonnu pieskaitÄmo izdevumu, un pÄrÄjÄ slodze ir koncentrÄta nelielÄ iekÅ”ÄjÄ meklÄÅ”anas cilpÄ, kas ir labi piemÄrota turpmÄkai optimizÄcijai.
MÅ«su faktiskais meklÄÅ”anas algoritms ir balstÄ«ts uz
MÅ«su ievieÅ”anai ir nepiecieÅ”ams izveidot 64 1,25 uzmeklÄÅ”anas tabulu katram meklÄjumam, taÄu tas nav nekas, salÄ«dzinot ar datu gigabaitiem, kurus mÄs meklÄjam. IekÅ”ÄjÄ cilpa apstrÄdÄ vairÄkus gigabaitus sekundÄ vienÄ kodolÄ. PraksÄ stabila veiktspÄja ir aptuveni XNUMX GB sekundÄ katrÄ kodolÄ, un ir iespÄjas uzlabot. Ir iespÄjams novÄrst daļu no pieskaitÄmajÄm izmaksÄm Ärpus iekÅ”ÄjÄs cilpas, un mÄs plÄnojam eksperimentÄt ar iekÅ”Äjo cilpu C valodÄ, nevis Java.
MÄs izmantojam spÄku
MÄs esam apsprieduÅ”i, ka žurnÄlu meklÄÅ”anu var Ä«stenot "aptuveni", bet cik daudz mums ir "jauda"? Diezgan daudz.
1 kodols: Pareizi lietojot, viens mÅ«sdienu procesora kodols pats par sevi ir diezgan spÄcÄ«gs.
8 serdeÅi: PaÅ”laik mÄs strÄdÄjam Amazon hi1.4xlarge un i2.4xlarge SSD serveros, katrs ar 8 kodoliem (16 pavedieni). KÄ minÄts iepriekÅ”, Å”ie kodoli parasti ir aizÅemti ar fona darbÄ«bÄm. Kad lietotÄjs veic meklÄÅ”anu, fona darbÄ«bas tiek apturÄtas, tÄdÄjÄdi meklÄÅ”anai tiek atbrÄ«voti visi 8 kodoli. MeklÄÅ”ana parasti tiek pabeigta sekundes daļÄ, pÄc kuras tiek atsÄkts fona darbs (drosÄÅ”anas programma nodroÅ”ina, ka meklÄÅ”anas vaicÄjumu straume netraucÄ svarÄ«gu fona darbu).
16 serdeÅi: uzticamÄ«bas labad mÄs sakÄrtojam serverus galvenajÄs/slavenajÄs grupÄs. Katram meistaram ir viens SSD un viens EBS serveris. Ja galvenais serveris avarÄ, SSD serveris nekavÄjoties ieÅem tÄ vietu. GandrÄ«z visu laiku galvenais un slavenais darbojas labi, tÄpÄc katrs datu bloks ir meklÄjams divos dažÄdos serveros (EBS vergu serverim ir vÄjÅ” procesors, tÄpÄc mÄs to neuzskatÄm). MÄs sadalÄm uzdevumus starp tiem, lai kopÄ bÅ«tu pieejami 16 kodoli.
Daudzi serdeÅi: tuvÄkajÄ nÄkotnÄ mÄs sadalÄ«sim datus starp serveriem tÄ, lai tie visi piedalÄ«tos katra nenozÄ«mÄ«ga pieprasÄ«juma apstrÄdÄ. Katrs kodols darbosies. [PiezÄ«me: Ä«stenojÄm plÄnu un palielinÄjÄm meklÄÅ”anas Ätrumu lÄ«dz 1 TB/s, skatiet piezÄ«mi raksta beigÄs].
VienkÄrŔība nodroÅ”ina uzticamÄ«bu
VÄl viena brutÄlÄ spÄka metodes priekÅ”rocÄ«ba ir tÄs diezgan konsekventa veiktspÄja. Parasti meklÄÅ”ana nav Ä«paÅ”i jutÄ«ga pret problÄmas un datu kopas detaļÄm (domÄju, ka tÄpÄc to sauc par "rupju").
AtslÄgvÄrdu rÄdÄ«tÄjs dažreiz sniedz neticami Ätrus rezultÄtus, bet citreiz ne. PieÅemsim, ka jums ir 50 GB žurnÄlu, kuros vÄrds ācustomer_5987235982ā tiek parÄdÄ«ts tieÅ”i trÄ«s reizes. MeklÄjot Å”o vÄrdu, tiek uzskaitÄ«tas trÄ«s atraÅ”anÄs vietas tieÅ”i no rÄdÄ«tÄja, un tÄ tiks pabeigta uzreiz. TaÄu sarežģīta aizstÄjÄjzÄ«mju meklÄÅ”ana var skenÄt tÅ«kstoÅ”iem atslÄgvÄrdu un aizÅemt ilgu laiku.
No otras puses, brutÄlÄ spÄka meklÄÅ”ana jebkuram vaicÄjumam veic vairÄk vai mazÄk tÄdu paÅ”u Ätrumu. LabÄk ir meklÄt garus vÄrdus, taÄu pat vienas rakstzÄ«mes meklÄÅ”ana ir diezgan Ätra.
BrutÄlÄ spÄka metodes vienkÄrŔība nozÄ«mÄ, ka tÄs veiktspÄja ir tuvu tÄs teorÄtiskajam maksimumam. Ir mazÄk iespÄju neparedzÄtai diska pÄrslodzei, bloÄ·ÄÅ”anai, rÄdÄ«tÄja dzÄ«Å”anai un tÅ«kstoÅ”iem citu kļūmes iemeslu. Es tikko paskatÄ«jos uz Scalyr lietotÄju pieprasÄ«jumiem pagÄjuÅ”ajÄ nedÄÄ¼Ä mÅ«su noslogotÄkajÄ serverÄ«. Bija 14 000 pieprasÄ«jumu. TieÅ”i astoÅiem no tiem vajadzÄja vairÄk nekÄ vienu sekundi; 99% pabeigti 111 milisekundÄs (ja neesat izmantojis žurnÄlu analÄ«zes rÄ«kus, ticiet man: tas ir Ätri).
Stabila, uzticama veiktspÄja ir svarÄ«ga pakalpojuma Ärtai lietoÅ”anai. Ja tas periodiski atpaliek, lietotÄji to uztvers kÄ neuzticamu un nelabprÄt to izmantos.
ŽurnÄla meklÄÅ”ana darbÄ«bÄ
Å eit ir Ä«sa animÄcija, kas parÄda Scalyr meklÄÅ”anu darbÄ«bÄ. Mums ir demonstrÄcijas konts, kurÄ mÄs importÄjam katru notikumu katrÄ publiskajÄ Github repozitorijÄ. Å ajÄ demonstrÄcijÄ es pÄrbaudu nedÄļas datus: aptuveni 600 MB neapstrÄdÄtu žurnÄlu.
Video tika ierakstÄ«ts tieÅ”raidÄ, bez Ä«paÅ”as sagatavoÅ”anÄs, uz mana darbvirsmas (apmÄram 5000 kilometrus no servera). VeiktspÄja, ko redzÄsit, lielÄ mÄrÄ ir saistÄ«ta ar
NoslÄgumÄ
ApstrÄdÄjot lielu datu apjomu, ir svarÄ«gi izvÄlÄties labu algoritmu, taÄu ālabsā nenozÄ«mÄ āiedomÄtsā. PadomÄjiet par to, kÄ jÅ«su kods darbosies praksÄ. Algoritmu teorÄtiskÄ analÄ«ze izslÄdz dažus faktorus, kuriem var bÅ«t liela nozÄ«me reÄlajÄ pasaulÄ. VienkÄrÅ”Äki algoritmi ir vieglÄk optimizÄjami un stabilÄki malu situÄcijÄs.
PadomÄjiet arÄ« par kontekstu, kurÄ kods tiks izpildÄ«ts. MÅ«su gadÄ«jumÄ mums ir nepiecieÅ”ami pietiekami jaudÄ«gi serveri, lai pÄrvaldÄ«tu fona uzdevumus. LietotÄji sÄk meklÄÅ”anu salÄ«dzinoÅ”i reti, tÄpÄc mÄs varam aizÅemties veselu serveru grupu uz Ä«su laiku, kas nepiecieÅ”ams katras meklÄÅ”anas pabeigÅ”anai.
Izmantojot brutÄlÄ spÄka metodi, mÄs ieviesÄm Ätru, uzticamu un elastÄ«gu meklÄÅ”anu baļķu komplektÄ. MÄs ceram, ka Ŕīs idejas noderÄs jÅ«su projektiem.
RediÄ£Ät: Virsraksts un teksts ir mainÄ«ts no āMeklÄt ar Ätrumu 20 GB sekundÄā uz āMeklÄt ar Ätrumu 1 TB sekundÄā, lai atspoguļotu veiktspÄjas pieaugumu dažu pÄdÄjo gadu laikÄ. Å is Ätruma pieaugums galvenokÄrt ir saistÄ«ts ar izmaiÅÄm EC2 serveru tipÄ un skaitÄ, ko Å”odien ievietojam, lai apkalpotu mÅ«su palielinÄto klientu bÄzi. DrÄ«zumÄ gaidÄmas izmaiÅas, kas nodroÅ”inÄs vÄl vienu dramatisku darbÄ«bas efektivitÄtes pieaugumu, un mÄs nevaram vien sagaidÄ«t, kad varÄsim ar tÄm dalÄ«ties.
Avots: www.habr.com