
Ovo je priča koja je zauvijek promenila moj pristup devops poslu. Još u pre-kovidnim vremenima, dugo pre njih, kada smo s ekipom tek razmišljali o svom poslu i radili kao frilenseri na slučajnim projektima, dobio sam jedan predlog na Telegramu.
Firma koja ga je napisala bavila se analizom podataka. Svakodnevno su obrađivali hiljade zahteva. Došli su kod nas s rečima: 'momci, imamo ClickHouse i želimo da automatizujemo njegovu konfiguraciju i instalaciju. Želimo Ansible, Terraform, Docker i da sve to bude u gitu. Želimo klaster od četiri nodova sa po dve replike u svakoj.'
Standardna molba, kakvih ima desetine, i potrebno je isto tako dobro standardno rešenje. Rekli smo 'u redu', i za 2-3 nedelje sve je bilo spremno. Rad su prihvatili i počeli da se prebacuju na novi klaster ClickHouse-a pomoću naše alatke.
Niko u njihovoj firmi nije želeo niti umeo da se bavi ClickHouse-om. Tada smo mislili da je to njihov glavni problem, pa je CTO firme jednostavno dao znak mom timu da maksimalno automatizuje rad, kako ne bi više nikada morali da se mešaju.
Pratili smo preseljenje, pojavili su se drugi zadaci — postavljanje bekapa i monitora. U tom trenutku CTO ove firme se povukao na drugi projekat, ostavljajući nas pod komandom jednog od svojih — Leonida. Leony je bio mladić koji nije bio naročito nadaren. Obični programer, koga su iznenada postavili za vođu ClickHouse-a. Čini se da je to bila njegova prva dodela da nešto vodi, i od nagomilane počasti dobio je zvezdastu bolest.
Zajedno smo se uhvatili u koštac sa bekapima. Predložio sam da bekapujemo odmah izvorne podatke. Samo ih uzeti, zipovati i elegantno smestiti u neki S3. Izvorni podaci — to je zlato. Postojala je i druga opcija — bekapovati same tabele u ClickHouse-u, pomoću zamrzavanja i kopiranja. Ali Leony je smislio svoje rešenje.
Objavio je da nam je potreban drugi klaster ClickHouse-a. I od sada ćemo pisati podatke na dva klastera — glavni i bekapni. Kažem mu, Leony, to neće biti bekap — već aktivna replika. I ako podaci počnu da se gube na produkciji, na tvom bekapu će biti isto.
Ali Leony je čvrsto držao kormilo i odbio je da sluša moje argumente. Dugo smo se prepirali u četu, ali nismo imali izbora — Leony je vodio projekat, a mi smo bili samo angažovani mladići s ulice.
Pratili smo stanje klastera i naplaćivali samo rad administratora. Čisto administriranje Clickhouse-a bez zadiranja u podatke. Klaster je bio dostupan, diskovi u redu, čvorovi u normi.
Još nismo sumnjali da smo dobili ovu narudžbu zbog strašnog nesporazuma unutar njihove ekipe.
Voditelj je bio nezadovoljan što Clickhouse radi sporo i povremeno gubi podatke. Postavio je svom CTO-u zadatak da to istraži. On je istražio koliko je mogao i došao do zaključka da jednostavno treba automatizirati Clickhouse — i to je to. No, kako se ubrzo ispostavilo — potrebna im je bila sasvim druga ekipa devova.
Sve je to otkriveno vrlo, vrlo bolno. A najtužnije je što se dogodilo na moj rođendan.
Petak, večer. Rezervirao sam stol u svom omiljenom vinskom baru i pozvao prijatelje.
Skoro pred izlazak pojavila nam se zadaća da napravimo alteraciju, izvršili smo je, sve je bilo u redu. Alteracija je prošla, Clickhouse je potvrdio. Već smo se pripremali za bar, kada su nam javili da nedostaju podaci. Izgledalo je da je sve tu. Otišli smo slaviti.
U restoranu je u petak bilo bučno. Naručili smo piće, hranu i slegli se na kauč. Celo to vreme moj Slack je polako bio prepun poruka. Pisali su nešto o nedostatku podataka. Pomislio sam — jutro je pametnije od večeri. Pogotovo današnjeg.
Oko jedanaest počeli su me već zvati. Bio je to direktor kompanije… 'Sigurno me zove da me čestita', pomislio sam vrlo nesigurno i javio se.
I čuo sam nešto u stilu: 'Uništili ste naše podatke! Plaćam vas, ali ništa ne radi! Vi ste odgovarali za backup, i niste napravili ništa! Hajde popravite to!' — samo mnogo grublje.
— Znaš šta, idi do đavola! Danas mi je rođendan, i sada ću piti, a ne se baviti vašim amatetskim glupostima od smeća i štapića!
Ali to nisam rekao. Umesto toga, uzeo sam laptop i počeo raditi.
Ne, ludovao sam, ludovao sam strašno! Sipao sam u chat otrovne 'rek'o sam' — jer backup, koji nije bio backup, naravno da nije spasio ništa.
Sa dečkima smo smislili kako ručno zaustaviti zapisivanje i sve provjeriti. Zaista smo se uvjerili da dio podataka nije zabilježen.
Prekinuli smo snimanje, izbrojali broj događaja koji se tamo nalaze tijekom dana. Dodali smo još podataka, od kojih se samo trećina nije snimila. Tri shard-a s 2 replike. Ubacuješ 100.000 redaka — 33.000 se ne snimaju.
Vladala je potpuna zbrka. Svi su se međusobno povremeno uvredljivo ponašali: prvi je otišao Ljonja, a zatim su išli ja i osnivač kompanije. Samo novopristigli CTO pokušavao je izvući naše pozive s vikanjem i prepisivati prema rješenju problema.
Što se zapravo dešavalo — nitko nije razumio.
S dečkima smo se jednostavno šokirali kada smo shvatili da trećina svih podataka nije samo da se nije snimala — ona se gubila! Ispostavilo se da je u kompaniji red bio takav: nakon umetanja podaci su se trajno brisali, događaji su se gubili u paketima. Zamislio sam kako Sergej pretvara sve to u izgubljene ruble.
Moj rođendan također je otišao u smeće. Sjedili smo u baru i generirali ideje, pokušavajući riješiti postavljeni zagonet. Uzrok pada ClickHouse-a nije bio očit. Možda je to mreža, možda su u pitanju postavke Linuxa. Sve što se moglo pretpostaviti, izrečene su brojne hipoteze.
Nisam dao developersku zakletvu, ali bilo bi nepristojno napustiti dečke na drugom kraju žice — čak i ako su nas za sve krivili. Bio sam 99% siguran da problem nije bio u našim rješenjima, nije na našoj strani. 1% šanse da smo ipak pogriješili palilo je tjeskobu. Ali bez obzira na to čija je strana imala problem — to se moralo popraviti. Ostavljati klijente, ma kakvi bili, s takvom strašnom curenjem podataka — to je previše okrutno.
Radili smo do tri ujutro za stolom u restoranu. Dodavali smo događaje, insert select — i krenuli popunjavati praznine. Kada izgubiš podatke, radi se ovako — uzmeš prosječne podatke za prethodne dane i ubaciš ih u izgubljene.
Nakon tri ujutro, ja i prijatelj otišli smo kod mene, naručili pivo iz prodavaonice. Sjedio sam s laptopom i problemima ClickHouse-a, prijatelj mi je nešto pričao. Na kraju, nakon sat vremena, uvrijedio se zbog toga što radim, a ne pijem pivo s njim, i otišao. Klasična situacija — bio sam prijatelj devopsa.
Do 6 ujutro ponovno sam kreirao tablicu, a podaci su počeli dolaziti. Sve je počelo raditi bez gubitaka.
Dalje je bilo teško. Svi su se međusobno optuživali za gubitak podataka. Da se dogodila nova greška, siguran sam da bi počela međusobna prepucavanja.
U tim sukobima napokon smo počeli shvaćati - u kompaniji su mislili da smo mi ti tipovi koji rade s podacima i nadziru strukturu tablica. Pomiješali su administratore s DB administratorima. I došli su nas pitati, ne kako bi pitali administratore.
Njihova glavna primjedba - kakva glupost, vi ste odgovarali za backupove i niste ih napravili kako treba, izgubili ste podatke. I sve to u uvredama.
Želio sam pravdu. Iskopao sam prepisku i priložio sve snimke ekrana gdje Leonid svim snagama zahtijeva da se napravi backup kakav je bio napravljen. Njihov CTO je stao na našu stranu nakon mog telefonskog poziva. Na kraju je i Lenja priznao svoju krivicu.
Vođa kompanije s druge strane nije želio kriviti svoje. Snimke i riječi na njega nisu djelovale. Smatrao je da, buduci da smo mi ovdje stručnjaci, trebali smo sve uvjeriti i ustanoviti svoje rješenje. Očigledno, u našoj zadatku bilo je podučiti Lenju i izvan njega, određenog vođu projekta, doći do glavnog i iznijeti mu sve naše sumnje u koncept backupova.
Chat je isijavao mržnju, skrivenu i otvorenu agresiju. Nisam znao što da radim. Sve je zapelo. I onda su mi savjetovali najjednostavniji način - napisati osobno vođi i dogovoriti se s njim za sastanak. Vasa, ljudi u životu nisu tako drski kao u chatu. Na moju poruku šef je odgovorio: dođi, nema problema.
To je bio najneugodniji sastanak u mojoj karijeri. Moj saveznik s klijenta - CTO - nije mogao pronaći vrijeme. Na sastanak sam išao šefu i Ljoni.
Iznova i iznova sam u glavi vrtio naš mogući dijalog. Uspio sam doći značajno unaprijed, pola sata prije. Počela je nervoza, popušio sam 10 cigareta. Shvatio sam, sve - ja sam, prokletstvo, sam. Neću ih moći uvjeriti. I zakoračio sam u lift.
Dok sam se penjao, toliko sam škripao upaljačem da sam ga slomio.
Na kraju na sastanku nije bilo Ljene. I mi smo savršeno razgovarali sa glavnim! Sergey mi je ispričao o svojoj boli. Nije htio "automatizirati ClickHouse" - želio je "da upiti rade".
Nisam vidio kozu, već dobrog tipa koji brine o svom poslu, uronjenom u rad 24/7. Chat često oslikava zlikovce, podlačine i glupane. No u životu su to isti ljudi kao i ti.
Sergeju nije trebala samo dva devopsa na najam. Problem s kojim su se suočili bio je mnogo veći.
Rekao sam da mogu riješiti njihove probleme — jednostavno, to je potpuno drugačiji posao, a poznajem jednog DB stručnjaka za to. Da smo na početku znali da je to za njih, izbjegli bismo mnogo. Kasno, ali shvatili smo da je problem bio u lošem radu s podacima, a ne u infrastrukturi.
Čvrsto smo se rukovali, naknada nam je povećana dva i pol puta, ali pod uvjetom — uzimam sav posao s njihovim podacima i ClickHouse-om na sebe. U liftu sam se povezao s onim DB stručnjakom Maxom i uključio ga u posao. Trebalo je preurediti cijeli klaster.
Bilo je puno smeća u prihvaćenom projektu. Počevši od spomenutog 'backup-a'. Ispostavilo se da taj 'backup' klaster nije bio izoliran. Na njemu su testirali sve moguće stvari, čak su ponekad pokretali u produkciji.
Interni programeri su osmislili svoj prilagođeni 'ubacivač' podataka. Radio je ovako: batch-ao je datoteke, pokretao skriptu i slijevao podatke u tablicu. No glavni problem bio je u tome što se ogroman broj podataka prikupljao za jedan jednostavan upit. Upit je spajao podatke po sekundama. Sve zbog jedne brojke — zbroj za dan.
Interni programeri su pogrešno koristili alat za analizu. Odnosili su se u Grafanu, pisali svoj luksuzni upit. Isporučio bi podatke za 2 tjedna. Dobivao se lijep grafikon. No u stvarnosti, upit podataka bio je svake 10 sekundi. Sve se to gomilalo u redu, budući da ClickHouse jednostavno nije mogao obraditi podatke. Tu je bila i glavna razlog. U Grafani ništa nije radilo, upiti su stajali u redu, stalno su stizali stari, neaktualni podaci.
Prekonfigurirali smo klaster, prepravili uplatu. Interni programeri su prepisali svoj 'ubacivač', i on je počeo pravilno shardirati podatke.
Max je proveo punu reviziju infrastrukture. Izradio je plan prijelaza na cjeloviti backend. No to nije zadovoljilo tvrtku. Očekivali su od Maxa neki magični recept koji će omogućiti da rade po starom, ali efikasno. Projekt je i dalje vodio Leonja, koji nije naučio ništa. Od svega što je ponuđeno ponovo je izabrao svoju alternativu. Kao i uvijek, to je bila najizvrsnija... hrabra odluka. Leonja je smatrao da njegova tvrtka ima poseban put. Trnovit i pun sante leda.
U biti, tu smo se i rastali — učinili smo što smo mogli.
Sa iskustvima koja smo stekli, otvorili smo vlastiti posao i formirali nekoliko principa. Danas nikada ne započinjemo rad kao nekada.
Dibiayščić Max nakon ovog projekta pridružio se nama, i još uvijek odlično radimo zajedno. Slučaj s Clickhouseom naučio nas je kako provesti temeljitu reviziju infrastrukture prije nego što počnemo raditi. Uzimamo si vremena da razumijemo kako sve funkcionira, a tek onda prihvaćamo zadatke. I da smo ranije odmah krenuli održavati infrastrukturu, sada prvo radimo jednorazni projekt koji nam pomaže da shvatimo kako je dovesti u radno stanje.
Da, izbjegavamo projekte s lošom infrastrukturom. Čak i za velike novce, čak i iz prijateljskih razloga. Održavanje problematičnih projekata nije isplativo. Svijest o tome pomogla nam je da napredujemo. Ili jednorazni projekt za dovođenje infrastrukture u red, a zatim ugovor o održavanju, ili jednostavno prolazimo dalje. Prolazimo pored još jednog iceberg-a.
P.S. Ako imate pitanja o vašoj infrastrukturi, .
Imamo 2 besplatna audita mjesečno, možda će vaš projekt biti među njima.
Izvor: habr.com
