ProHoster > Blogs > AdministrÄcija > Tipiskas lietojumprogrammu kļūdas, kas izraisa postgresql uzpÅ«Å”anos. Andrejs SaļÅikovs
Tipiskas lietojumprogrammu kļūdas, kas izraisa postgresql uzpÅ«Å”anos. Andrejs SaļÅikovs
Iesaku izlasÄ«t Andreja SaļÅikova 2016. gada sÄkuma ziÅojuma atÅ”ifrÄjumu āTipiskas kļūdas lietojumprogrammÄs, kas noved pie uzpÅ«Å”anÄs postgresqlā
Å ajÄ ziÅojumÄ es analizÄÅ”u galvenÄs lietojumprogrammu kļūdas, kas rodas lietojumprogrammas koda projektÄÅ”anas un rakstÄ«Å”anas stadijÄ. Un es pieÅemÅ”u tikai tÄs kļūdas, kas Postgresql izraisa uzpÅ«Å”anos. Parasti tas ir visas jÅ«su sistÄmas veiktspÄjas beigu sÄkums, lai gan sÄkotnÄji nebija redzami nekÄdi priekÅ”noteikumi tam.
Prieks visus sveikt! Å is ziÅojums nav tik tehnisks kÄ iepriekÅ”Äjais mana kolÄÄ£a ziÅojums. Å is pÄrskats galvenokÄrt ir paredzÄts aizmugursistÄmas izstrÄdÄtÄjiem, jo āāmums ir diezgan liels klientu skaits. Un viÅi visi pieļauj vienas un tÄs paÅ”as kļūdas. Es jums pastÄstÄ«Å”u par tiem. PaskaidroÅ”u, pie kÄ liktenÄ«gÄm un sliktÄm lietÄm noved Ŕīs kļūdas.
KÄpÄc tiek pieļautas kļūdas? Tie tiek darÄ«ti divu iemeslu dÄļ: nejauÅ”i, varbÅ«t tas izdosies, un dažu mehÄnismu nezinÄÅ”anas dÄļ, kas rodas lÄ«menÄ« starp datu bÄzi un lietojumprogrammu, kÄ arÄ« paÅ”Ä datu bÄzÄ.
Es sniegÅ”u jums trÄ«s piemÄrus ar Å”ausmÄ«gÄm bildÄm par to, cik slikti viss ir kļuvis. Es Ä«si pastÄstÄ«Å”u par mehÄnismu, kas tur notiek. Un kÄ ar tÄm rÄ«koties, kad tÄs notikuÅ”as un kÄdas profilaktiskÄs metodes izmantot, lai nepieļautu kļūdas. Es jums pastÄstÄ«Å”u par palÄ«grÄ«kiem un sniegÅ”u noderÄ«gas saites.
Es izmantoju testa datubÄzi, kurÄ man bija divas tabulas. Viena plÄksne ar klientu kontiem, otra ar darÄ«jumiem Å”ajos kontos. Ar zinÄmu biežumu mÄs atjauninÄm Å”o kontu atlikumus.
PlÄksnes sÄkotnÄjie dati: tÄ ir diezgan maza, 2 MB. ArÄ« reakcijas laiks datubÄzei un tieÅ”i zÄ«mei ir ļoti labs. Un diezgan laba slodze - 2 operÄcijas sekundÄ pÄc plÄksnes.
Un Å”ajÄ ziÅojumÄ es jums parÄdÄ«Å”u grafikus, lai jÅ«s varÄtu skaidri saprast, kas notiek. VienmÄr bÅ«s 2 slaidi ar grafikiem. Pirmais slaids ir tas, kas kopumÄ notiek serverÄ«.
Un Å”ajÄ situÄcijÄ mÄs redzam, ka mums patieÅ”Äm ir maza zÄ«me. Indekss ir mazs - 2 MB. Å is ir pirmais grafiks kreisajÄ pusÄ.
ArÄ« vidÄjais atbildes laiks serverÄ« ir stabils un Ä«ss. Å is ir augÅ”Äjais labais grafiks.
ApakÅ”ÄjÄ kreisajÄ grafikÄ ir redzami visilgÄkie darÄ«jumi. MÄs redzam, ka darÄ«jumi tiek pabeigti Ätri. Un autovakuums Å”eit vÄl nedarbojas, jo tas bija sÄkuma tests. Tas turpinÄs darboties un mums noderÄs.
Otrais priekÅ”mets vienmÄr bÅ«s veltÄ«ts pÄrbaudÄmajai plÄksnei. Å ajÄ situÄcijÄ mÄs pastÄvÄ«gi atjaunojam klienta kontu atlikumus. Un mÄs redzam, ka vidÄjais atbildes laiks atjauninÄÅ”anas darbÄ«bai ir diezgan labs, mazÄks par milisekundi. MÄs redzam, ka procesora resursi (Å”is ir augÅ”ÄjÄ labajÄ grafikÄ) arÄ« tiek patÄrÄti vienmÄrÄ«gi un diezgan maz.
ApakÅ”ÄjÄ labajÄ grafikÄ ir parÄdÄ«ts, cik daudz darbÄ«bas un diska atmiÅas mÄs iztÄrÄjam, meklÄjot vÄlamo lÄ«niju pirms tÄs atjauninÄÅ”anas. Un operÄciju skaits pÄc zÄ«mes ir 2 sekundÄ, kÄ jau teicu sÄkumÄ.
Un tagad mums ir traÄ£Ädija. Nez kÄpÄc ir sen aizmirsts darÄ«jums. Iemesli parasti ir banÄli:
Viens no izplatÄ«tÄkajiem ir tas, ka mÄs sÄkÄm piekļūt ÄrÄjam pakalpojumam lietojumprogrammas kodÄ. Un Å”is pakalpojums mums neatbild. Tas ir, mÄs atvÄrÄm darÄ«jumu, veicÄm izmaiÅas datu bÄzÄ un pÄrgÄjÄm no lietojumprogrammas uz e-pasta lasÄ«Å”anu vai uz citu mÅ«su infrastruktÅ«ras pakalpojumu, un kÄda iemesla dÄļ tÄ mums neatbild. Un mÅ«su sesija ir iestrÄgusi tÄdÄ stÄvoklÄ«, ka nav zinÄms, kad tas tiks atrisinÄts.
OtrÄ situÄcija ir tad, kad mÅ«su kodÄ kÄda iemesla dÄļ ir noticis izÅÄmums. Un izÅÄmuma gadÄ«jumÄ mÄs neapstrÄdÄjÄm darÄ«juma slÄgÅ”anu. Un mÄs beidzÄm ar pakarinÄÅ”anas sesiju ar atvÄrtu darÄ«jumu.
Un arÄ« pÄdÄjais ir diezgan izplatÄ«ts gadÄ«jums. Å is ir zemas kvalitÄtes kods. Daži ietvari atver darÄ«jumu. Tas uzkaras, un jÅ«s, iespÄjams, lietojumprogrammÄ nezinÄt, ka tas ir pakÄrts.
Kur tÄdas lietas ved?
TiktÄl, ka mÅ«su tabulas un indeksi sÄk dramatiski uzbriest. Tas ir tieÅ”i tÄds pats uzpÅ«Å”anÄs efekts. AttiecÄ«bÄ uz datu bÄzi tas nozÄ«mÄs, ka ļoti strauji palielinÄsies datu bÄzes reakcijas laiks un palielinÄsies datu bÄzes servera slodze. TÄ rezultÄtÄ cietÄ«s mÅ«su lietojumprogramma. Jo, ja kodÄ pavadÄ«jÄt 10 milisekundes, pieprasot datu bÄzei, bet 10 milisekundes izmantojÄt loÄ£ikai, tad funkcijas izpildei bija nepiecieÅ”amas 20 milisekundes. Un tagad jÅ«su situÄcija bÅ«s ļoti bÄdÄ«ga.
Un paskatÄ«simies, kas notiks. ApakÅ”ÄjÄ kreisajÄ grafikÄ redzams, ka mums ir ilgs un ilgs darÄ«jums. Un, ja mÄs paskatÄmies uz augÅ”Äjo kreiso grafiku, mÄs redzam, ka mÅ«su tabulas izmÄrs pÄkÅ”Åi ir pieaudzis no diviem megabaitiem lÄ«dz 300 megabaitiem. TajÄ paÅ”Ä laikÄ datu apjoms tabulÄ nav mainÄ«jies, t.i., tur ir diezgan liels atkritumu daudzums.
ArÄ« vispÄrÄjÄ situÄcija attiecÄ«bÄ uz vidÄjo servera reakcijas laiku ir mainÄ«jusies par vairÄkÄm kÄrtÄm. Tas ir, visi pieprasÄ«jumi serverÄ« sÄka pilnÄ«bÄ samazinÄties. Un tajÄ paÅ”Ä laikÄ autovakuuma veidÄ tika iedarbinÄti iekÅ”Äjie Postgres procesi, kas cenÅ”as kaut ko darÄ«t un patÄrÄ resursus.
Kas notiek ar mÅ«su zÄ«mi? Tas pats. MÅ«su vidÄjais reakcijas laiks saskaÅÄ ar zÄ«mi ir uzlÄcis par vairÄkÄm kÄrtÄm. KonkrÄti, runÄjot par patÄrÄtajiem resursiem, mÄs redzam, ka procesora slodze ir ļoti pieaugusi. Å is ir augÅ”Äjais labais grafiks. Un tas ir palielinÄjies, jo procesoram ir jÄŔķiro daudz nederÄ«gu rindu, meklÄjot vajadzÄ«go. Å is ir apakÅ”ÄjÄ labajÄ pusÄ esoÅ”ais grafiks. Un tÄ rezultÄtÄ mÅ«su zvanu skaits sekundÄ sÄka ļoti bÅ«tiski samazinÄties, jo datu bÄzei nebija laika apstrÄdÄt tikpat daudz pieprasÄ«jumu.
Mums ir jÄatgriežas dzÄ«vÄ. MÄs ieejam tieÅ”saistÄ un uzzinÄm, ka ilgstoÅ”i darÄ«jumi rada problÄmas. MÄs atrodam un nogalinÄm Å”o darÄ«jumu. Un mums viss kļūst normÄli. Viss darbojas kÄ nÄkas.
MÄs nomierinÄjÄmies, bet pÄc kÄda laika sÄkam pamanÄ«t, ka aplikÄcija nedarbojas tÄpat kÄ pirms ÄrkÄrtas situÄcijas. PieprasÄ«jumi joprojÄm tiek apstrÄdÄti lÄnÄk un ievÄrojami lÄnÄk. ManÄ piemÄrÄ pusotru lÄ«dz divas reizes lÄnÄk. ArÄ« servera slodze ir lielÄka, nekÄ tÄ bija pirms avÄrijas.
Un jautÄjums: "Kas Å”obrÄ«d notiek ar bÄzi?" Un ar bÄzi rodas Å”Äda situÄcija. DarÄ«jumu diagrammÄ var redzÄt, ka tas ir apstÄjies un Ä«sti nav ilgtermiÅa darÄ«jumu. Bet negadÄ«juma laikÄ zÄ«mes izmÄrs nÄvÄjoÅ”i palielinÄjÄs. Un kopÅ” tÄ laika tie nav samazinÄjuÅ”ies. VidÄjais laiks uz bÄzes ir stabilizÄjies. Un atbildes, Ŕķiet, nÄk adekvÄti mums pieÅemamÄ ÄtrumÄ. Autovakuums kļuva aktÄ«vÄks un sÄka kaut ko darÄ«t ar zÄ«mi, jo tai ir jÄizsijÄ vairÄk datu.
KonkrÄti, saskaÅÄ ar testa plÄksnÄ«ti ar kontiem, kur mÄs mainÄm atlikumus: Ŕķiet, ka pieprasÄ«juma reakcijas laiks ir normalizÄjies. Bet patiesÄ«bÄ tas ir pusotru reizi lielÄks.
Un no procesora slodzes mÄs redzam, ka procesora slodze nav atgriezusies vajadzÄ«gajÄ vÄrtÄ«bÄ pirms avÄrijas. Un iemesli ir tieÅ”i apakÅ”ÄjÄ labajÄ grafikÄ. Var redzÄt, ka tur tiek meklÄts noteikts atmiÅas apjoms. Tas ir, lai atrastu vajadzÄ«go rindu, mÄs iztÄrÄjam datu bÄzes servera resursus, Ŕķirojot nederÄ«gos datus. DarÄ«jumu skaits sekundÄ ir stabilizÄjies.
KopumÄ labi, bet situÄcija ir sliktÄka nekÄ tÄ bija. NotÄ«rÄ«t datu bÄzes degradÄciju mÅ«su lietojumprogrammas, kas darbojas ar Å”o datu bÄzi, sekas.
Un, lai saprastu, kas tur notiek, ja nebijÄt pie iepriekÅ”ÄjÄ ziÅojuma, tagad iegÅ«sim nelielu teoriju. Teorija par iekÅ”Äjo procesu. KÄpÄc auto putekļsÅ«cÄjs un ko tas dara?
Burtiski Ä«si, lai saprastu. KÄdÄ brÄ«dÄ« mums ir galds. Mums tabulÄ ir rindas. Å Ä«s lÄ«nijas var bÅ«t aktÄ«vas, dzÄ«vas un tÄdas, kas mums tagad ir vajadzÄ«gas. AttÄlÄ tie ir atzÄ«mÄti zaÄ¼Ä krÄsÄ. Un ir beiguÅ”Äs rindas, kas jau ir izstrÄdÄtas, atjauninÄtas, un tajÄs ir parÄdÄ«juÅ”ies jauni ieraksti. Un tie ir atzÄ«mÄti, ka tie vairs nav interesanti datu bÄzei. Bet tie ir tabulÄ Postgres funkcijas dÄļ.
KÄpÄc jums ir nepiecieÅ”ams automaŔīnas putekļsÅ«cÄjs? KÄdÄ brÄ«dÄ« pienÄk autovakuums, piekļūst datu bÄzei un jautÄ: "LÅ«dzu, iedodiet man vecÄkÄ darÄ«juma ID, kas paÅ”laik ir atvÄrts datu bÄzÄ." DatubÄze atgriež Å”o ID. Un autovakuums, paļaujoties uz to, Ŕķiro tabulas rindas. Un, ja viÅÅ” redz, ka dažas rindas mainÄ«ja daudz senÄki darÄ«jumi, tad viÅam ir tiesÄ«bas tÄs atzÄ«mÄt kÄ rindas, kuras turpmÄk varÄsim izmantot atkÄrtoti, ierakstot tur jaunus datus. Tas ir fona process.
Å obrÄ«d mÄs turpinÄm strÄdÄt ar datu bÄzi un turpinÄm veikt dažas izmaiÅas tabulÄ. Un Å”ajÄs rindÄs, kuras mÄs varam atkÄrtoti izmantot, mÄs ierakstÄm jaunus datus. Un lÄ«dz ar to mÄs iegÅ«stam ciklu, t.i., visu laiku tur parÄdÄs kÄdas beigtas vecÄs rindas, to vietÄ pierakstÄm jaunas, kas mums vajadzÄ«gas. Un tas ir normÄls PostgreSQL darba stÄvoklis.
Kas notika avÄrijas laikÄ? KÄ tur notika Å”is process?
Mums bija zÄ«me kaut kÄdÄ stÄvoklÄ«, dažas dzÄ«vas, dažas beigtas lÄ«nijas. Auto putekļu sÅ«cÄjs ir klÄt. ViÅÅ” jautÄja datubÄzei, kas ir mÅ«su vecÄkais darÄ«jums un kÄds ir tÄ ID. Es saÅÄmu Å”o ID, kas varÄtu bÅ«t pirms daudzÄm stundÄm, varbÅ«t pirms desmit minÅ«tÄm. Tas ir atkarÄ«gs no tÄ, cik liela slodze ir jÅ«su datubÄzei. Un viÅÅ” meklÄja lÄ«nijas, kuras varÄtu atzÄ«mÄt kÄ atkÄrtoti izmantotas. Un es neatradu Å”Ädas rindas mÅ«su tabulÄ.
Bet Å”ajÄ laikÄ mÄs turpinÄm strÄdÄt ar tabulu. MÄs tajÄ kaut ko darÄm, atjaunojam, mainÄm datus. Kas datu bÄzei Å”ajÄ laikÄ jÄdara? ViÅai neatliek nekas cits kÄ esoÅ”Äs tabulas beigÄs pievienot jaunas rindas. Un lÄ«dz ar to mÅ«su galda izmÄrs sÄk uzbriest.
PatiesÄ«bÄ mums ir vajadzÄ«gas zaļÄs lÄ«nijas, lai darbotos. Bet Å”Ädas problÄmas laikÄ izrÄdÄs, ka zaļo lÄ«niju procentuÄlais daudzums visÄ tabulÄ ir ÄrkÄrtÄ«gi zems.
Kad mÄs izpildÄm vaicÄjumu, datu bÄzei ir jÄiet cauri visÄm rindÄm: gan sarkanajai, gan zaļajai, lai atrastu vajadzÄ«go rindiÅu. Tabulas uzpÅ«Å”anÄs ar bezjÄdzÄ«giem datiem tiek saukta par āuzpÅ«Å”anosā, kas arÄ« patÄrÄ mÅ«su diska vietu. Atcerieties, ka tas bija 2 MB, tas kļuva par 300 MB? Tagad mainiet megabaitus uz gigabaitiem, un jÅ«s Ätri zaudÄsit visus savus diska resursus.
KÄdas sekas tas var atstÄt uz mums?
ManÄ piemÄrÄ tabula un indekss pieauga 150 reizes. Dažiem mÅ«su klientiem ir bijuÅ”i vairÄk letÄlu gadÄ«jumu, kad viÅiem vienkÄrÅ”i sÄka pietrÅ«kt vietas diskÄ.
PaÅ”u galdu izmÄrs nekad nesamazinÄsies. Autovakuums dažos gadÄ«jumos var nogriezt galda asti, ja ir tikai nedzÄ«vas lÄ«nijas. Bet, tÄ kÄ notiek nemitÄ«ga rotÄcija, viena zaÄ¼Ä lÄ«nija var sastingt beigÄs un netikt atjauninÄta, bet visas pÄrÄjÄs tiks pierakstÄ«tas kaut kur plÄksnes sÄkumÄ. Bet tas ir tik maz ticams notikums, ka jÅ«su galds pats samazinÄsies, tÄpÄc jums nevajadzÄtu uz to cerÄt.
DatubÄzei ir jÄsakÄrto vesela virkne bezjÄdzÄ«gu rindu. Un mÄs izŔķÄrdÄjam diska resursus, tÄrÄjam procesora resursus un elektrÄ«bu.
Un tas tieÅ”i ietekmÄ mÅ«su lietojumprogrammu, jo, ja sÄkumÄ mÄs pieprasÄ«jumam pavadÄ«jÄm 10 milisekundes, kodam ā 10 milisekundes, tad avÄrijas laikÄ mÄs sÄkÄm tÄrÄt sekundi pieprasÄ«jumam un 10 milisekundes kodam, t.i. lietojumprogrammu veiktspÄjas apjoms ir samazinÄjies. Kad negadÄ«jums tika atrisinÄts, mÄs sÄkÄm tÄrÄt 20 milisekundes pieprasÄ«jumam, 10 milisekundes kodam. Tas nozÄ«mÄ, ka produktivitÄte joprojÄm ir kritusies pusotru reizi. Un tas viss ir viena darÄ«juma dÄļ, kas iesaldÄja, iespÄjams, mÅ«su vainas dÄļ.
Un jautÄjums: āKÄ mÄs varam visu atgÅ«t?ā, lai ar mums viss bÅ«tu kÄrtÄ«bÄ un lÅ«gumi ienÄktu tikpat Ätri kÄ pirms avÄrijas.
Šim nolūkam tiek veikts noteikts darba cikls.
Vispirms jÄatrod problemÄtiskÄs tabulas, kas ir uzpÅ«stas. MÄs saprotam, ka dažÄs tabulÄs ieraksts ir aktÄ«vÄks, citÄs mazÄk aktÄ«vs. Un Å”im nolÅ«kam mÄs izmantojam paplaÅ”inÄjumu pgstattuple. InstalÄjot Å”o paplaÅ”inÄjumu, varat rakstÄ«t vaicÄjumus, kas palÄ«dzÄs atrast tabulas, kas ir diezgan uzpÅ«stas.
Kad esat atradis Ŕīs tabulas, tÄs ir jÄsaspiež. Tam jau ir rÄ«ki. MÅ«su uzÅÄmumÄ mÄs izmantojam trÄ«s rÄ«kus. Pirmais ir iebÅ«vÄtais VACUUM FULL. ViÅÅ” ir nežÄlÄ«gs, skarbs un nežÄlÄ«gs, bet dažreiz viÅÅ” ir ļoti noderÄ«gs. Pg_repack Šø pgcompacttable - Å Ä«s ir treÅ”o puÅ”u utilÄ«tas tabulu saspieÅ”anai. Un viÅi rÅ«pÄ«gÄk izturas pret datubÄzi.
Tos izmanto atkarÄ«bÄ no tÄ, kas jums ir ÄrtÄk. Bet par to es jums pastÄstÄ«Å”u paÅ”Äs beigÄs. Galvenais ir tas, ka ir trÄ«s instrumenti. Ir daudz, no kÄ izvÄlÄties.
PÄc tam, kad esam visu izlabojuÅ”i un pÄrliecinÄjuÅ”ies, ka viss ir kÄrtÄ«bÄ, mums jÄzina, kÄ novÄrst Å”o situÄciju nÄkotnÄ:
To var diezgan viegli novÄrst. Jums jÄuzrauga sesiju ilgums galvenajÄ serverÄ«. ÄŖpaÅ”i bÄ«stamas sesijas dÄ«kstÄvÄ transakcijas stÄvoklÄ«. Tie ir tie, kuri tikko atvÄra darÄ«jumu, kaut ko izdarÄ«ja un aizgÄja vai vienkÄrÅ”i pakÄrÄs, apmaldÄ«jÄs kodÄ.
Un jums kÄ izstrÄdÄtÄjiem ir svarÄ«gi pÄrbaudÄ«t savu kodu, kad rodas Å”Ädas situÄcijas. To nav grÅ«ti izdarÄ«t. Å Ä« bÅ«s noderÄ«ga pÄrbaude. JÅ«s izvairÄ«sities no daudzÄm ābÄrnÄ«gÄmā problÄmÄm, kas saistÄ«tas ar ilgstoÅ”iem darÄ«jumiem.
Å ajos grafikos es vÄlÄjos jums parÄdÄ«t, kÄ mainÄ«jÄs zÄ«me un datu bÄzes darbÄ«ba pÄc tam, kad Å”ajÄ gadÄ«jumÄ izgÄju cauri zÄ«mei ar VACUUM FULL. Man tÄ nav ražoÅ”ana.
Tabulas izmÄrs nekavÄjoties atgriezÄs normÄlÄ darbÄ«bas stÄvoklÄ« pÄris megabaitu apmÄrÄ. Tas bÅ«tiski neietekmÄja servera vidÄjo atbildes laiku.
TaÄu Ä«paÅ”i attiecÄ«bÄ uz mÅ«su testa zÄ«mi, kurÄ mÄs atjauninÄjÄm konta atlikumus, mÄs redzam, ka vidÄjais atbildes laiks pieprasÄ«jumam atjauninÄt datus zÄ«mÄ tika samazinÄts lÄ«dz lÄ«menim, kas bija pirms ÄrkÄrtas situÄcijas. Procesora patÄrÄtie resursi Ŕī pieprasÄ«juma izpildei arÄ« samazinÄjÄs lÄ«dz lÄ«menim pirms avÄrijas. Un apakÅ”ÄjÄ labajÄ grafikÄ redzams, ka tagad mÄs atrodam tieÅ”i to lÄ«niju, kas mums ir vajadzÄ«ga uzreiz, neizejot cauri miruÅ”o lÄ«niju kaudzÄm, kas bija pirms tabulas saspieÅ”anas. Un vidÄjais pieprasÄ«juma laiks palika aptuveni tÄdÄ paÅ”Ä lÄ«menÄ«. Bet Å”eit drÄ«zÄk manÄ aparatÅ«rÄ ir kļūda.
Å eit pirmais stÄsts beidzas. Tas ir visizplatÄ«tÄkais. Un tas notiek ar visiem, neatkarÄ«gi no klienta pieredzes un programmÄtÄju kvalifikÄcijas. Agri vai vÄlu tas notiek.
Otrais stÄsts, kurÄ sadalÄm slodzi un optimizÄjam servera resursus
MÄs jau esam pieauguÅ”i un kļuvuÅ”i par nopietniem puiÅ”iem. Un mÄs saprotam, ka mums ir replika, un mums bÅ«tu labi sabalansÄt slodzi: rakstÄ«t Meistaram un lasÄ«t no replika. Un parasti Å”Äda situÄcija rodas, kad mÄs vÄlamies sagatavot kaut kÄdas atskaites vai ETL. Un bizness par to ļoti priecÄjas. ViÅÅ” patieÅ”Äm vÄlas dažÄdus pÄrskatus ar daudz sarežģītu analÄ«zi.
PÄrskati aizÅem daudzas stundas, jo sarežģītu analÄ«zi nevar aprÄÄ·inÄt milisekundÄs. MÄs, tÄpat kÄ drosmÄ«gi puiÅ”i, rakstÄm kodu. IevietoÅ”anas lietojumprogrammÄ mÄs veicam ierakstu uz Master un izpildÄm ziÅojumus par repliku.
Slodzes sadalīŔana.
Viss strÄdÄ perfekti. MÄs esam lieliski.
Un kÄ izskatÄs Ŕī situÄcija? KonkrÄti Å”ajos grafikos es pievienoju arÄ« darÄ«jumu ilgumu no kopijas darÄ«juma ilgumam. Visas pÄrÄjÄs diagrammas attiecas tikai uz galveno serveri.
LÄ«dz tam laikam mana ziÅojumu dÄlis bija pieaudzis. ViÅu ir vairÄk. MÄs redzam, ka vidÄjais servera reakcijas laiks ir stabils. MÄs redzam, ka replikÄ mums ir ilgstoÅ”s darÄ«jums, kas ilgst 2 stundas. MÄs redzam klusu autovakuuma darbÄ«bu, kas apstrÄdÄ miruÅ”Äs lÄ«nijas. Un ar mums viss ir kÄrtÄ«bÄ.
KonkrÄti, saskaÅÄ ar pÄrbaudÄ«to plÄksnÄ«ti turpinÄm atjauninÄt kontu atlikumus. Un mums ir arÄ« stabils atbildes laiks uz pieprasÄ«jumiem, stabils resursu patÄriÅÅ”. Pie mums viss ir kÄrtÄ«bÄ.
Viss ir kÄrtÄ«bÄ lÄ«dz brÄ«dim, kad Å”ie pÄrskati sÄk aktivizÄties konflikta ar replikÄciju dÄļ. Un tie Å”auj ar regulÄriem intervÄliem.
MÄs pÄrejam tieÅ”saistÄ un sÄkam lasÄ«t, kÄpÄc tas notiek. Un mÄs atrodam risinÄjumu.
Pirmais risinÄjums ir palielinÄt replikÄcijas latentumu. MÄs zinÄm, ka mÅ«su pÄrskats ilgst 3 stundas. MÄs iestatÄ«jÄm replikÄcijas aizkavi uz 3 stundÄm. MÄs visu palaižam, taÄu joprojÄm pastÄv problÄmas ar ziÅojumiem, kas dažkÄrt tiek atcelti.
MÄs vÄlamies, lai viss bÅ«tu ideÄli. KÄpjam tÄlÄk. Un mÄs atradÄm forÅ”u iestatÄ«jumu internetÄ - hot_standby_feedback. IeslÄdzam to. Hot_standby_feedback ļauj mums aizkavÄt Master autovakuumu. TÄdÄjÄdi mÄs pilnÄ«bÄ atbrÄ«vojamies no replikÄcijas konfliktiem. Un ar atskaitÄm mums viss darbojas labi.
Un kas Å”obrÄ«d notiek ar galveno serveri? Un mums ir pilnÄ«gas problÄmas ar galveno serveri. Tagad mÄs redzam diagrammas, kad man ir iespÄjoti abi Å”ie iestatÄ«jumi. Un mÄs redzam, ka sesija mÅ«su replikÄ kaut kÄ sÄka ietekmÄt situÄciju galvenajÄ serverÄ«. ViÅai ir ietekme, jo viÅa apturÄja autovakuumu, kas notÄ«ra miruÅ”Äs lÄ«nijas. MÅ«su galda izmÄrs atkal ir strauji pieaudzis. VidÄjais vaicÄjumu izpildes laiks visÄ datu bÄzÄ arÄ« strauji pieauga. Autovakuumi nedaudz nostiprinÄjÄs.
KonkrÄti, no mÅ«su plÄksnes mÄs redzam, ka arÄ« datu atjauninÄjums uz tÄ uzlÄca debesÄ«s. CPU patÄriÅÅ” lÄ«dzÄ«gi ir ievÄrojami palielinÄjies. MÄs atkal ejam cauri lielam skaitam miruÅ”u, bezjÄdzÄ«gu lÄ«niju. Un reakcijas laiks Å”ai zÄ«mei un darÄ«jumu skaits ir samazinÄjies.
KÄ tas izskatÄ«sies, ja mÄs nezinÄm, par ko es runÄju iepriekÅ”?
MÄs sÄkam meklÄt problÄmas. Ja mÄs saskÄrÄmies ar problÄmÄm pirmajÄ daļÄ, mÄs zinÄm, ka tas var bÅ«t saistÄ«ts ar ilgstoÅ”u darÄ«jumu un dodieties uz Meistaru. Mums ir problÄma ar Master. Desas viÅam. Tas uzsilst, tÄ vidÄjÄ slodze ir aptuveni simts.
PieprasÄ«jumi tur notiek lÄni, taÄu mÄs neredzam nekÄdus ilgstoÅ”us darÄ«jumus. Un mÄs nesaprotam, kas par lietu. MÄs nesaprotam, kur meklÄt.
PÄrbaudÄm servera aprÄ«kojumu. VarbÅ«t mÅ«su reids avarÄja. VarbÅ«t mÅ«su atmiÅas karte ir izdegusi. JÄ, viss var notikt. Bet nÄ, serveri ir jauni, viss darbojas labi.
Visi darbojas: administratori, izstrÄdÄtÄji un direktors. Nekas nepalÄ«dz.
Un kÄdÄ brÄ«dÄ« viss pÄkÅ”Åi sÄk laboties.
Å obrÄ«d pieprasÄ«jums par mÅ«su repliku tika apstrÄdÄts un atstÄts. MÄs saÅÄmÄm ziÅojumu. Bizness joprojÄm ir laimÄ«gs. KÄ redzat, mÅ«su zÄ«me atkal ir augusi un negrasÄs sarukt. DiagrammÄ ar sesijÄm es atstÄju daļu no Ŕī garÄ darÄ«juma no kopijas, lai jÅ«s varÄtu novÄrtÄt, cik ilgs laiks nepiecieÅ”ams, lÄ«dz situÄcija stabilizÄjas.
Sesija ir beigusies. Un tikai pÄc kÄda laika serveris nÄk vairÄk vai mazÄk kÄrtÄ«bÄ. Un vidÄjais atbildes laiks pieprasÄ«jumiem galvenajÄ serverÄ« atgriežas normÄlÄ stÄvoklÄ«. Jo beidzot autovakuumam ir iespÄja iztÄ«rÄ«t un iezÄ«mÄt Ŕīs beigu lÄ«nijas. Un viÅÅ” sÄka darÄ«t savu darbu. Un cik Ätri viÅÅ” to izdara, tik Ätri mÄs sakÄrtosimies.
SaskaÅÄ ar pÄrbaudÄ«to planÅ”etdatoru, kurÄ mÄs atjaunojam kontu atlikumus, mÄs redzam tieÅ”i tÄdu paÅ”u attÄlu. ArÄ« vidÄjais konta atjauninÄÅ”anas laiks pakÄpeniski normalizÄjas. Tiek samazinÄti arÄ« procesora patÄrÄtie resursi. Un darÄ«jumu skaits sekundÄ atgriežas normÄlÄ stÄvoklÄ«. Bet atkal esam atgriezuÅ”ies normÄlÄ stÄvoklÄ«, nevis tÄdi paÅ”i kÄ pirms avÄrijas.
JebkurÄ gadÄ«jumÄ mÄs saÅemam veiktspÄjas samazinÄjumu, tÄpat kÄ pirmajÄ gadÄ«jumÄ, pusotru lÄ«dz divas reizes un dažreiz vairÄk.
Å Ä·iet, ka visu esam izdarÄ«juÅ”i pareizi. Sadaliet slodzi. IekÄrta nav dÄ«kstÄvÄ. LÅ«gumus sadalÄ«jÄm pÄc prÄta, bet tik un tÄ viss sanÄca slikti.
Vai neiespÄjot hot_standby_feedback? JÄ, nav ieteicams to ieslÄgt bez Ä«paÅ”i nopietniem iemesliem. Jo Å”is pagrieziens tieÅ”i ietekmÄ Master serveri un aptur tur esoÅ”Ä autovakuuma darbÄ«bu. IespÄjojot to kÄdÄ replikÄ un aizmirstot par to, jÅ«s varat nogalinÄt Master un iegÅ«t lielas problÄmas ar lietojumprogrammu.
Vai palielinÄt max_standby_streaming_delay? JÄ, pÄrskatiem tÄ ir taisnÄ«ba. Ja jums ir trÄ«s stundu pÄrskats un nevÄlaties, lai tas avarÄtu replikÄcijas konfliktu dÄļ, vienkÄrÅ”i palieliniet aizkavi. IlgtermiÅa ziÅojumam nekad nav nepiecieÅ”ami dati, kas ir nonÄkuÅ”i datu bÄzÄ tieÅ”i tagad. Ja jums tas ir trÄ«s stundas, tad jÅ«s to izmantojat kÄdu vecu datu periodu. Un jums nebÅ«s nekÄdas nozÄ«mes tam, vai ir trÄ«s stundu kavÄÅ”anÄs vai seÅ”u stundu kavÄÅ”anÄs, bet jÅ«s saÅemsiet ziÅojumus konsekventi un nebÅ«s problÄmu ar to kriÅ”anu.
Protams, jums ir jÄkontrolÄ ilgas sesijas ar replikÄm, it Ä«paÅ”i, ja nolemjat replikÄ iespÄjot hot_standby_feedback. Jo viss var notikt. MÄs nodevÄm Å”o kopiju izstrÄdÄtÄjam, lai viÅÅ” varÄtu pÄrbaudÄ«t pieprasÄ«jumus. ViÅÅ” uzrakstÄ«ja traku pieprasÄ«jumu. ViÅÅ” to palaida un devÄs dzert tÄju, un mÄs saÅÄmÄm iedibinÄto SkolotÄju. Vai varbÅ«t mÄs tur ievietojÄm nepareizu pieteikumu. SituÄcijas ir dažÄdas. Sesijas ar replikÄm ir jÄuzrauga tikpat rÅ«pÄ«gi kÄ uz Master.
Un, ja jums ir Ätri un gari vaicÄjumi par replikÄm, tad Å”ajÄ gadÄ«jumÄ labÄk tos sadalÄ«t, lai sadalÄ«tu slodzi. Å Ä« ir saite uz streaming_delay. ÄtrÄm versijÄm ir jÄbÅ«t vienai kopijai ar nelielu replikÄcijas aizkavi. IlgstoÅ”iem pÄrskatu pieprasÄ«jumiem izmantojiet kopiju, kas var aizkavÄties par 6 stundÄm vai dienu. TÄ ir pilnÄ«gi normÄla situÄcija.
MÄs novÄrÅ”am sekas tÄdÄ paÅ”Ä veidÄ:
Atrodam uzpūstus galdus.
Un mÄs to saspiežam ar ÄrtÄko rÄ«ku, kas mums ir piemÄrots.
Otrais stÄsts beidzas Å”eit. PÄriesim pie treÅ”Ä stÄsta.
ArÄ« mums ir diezgan izplatÄ«ts, kurÄ mÄs veicam migrÄciju.
JebkurÅ” programmatÅ«ras produkts aug. PrasÄ«bas tai mainÄs. JebkurÄ gadÄ«jumÄ mÄs vÄlamies attÄ«stÄ«ties. Un gadÄs, ka mums ir jÄatjaunina dati tabulÄ, proti, lai palaistu atjauninÄjumu attiecÄ«bÄ uz mÅ«su migrÄciju jaunajai funkcionalitÄtei, ko mÄs ievieÅ”am kÄ daļu no mÅ«su izstrÄdes.
Vecais datu formÄts nav apmierinoÅ”s. Teiksim, tagad pÄrejam pie otrÄs tabulas, kur man ir darÄ«jumi Å”ajos kontos. Un pieÅemsim, ka tie bija rubļos, un mÄs nolÄmÄm palielinÄt precizitÄti un darÄ«t to kapeikÄs. Un Å”im nolÅ«kam mums ir jÄveic atjauninÄjums: reiziniet lauku ar darÄ«juma summu ar simtu.
MÅ«sdienu pasaulÄ mÄs izmantojam automatizÄtus datu bÄzes versiju kontroles rÄ«kus. Teiksim Liquibase. MÄs tur reÄ£istrÄjam savu migrÄciju. MÄs to pÄrbaudÄm savÄ testu bÄzÄ. Viss ir kÄrtÄ«bÄ. AtjauninÄÅ”ana tiek veikta. Tas kÄdu laiku bloÄ·Ä darbu, bet mÄs saÅemam atjauninÄtus datus. Un mÄs varam ieviest jaunu funkcionalitÄti Å”ajÄ jomÄ. Viss tika pÄrbaudÄ«ts un pÄrbaudÄ«ts. Viss tika apstiprinÄts.
VeicÄm plÄnveida darbus un veicÄm migrÄciju.
Å eit ir parÄdÄ«ta migrÄcija ar jÅ«su priekÅ”Ä parÄdÄ«to atjauninÄjumu. TÄ kÄ tie ir mana konta darÄ«jumi, tad plate bija 15 GB. Un tÄ kÄ mÄs atjauninÄm katru rindiÅu, mÄs dubultojÄm tabulas izmÄru ar atjauninÄjumu, jo mÄs pÄrrakstÄ«jÄm katru rindiÅu.
MigrÄcijas laikÄ mÄs nevarÄjÄm neko darÄ«t ar Å”o plati, jo visi pieprasÄ«jumi tai tika salikti rindÄ un gaidÄ«ja, lÄ«dz Å”is atjauninÄjums tiks pabeigts. Bet Å”eit es gribu pievÄrst jÅ«su uzmanÄ«bu skaitļiem, kas atrodas uz vertikÄlÄs ass. Tas ir, mÅ«su vidÄjais pieprasÄ«juma laiks pirms migrÄcijas ir aptuveni 5 milisekundes un procesora slodze, diska atmiÅas lasÄ«Å”anas bloku operÄciju skaits ir mazÄks par 7,5.
MÄs veicÄm migrÄciju un atkal radÄs problÄmas.
MigrÄcija bija veiksmÄ«ga, taÄu:
Tagad vecÄs funkcionalitÄtes pabeigÅ”ana prasa ilgÄku laiku.
Galds atkal pieauga.
Servera slodze atkal kļuva lielÄka nekÄ iepriekÅ”.
Un, protams, mÄs joprojÄm ÄakarÄjam to funkcionalitÄti, kas darbojÄs labi, esam to nedaudz uzlabojuÅ”i.
Un tas atkal ir uzpÅ«Å”anÄs, kas atkal sabojÄ mÅ«su dzÄ«vi.
Å eit es parÄdu, ka tabula, tÄpat kÄ iepriekÅ”Äjie divi gadÄ«jumi, neatgriezÄ«sies pie iepriekÅ”Äjiem izmÄriem. Å Ä·iet, ka vidÄjÄ servera slodze ir atbilstoÅ”a.
Un, ja mÄs pievÄrsÄ«simies tabulai ar kontiem, mÄs redzÄsim, ka vidÄjais pieprasÄ«juma laiks Å”ai tabulai ir dubultojies. Procesora slodze un atmiÅÄ sakÄrtoto rindu skaits uzlÄca virs 7,5, taÄu bija mazÄks. Un tas uzlÄca 2 reizes procesoru gadÄ«jumÄ, 1,5 reizes bloku operÄciju gadÄ«jumÄ, t.i., mÄs saÅÄmÄm servera veiktspÄjas pasliktinÄÅ”anos. Un rezultÄtÄ - mÅ«su lietojumprogrammas veiktspÄjas pasliktinÄÅ”anÄs. TajÄ paÅ”Ä laikÄ zvanu skaits saglabÄjÄs aptuveni tÄdÄ paÅ”Ä lÄ«menÄ«.
Un galvenais Å”eit ir saprast, kÄ pareizi veikt Å”Ädas migrÄcijas. Un tie ir jÄdara. MÄs veicam Ŕīs migrÄcijas diezgan konsekventi.
Tik lielas migrÄcijas nenotiek automÄtiski. ViÅiem vienmÄr jÄbÅ«t kontrolÄtiem.
NepiecieÅ”ama zinoÅ”a cilvÄka uzraudzÄ«ba. Ja jÅ«su komandÄ ir DBA, ļaujiet to darÄ«t DBA. Tas ir viÅa darbs. Ja nÄ, tad lai to dara pieredzÄjuÅ”Äkais cilvÄks, kurÅ” prot strÄdÄt ar datu bÄzÄm.
Jauna datu bÄzes shÄma, pat ja mÄs atjauninÄm vienu kolonnu, mÄs vienmÄr sagatavojam pakÄpeniski, t.i., iepriekÅ”, pirms tiek izlaista jaunÄ lietojumprogrammas versija:
Tiek pievienoti jauni lauki, kuros ierakstÄ«sim atjauninÄtos datus.
MÄs pÄrsÅ«tÄm datus no vecÄ lauka uz jauno lauku mazÄs daļÄs. KÄpÄc mÄs to darÄm? PirmkÄrt, mÄs vienmÄr kontrolÄjam Ŕī procesa procesu. MÄs zinÄm, ka esam jau nodevuÅ”i tik daudz partiju un mums ir palikuÅ”as tik daudz.
Un otrs pozitÄ«vais efekts ir tas, ka starp katru Å”Ädu partiju mÄs noslÄdzam darÄ«jumu, atveram jaunu, un tas ļauj autovakuumam strÄdÄt atbilstoÅ”i plÄksnÄ«tei, iezÄ«mÄt termiÅus atkÄrtotai izmantoÅ”anai.
RindÄm, kas parÄdÄ«sies lietojumprogrammas darbÄ«bas laikÄ (mums joprojÄm darbojas vecÄ lietojumprogramma), mÄs pievienojam trigeri, kas raksta jaunas vÄrtÄ«bas jaunos laukos. MÅ«su gadÄ«jumÄ tas ir reizinÄjums ar simtu no vecÄs vÄrtÄ«bas.
Ja esam pilnÄ«gi spÄ«tÄ«gi un vÄlamies vienu un to paÅ”u lauku, tad pÄc visu migrÄÅ”anas pabeigÅ”anas un pirms jaunas lietojumprogrammas versijas izlaiÅ”anas mÄs vienkÄrÅ”i pÄrdÄvÄjam laukus. Vecajiem tiek dots kaut kÄds izdomÄts nosaukums, un jaunie lauki tiek pÄrdÄvÄti par vecajiem.
Un tikai pÄc tam mÄs palaižam jaunu lietojumprogrammas versiju.
Un tajÄ paÅ”Ä laikÄ mÄs nesaÅemsim uzpÅ«Å”anos un necietÄ«sim snieguma ziÅÄ.
Un tagad nedaudz sÄ«kÄk par rÄ«kiem, kurus minÄju paÅ”Ä pirmajÄ stÄstÄ.
Pirms uzpÅ«Å”anÄs meklÄÅ”anas ir jÄinstalÄ paplaÅ”inÄjums pgstattuple.
Lai jums nebÅ«tu jÄnÄk klajÄ ar jautÄjumiem, mÄs jau esam ierakstÄ«juÅ”i Å”os vaicÄjumus savÄ darbÄ. JÅ«s varat tos izmantot. Å eit ir divi pieprasÄ«jumi.
PirmÄ darbÄ«ba aizÅem diezgan ilgu laiku, taÄu tÄ parÄdÄ«s precÄ«zas uzpÅ«Å”anÄs vÄrtÄ«bas no tabulas.
Otrais iedarbojas ÄtrÄk un ir ļoti iedarbÄ«gs, ja pÄc tabulas Ätri jÄnovÄrtÄ, vai ir vai nav vÄdera uzpÅ«Å”anÄs. Un jums vajadzÄtu arÄ« saprast, ka uzpÅ«Å”anÄs vienmÄr ir klÄt Postgres tabulÄ. Å Ä« ir tÄ MVCC modeļa iezÄ«me.
Un 20% vÄdera uzpÅ«Å”anÄs vairumÄ gadÄ«jumu ir normÄli galdiem. Tas ir, jums nevajadzÄtu uztraukties un saspiest Å”o tabulu.
MÄs izdomÄjÄm, kÄ identificÄt tabulas, kas ir pietÅ«kuÅ”as, un kad tÄs ir pietÅ«kuÅ”as ar nederÄ«giem datiem.
Tagad par to, kÄ novÄrst vÄdera uzpÅ«Å”anos:
Ja mums ir maza planÅ”ete un labi diski, tas ir, planÅ”etdatorÄ lÄ«dz gigabaitam, ir pilnÄ«gi iespÄjams izmantot VACUUM FULL. ViÅÅ” uz dažÄm sekundÄm paÅems no jums ekskluzÄ«vu slÄdzeni uz galda un labi, bet viÅÅ” visu izdarÄ«s Ätri un skarbi. Ko dara VACUUM FULL? Tas aizÅem ekskluzÄ«vu slÄdzeni uz galda un pÄrraksta reÄllaika rindas no vecajÄm tabulÄm jaunajÄ tabulÄ. Un beigÄs viÅÅ” tos aizstÄj. Tas izdzÄÅ” vecos failus un aizstÄj vecos ar jauniem. Bet uz tÄ darbÄ«bas laiku tas aizÅem ekskluzÄ«vu slÄdzeni uz galda. Tas nozÄ«mÄ, ka jÅ«s nevarat neko darÄ«t ar Å”o tabulu: ne rakstÄ«t tajÄ, ne lasÄ«t, ne pÄrveidot. Un VACUUM FULL ir nepiecieÅ”ama papildu vieta diskÄ, lai ierakstÄ«tu datus.
NÄkamais rÄ«ks pg_repack. SavÄ principÄ tas ir ļoti lÄ«dzÄ«gs VACUUM FULL, jo arÄ« pÄrraksta datus no vecajiem failiem uz jauniem un aizstÄj tos tabulÄ. Bet tajÄ paÅ”Ä laikÄ tas neuzÅem ekskluzÄ«vu slÄdzeni uz galda paÅ”Ä darba sÄkumÄ, bet gan tikai tajÄ brÄ«dÄ«, kad tam jau ir gatavi dati, lai aizstÄtu failus. TÄs diska resursu prasÄ«bas ir lÄ«dzÄ«gas VACUUM FULL prasÄ«bÄm. Jums ir nepiecieÅ”ama papildu vieta diskÄ, un dažreiz tas ir ļoti svarÄ«gi, ja jums ir terabaitu tabulas. Un tas ir diezgan izsalcis procesoru, jo tas aktÄ«vi darbojas ar I/O.
TreÅ”Ä lietderÄ«ba ir pgcompacttable. Tas ir uzmanÄ«gÄks ar resursiem, jo āādarbojas pÄc nedaudz atŔķirÄ«giem principiem. Pgcompacttable galvenÄ ideja ir tÄda, ka tas pÄrvieto visas reÄllaika rindas uz tabulas sÄkumu, izmantojot tabulas atjauninÄjumus. Un tad tas uz Å”o tabulu iedarbina vakuumu, jo mÄs zinÄm, ka mums ir dzÄ«vÄs rindas sÄkumÄ un miruÅ”Äs rindas beigÄs. Un vakuums pats nogriež Å”o asti, t.i., tas neprasa daudz papildu vietas diskÄ. Un tajÄ paÅ”Ä laikÄ to joprojÄm var saspiest resursu ziÅÄ.
Viss ar instrumentiem.
Ja jums Ŕķiet, ka uzpÅ«Å”anÄs tÄma ir interesanta plaÅ”Äkai iedziļinÄÅ”anÄs ziÅÄ, Å”eit ir dažas noderÄ«gas saites:
https://www.slideshare.net/alexius2Mb/where-is-the-space-postgres ā Å is ir mana kolÄÄ£a ziÅojums. Tas ir vispÄrÄ«gs par to, kur atrodas Postgres telpa darba un dzÄ«ves laikÄ. Un ir ļoti liels un detalizÄts tehnisks gabals datu bÄzes administratoriem par uzpÅ«Å”anos.
https://github.com/dataegret/pg-utils ā Ŕī ir saite uz mÅ«su repozitoriju, kurÄ mÄs glabÄjam virkni noderÄ«gu skriptu datu bÄzes stÄvokļa pÄrbaudei. Tur jÅ«s varat atrast skriptus, lai meklÄtu uzpÅ«sties.
TreÅ”ais Šø ceturtais saites uz rÄ«kiem, kas palÄ«dzÄs samazinÄt zÄ«mes.
VairÄk centos parÄdÄ«t Å”ausmu stÄstu izstrÄdÄtÄjiem, jo āāviÅi ir mÅ«su tieÅ”ie datu bÄzu klienti un jÄsaprot, pie kÄ un kÄdas darbÄ«bas noved. Ceru, ka man izdevÄs. Paldies par jÅ«su uzmanÄ«bu!
jautÄjumi
Paldies par ziÅojumu! JÅ«s runÄjÄt par to, kÄ identificÄt problÄmas. KÄ viÅus var brÄ«dinÄt? Tas ir, man bija situÄcija, kad pieprasÄ«jumi karÄjÄs ne tikai tÄpÄc, ka tie piekļuva dažiem ÄrÄjiem pakalpojumiem. Tie bija tikai daži savvaļas pievienoÅ”anÄs. Bija daži niecÄ«gi, nekaitÄ«gi lÅ«gumi, kas pastÄvÄja vienu dienu un pÄc tam sÄka darÄ«t kÄdas muļķības. Tas ir, ļoti lÄ«dzÄ«gs jÅ«su aprakstÄ«tajam. KÄ tam izsekot? SÄdÄt un pastÄvÄ«gi skatÄ«ties, kurÅ” pieprasÄ«jums ir iestrÄdzis? KÄ to var novÄrst?
Å ajÄ gadÄ«jumÄ tas ir jÅ«su uzÅÄmuma administratoru uzdevums, nevis obligÄti DBA.
Esmu administrators.
PostgreSQL ir skats, ko sauc par pg_stat_activity, kas parÄda mainÄ«gos vaicÄjumus. Un jÅ«s varat redzÄt, cik ilgi tas tur karÄjas.
Vai man ir jÄienÄk un jÄskatÄs ik pÄc 5 minÅ«tÄm?
Iestatiet cron un pÄrbaudiet. Ja jums ir ilgtermiÅa pieprasÄ«jums, uzrakstiet vÄstuli un viss. Tas ir, jums nav jÄskatÄs ar acÄ«m, to var automatizÄt. Tu saÅemsi vÄstuli, tu uz to reaÄ£Äsi. Vai arÄ« varat fotografÄt automÄtiski.
Vai ir kÄdi acÄ«mredzami iemesli, kÄpÄc tas notiek?
Esmu uzskaitÄ«jis dažus. Citi sarežģītÄki piemÄri. Un saruna var bÅ«t ilgi.
Paldies par ziÅojumu! Es gribÄju precizÄt par pg_repack utilÄ«tu. Ja viÅa netaisa ekskluzÄ«vu slÄdzeni, tad...
ViÅa veic ekskluzÄ«vu slÄdzeni.
... tad es varÄtu zaudÄt datus. Vai manÄ lietojumprogrammÄ Å”ajÄ laikÄ nevajadzÄtu ierakstÄ«t neko?
NÄ, tas darbojas nevainojami ar tabulu, t.i., pg_repack vispirms pÄrsÅ«ta visas esoÅ”Äs dzÄ«vÄs rindas. Dabiski, ka tur notiek sava veida iekļūŔana tabulÄ. ViÅÅ” vienkÄrÅ”i met ÄrÄ Å”o zirgaste.
Tas ir, viÅÅ” tieÅ”Äm to dara galu galÄ?
Galu galÄ viÅÅ” izmanto ekskluzÄ«vu slÄdzeni, lai apmainÄ«tu Å”os failus.
Vai tas bÅ«s ÄtrÄk nekÄ VACUUM FULL?
VACUUM FULL, tiklÄ«dz sÄkÄs, uzreiz paÅÄma ekskluzÄ«vu slÄdzeni. Un, kamÄr viÅÅ” visu neizdarÄ«s, viÅÅ” viÅu nelaidÄ«s vaļÄ. Un pg_repack izmanto ekskluzÄ«vu bloÄ·ÄÅ”anu tikai faila aizstÄÅ”anas laikÄ. Å obrÄ«d jÅ«s tur nerakstÄ«sit, bet dati nepazudÄ«s, viss bÅ«s kÄrtÄ«bÄ.
Sveiki! JÅ«s runÄjÄt par automaŔīnas putekļsÅ«cÄja darbÄ«bu. Bija grafiks ar sarkanÄm, dzeltenÄm un zaļÄm ieraksta ŔūnÄm. Tas ir, dzeltenÄs ā viÅÅ” atzÄ«mÄja tÄs kÄ dzÄstas. Un rezultÄtÄ tajos var ierakstÄ«t kaut ko jaunu?
JÄ. Postgres nedzÄÅ” rindas. ViÅam ir tÄda specifika. Ja mÄs atjauninÄjÄm rindiÅu, mÄs atzÄ«mÄjÄm veco kÄ dzÄstu. Tur parÄdÄs darÄ«juma ID, kas mainÄ«ja Å”o rindu, un mÄs rakstÄm jaunu rindu. Un mums ir sesijas, kurÄs tÄs varÄtu lasÄ«t. KÄdÄ brÄ«dÄ« viÅi kļūst diezgan veci. Un autovakuuma darbÄ«bas bÅ«tÄ«ba ir tÄda, ka tas iet caur Ŕīm lÄ«nijÄm un atzÄ«mÄ tÄs kÄ nevajadzÄ«gas. Un tur var pÄrrakstÄ«t datus.
Es saprotu. Bet jautÄjums nav par to. Es nepabeidzu. PieÅemsim, ka mums ir galds. Tam ir mainÄ«ga izmÄra lauki. Un, ja es mÄÄ£inu ievietot kaut ko jaunu, tas var vienkÄrÅ”i neiederÄties vecajÄ Å”Å«nÄ.
NÄ, jebkurÄ gadÄ«jumÄ tur tiek atjauninÄta visa rinda. Postgres ir divi datu uzglabÄÅ”anas modeļi. Tas izvÄlas no datu veida. Ir dati, kas tiek glabÄti tieÅ”i tabulÄ, un ir arÄ« tos dati. Tie ir lieli datu apjomi: teksts, json. Tos uzglabÄ atseviŔķÄs plÄksnÄs. Un pÄc Ŕīm tabletÄm notiek tas pats stÄsts ar vÄdera uzpÅ«Å”anos, t.i., viss ir pa vecam. Tie ir tikai uzskaitÄ«ti atseviŔķi.
Paldies par ziÅojumu! Vai ir pieÅemami izmantot izraksta noildzes vaicÄjumus, lai ierobežotu ilgumu?
Ä»oti pieÅemami. MÄs to izmantojam visur. Un tÄ kÄ mums nav savu pakalpojumu, mÄs sniedzam attÄlinÄtu atbalstu, mums ir diezgan dažÄdi klienti. Un visi ar to ir pilnÄ«bÄ apmierinÄti. Tas ir, mums ir cron darbi, kas pÄrbauda. Seansu ilgums vienkÄrÅ”i tiek saskaÅots ar klientu, pirms kura mÄs nevienojamies. TÄ varÄtu bÅ«t minÅ«te, tÄ varÄtu bÅ«t 10 minÅ«tes. Tas ir atkarÄ«gs no pamatnes slodzes un tÄ mÄrÄ·a. Bet mÄs visi izmantojam pg_stat_activity.
Paldies par ziÅojumu! Es mÄÄ£inu piemÄrot jÅ«su ziÅojumu saviem pieteikumiem. Un Ŕķiet, ka mÄs sÄkam darÄ«jumu visur un skaidri to pabeidzam visur. Ja ir kÄds izÅÄmums, tad atcelÅ”ana joprojÄm notiek. Un tad es sÄku domÄt. Galu galÄ darÄ«jums var nesÄkties tieÅ”i. Tas, iespÄjams, ir mÄjiens meitenei. Ja es tikai atjauninÄÅ”u ierakstu, vai transakcija sÄksies programmÄ PostgreSQL un tiks pabeigta tikai tad, kad savienojums tiks atvienots?
Ja jÅ«s tagad runÄjat par lietojumprogrammas lÄ«meni, tas ir atkarÄ«gs no izmantotÄ draivera, no izmantotÄ ORM. Tur ir daudz iestatÄ«jumu. Ja esat iespÄjojis automÄtisko apÅemÅ”anos, darÄ«jums sÄkas tur un nekavÄjoties tiek aizvÄrts.
Tas ir, tas tiek aizvÄrts tÅ«lÄ«t pÄc atjauninÄÅ”anas?
Tas ir atkarÄ«gs no iestatÄ«jumiem. Es nosaucu vienu iestatÄ«jumu. Å Ä« ir automÄtiska apÅemÅ”anÄs. Tas ir diezgan bieži. Ja tas ir iespÄjots, darÄ«jums ir atvÄrts un aizvÄrts. Ja vien jÅ«s nepÄrprotami teicÄt āsÄkt darÄ«jumuā un ābeigt darÄ«jumuā, bet vienkÄrÅ”i palaidÄt pieprasÄ«jumu sesijÄ.
Sveiki! Paldies par ziÅojumu! IedomÄsimies, ka mums ir datubÄze, kas uzbriest un uzbriest, un tad vieta serverÄ« beidzas. Vai ir kÄdi rÄ«ki Ŕīs situÄcijas laboÅ”anai?
Vieta serverÄ« ir pareizi jÄuzrauga.
PiemÄram, DBA devÄs dzert tÄju, bija kÅ«rortÄ utt.
Kad tiek izveidota failu sistÄma, tiek izveidota vismaz sava veida rezerves vieta, kur dati netiek rakstÄ«ti.
Ko darīt, ja tas ir pilnīgi zem nulles?
Tur to sauc par rezervÄto vietu, t.i., to var atbrÄ«vot un atkarÄ«bÄ no tÄ, cik liela tÄ tika izveidota, tiek iegÅ«ta brÄ«va vieta. PÄc noklusÄjuma es nezinu, cik to ir. Un citÄ gadÄ«jumÄ piegÄdÄjiet diskus, lai jums bÅ«tu vieta rekonstruktÄ«vas operÄcijas veikÅ”anai. Varat izdzÄst kÄdu tabulu, kas jums garantÄti nebÅ«s vajadzÄ«ga.
Vai ir kÄdi citi rÄ«ki?
Tas vienmÄr ir roku darbs. Un lokÄli kļūst skaidrs, ko tur vislabÄk darÄ«t, jo daži dati ir kritiski un daži nav kritiski. Un katrai datubÄzei un lietojumprogrammai, kas ar to darbojas, tas ir atkarÄ«gs no uzÅÄmuma. Tas vienmÄr tiek izlemts uz vietas.
Paldies par ziÅojumu! Man ir divi jautÄjumi. PirmkÄrt, jÅ«s parÄdÄ«jÄt slaidus, kuros tika parÄdÄ«ts, ka tad, kad darÄ«jumi ir iestrÄguÅ”i, palielinÄs gan tabulas laukuma, gan indeksa lielums. Un tÄlÄk ziÅojumÄ bija virkne utilÄ«tu, kas iepako planÅ”etdatoru. KÄ ar indeksu?
ViÅi arÄ« tos iesaiÅo.
Bet vakuums neietekmÄ indeksu?
Daži strÄdÄ ar indeksu. PiemÄram, pg_rapack, pgcompacttable. Vakuums atjauno indeksus un ietekmÄ tos. Ar VACUUM FULL ideja ir pÄrrakstÄ«t visu, t.i., tas darbojas ar visiem.
Un otrais jautÄjums. Es nesaprotu, kÄpÄc pÄrskati par replikÄm ir tik ļoti atkarÄ«gi no paÅ”as replikÄcijas. Man Ŕķita, ka atskaites tiek lasÄ«tas, bet replikÄcija ir rakstÄ«ta.
Kas izraisa replikÄcijas konfliktu? Mums ir Meistars, kurÄ notiek procesi. Mums notiek auto putekļu sÅ«cÄjs. Ko Ä«sti dara autovakuums? ViÅÅ” izgriež dažas vecas lÄ«nijas. Ja Å”obrÄ«d mums ir pieprasÄ«jums pÄc kopijas, kas nolasa Ŕīs vecÄs rindas, un Master radÄs situÄcija, ka autovakuums atzÄ«mÄja Ŕīs rindas kÄ pÄrrakstÄ«Å”anas iespÄjas, tad mÄs tÄs pÄrrakstÄ«jÄm. Un mÄs saÅÄmÄm datu paketi, kad mums replikÄ jÄpÄrraksta pieprasÄ«jumam nepiecieÅ”amÄs rindas, replikÄcijas process gaidÄ«s jÅ«su konfigurÄto taimautu. Un tad PostgreSQL izlems, kas tam ir svarÄ«gÄks. Un replikÄcija viÅam ir svarÄ«gÄka par pieprasÄ«jumu, un viÅÅ” izpildÄ«s pieprasÄ«jumu, lai veiktu Ŕīs izmaiÅas replikÄ.
Andrej, man ir jautÄjums. Å ie brÄ«niŔķīgie grafiki, kurus parÄdÄ«jÄt prezentÄcijas laikÄ, vai tie ir kÄda jÅ«su lietderÄ«bas darba rezultÄts? KÄ tika izveidoti grafiki?