Pakun tutvuda 2016. aasta alguses Andrei SĂ”lnikovi esitatud ettekande "TĂŒĂŒpilised vead rakendustes, mis viivad postgreSQL-is bloat'ini" kokkuvĂ”ttega.
Selles ettekandes kĂ€sitlen peamisi vigu rakendustes, mis tekivad rakenduse projekteerimise ja koodi kirjutamise etapis. Vaatan vaid neid vigu, mis viivad postgreSQL-is bloat'ini. TĂŒĂŒpiliselt on see teie sĂŒsteemi ĂŒldise jĂ”udluse lĂ”puga tegelemise algus, ehkki esialgu ei olnud selleks mingeid mĂ€rke nĂ€ha.

Tere kĂ”igile! See ettekande ei ole nii tehniline nagu minu kolleegi eelmine. See ettekande on suunatud peamiselt tagasisĂŒsteemide arendajatele, kuna meil on piisavalt suur hulk kliente. Ja kĂ”ik nad teevad samu vigu. Nendest rÀÀgin ma teile. Selgitan, millistele halbadest tagajĂ€rgedest need vead viivad.

Miks tehakse vigu? Vigu tehakse kahe pÔhjuse tÔttu: lootuses, et Àkki lÀheb lÀbi, ja teadmatusest teatud mehhanismide osas, mis toimuvad andmebaasi ja rakenduse vahel, aga ka andmebaasis endas.
Ma toon teile kolm nĂ€idet kohutavatest piltidest, mis nĂ€itavad, kuidas kĂ”ik halvasti lĂ€ks. LĂŒhidalt rÀÀgin mehhanismist, mis seal toimub. Ja kuidas nendega tegeleda, kui need juhtuvad, ning milliseid ennetusmeetodeid kasutada vigade vĂ€ltimiseks. RÀÀgin abivahenditest ja jagan kasulikke linke.

Kasutasin testandmebaasi, kus mul oli kaks tabelit. Ăks tabel klientide arvetega, teine nende arvetega seotud tehingutega. Ja mingite ajavahemike jĂ€rel uuendame nende arvete jÀÀke.

Algandmed tabelist: see on piisavalt vĂ€ike, 2 MB. Andmebaasi vastuse aeg ja konkreetne tabeli vastuse aeg on samuti vĂ€ga hea. Ja piisavalt suur koormus â 2000 tehingut sekundis selle tabeli kohta.

Ja selle ettekande kaudu nĂ€itan teile graafikuid, et oleks selgelt aru saada, mis toimub. Alati on kaks slaidi graafikutega. Esimene slaid â see, mis toimub serveris ĂŒldiselt.
Ja antud olukorras nÀeme, et meie tabel on tÔepoolest vÀike. Indeks on jÀllegi vÀike, 2 MB. See on esimene graafik vasakul.
Serveri keskmine vastusaeg on samuti stabiilne ja madal. See on parem ĂŒlemine diagramm.
Vasak alumine diagramm nÀitab pikimaid tehinguid. Me nÀeme, et tehingud viiakse kiiresti lÔpule. Ja automaatne vaakum ei tööta veel siin, kuna see oli algtest. Edasi hakkab see tööle ja on meile kasulik.

Teine slaid on alati pĂŒhendatud katsetatavale tabelile. Antud juhul uuendame pidevalt kliendi kontode jÀÀke. Ja me nĂ€eme, et keskmine vastusaeg uuenduste operatsioonide jaoks on piisavalt hea, alla ĂŒhe millisekundi. NĂ€eme, et protsessori ressursid (see on parem ĂŒlemine diagramm) tarbitakse samuti ĂŒhtlaselt ja on piisavalt vĂ€ikesed.
Parem alumine diagramm nĂ€itab, kui palju operatiiv- ja kettamĂ€lu me otsime meie vajaliku rea leidmiseks, enne kui seda uuendame. Ja tehingute arv tabelis â 2000 sekundis, nagu ma alguses ĂŒtlesin.

Ja nĂŒĂŒd juhtub meil tragöödia. Mikski pĂ€rast tekib pikk unustatud tehing. PĂ”hjused on tavaliselt kĂ”ik banaalsed:
- Ăks levinumaid olukordi on see, et rakenduse koodis hakkame vĂ€listeenusega suhtlema ning see teenus ei vasta meile. See tĂ€hendab, et oleme avanud tehingu, teinud muudatuse andmebaasis ja lĂ€inud rakendusest posti vaatama vĂ”i mĂ”nda teise teenusesse meie infrastruktuuris, ning see ei vasta mingil pĂ”hjusel. Ja meil on sessioon, mis on seiskunud seisundis â teadmata, millal see lahendust leiab.
- Teine olukord on see, et meie koodis on mingil pÔhjusel toimunud erand (exception). Ja me ei ole erandi kÀsitlemisel tehingu sulgemist töötlenud. Ja me saime seiskunud sessiooni avatud tehinguga.
- Ja viimane â see on samuti ĂŒsna levinud juhtum. See on kehva kvaliteediga kood. MĂ”ned raamistikud avavad tehingu, see jÀÀb seisma ja te vĂ”ite oma rakenduses mitte teada, et see on seiskunud.
Mida sellised asjad endaga kaasa toovad?
Meie tabelid ja indeksid hakkavad jĂ€rsult paisuma. See on just see bloat efekt. Andmebaasi jaoks vĂ€ljendub see selles, et andmebaasi vastusaeg suureneb jĂ€rsult ja andmebaasi serveri koormus tĂ”useb. LĂ”ppkokkuvĂ”ttes kannatab rakendus. Kui varem kulus koodis andmebaasi pĂ€ringule 10 millisekundit ja oma loogikale 10 millisekundit, siis funktsioon töötas 20 millisekundit. NĂŒĂŒd on olukord palju kehvem.
Vaadakem siis, mis juhtub. Vasaku alumise graafiku jĂ€rgi on meil pikk ja aeglane tehing. Ja kui vaatame vasakus ĂŒlemises graafikus, nĂ€eme, et tabeli suurus on kahe megabaidi pealt jĂ€rsult tĂ”usnud 300 megabaidini. Samas tabeli andmete hulk ei ole muutunud, st seal on piisavalt palju prĂŒgi.

Ăldine olukord serveri keskmise vastusaaja osas on samuti muutunud mitme korra vĂ”rra. See tĂ€hendab, et kĂ”ik serveri pĂ€ringud hakkasid tĂ”siselt langema. Samuti kĂ€ivitusid Postgresis sisemised protsessid nagu autovakuu, mis ĂŒritavad midagi teha ja tarbivad ressursse.

Mis toimub meie tabeliga? Sama asi. Tabeli keskmine vastusaeg on tĂ”usnud mitu korda. Kui rÀÀkida kasutatud ressurssidest, siis nĂ€eme, et protsessori koormus on oluliselt suurenenud. See on paremal ĂŒlemisel graafikul. Koormus on suurenenud, kuna protsessor peab lĂ€bi kammima hulgaliselt kasutu ridu, et leida ĂŒks vajalik. See on paremal alumisel graafikul. Tulemusena on meie sekundis tehtud pĂ€ringute arv langenud oluliselt, kuna andmebaas ei jĂ”ua sama palju pĂ€ringutest töötleda.

Me peame tagasi elama hakkama. Uurime internetist, et pikad tehingud pÔhjustavad probleemi. Leiame ja lÔpetame selle tehingu. Ja kÔik muutub normaalseks. KÔik töötab nagu peab.
Me rahunesime, kuid mÔne aja pÀrast hakkame mÀrkama, et rakendus ei tööta enam samamoodi nagu enne avarii. PÀringud töötlevad siiski aeglasemalt, oluliselt aeglasemalt. Minu nÀite puhul on see poolteist kuni kaks korda aeglasem. Serveri koormus on samuti kÔrgem kui see oli enne avariid.

KĂŒsimus on: âMis juhtub andmebaasi sel hetkel?â. Andmebaasis toimub jĂ€rgmine olukord. Tehingute graafikul nĂ€ete, et see on peatanud ja seal tĂ”epoolest ei ole pikki tehinguid. Kuid tabeli suurused on hĂ€daolukorra ajal oluliselt kasvanud. Ja sellest ajast alates ei ole nad vĂ€henenud. Andmebaasi keskmine aeg on stabiliseerunud. Ja vastused nĂ€ivad liikuvat adekvaatselt meie jaoks vastuvĂ”etava kiiruseni. Automaatne vakumeerimine on muutunud aktiivsemaks ja on hakanud tabeliga midagi ette vĂ”tma, sest tal on vaja ĂŒmber töötada suurem hulk andmeid.

Konkreetse tabeli osas, kus me muudame jÀÀke: pÀringu vastamisaeg on nagu tagasi normaali. Kuid tegelikult on see poolteist korda kÔrgem.
Ja protsessorikoormuse osas nĂ€eme, et protsessori koormus ei ole naasnud vajalikule tasemele enne hĂ€daolukorda. Ja pĂ”hjused peituvad seal paremas alanurgas oleva graafiku juures. NĂ€ha on, et seal toimub mingisugune mĂ€lu ĂŒletamine. See tĂ€hendab, et vajaliku rea leidmiseks kulutame andmebaasi serveri ressursse kasutu andmete lĂ€bivaatamisele. Tehingute arv sekundis on stabiliseerunud.
Ăldiselt on olukord hea, kuid see on halvenenud vĂ”rreldes varasemaga. Andmebaasi selge degradatsioon, mis tuleneb meie rakendusest, mis töötab selle andmebaasiga.

Ja et aru saada, mis seal toimub, kui te pole eelmisel ettekandel olnud, siis veidi teooriat. Teooria sisemisest protsessist. Miks on automaatne vaakum ja mida see teeb?
LĂŒhidalt arusaamiseks. Teatud hetkel on meil tabel. Tabelis on read. Need read vĂ”ivad olla aktiivsed, elusad, meie jaoks hetkel vajalikud. Pildil on need mĂ€rgitud rohelise vĂ€rviga. Ja on ka surnud read, mis on juba töötanud, on uuendatud ja mille kohta on ilmunud uued kirjed. Need on juba tĂ€histatud, et nad pole andmebaasi jaoks enam huvitavad. Aga nad jÀÀvad tabelisse PostgreSQL eripĂ€ra tĂ”ttu.
Miks on autovakuum vajalik? Autovakuum jĂ”uab mingil hetkel andmebaasi, pöördub selle poole ja kĂŒsib: "Palun anna mulle kĂ”ige vanema tehingu ID, mis on praegu andmebaasis avatud." Andmebaas tagastab selle ID. Autovakuum, tuginedes sellele, lĂ€bib tabelis olemasolevad read. Kui ta nĂ€eb, et mĂ”ni rida on muutunud palju vanemate tehingute tĂ”ttu, on tal Ă”igus need markeerida ridadena, mida saame tulevikus taaskasutada, kirjutades sinna uusi andmeid. See on taustaprotsess.
Selle aja jooksul jÀtkame andmebaasiga töötamist, teeme tabelis mingeid muudatusi. Ja nendele ridadele, mida saame taaskasutada, kirjutame uusi andmeid. Niimoodi toimub meil ringkÀik, st pidevalt tekivad sinna vanad surnud read, asemele kirjutame uued read, mida vajame. See on PostgreSQL-i töö normaalne seisund.

Mis juhtus Ônnetuse ajal? Kuidas see protsess seal toimus?
Meil oli tabel, kus olid mĂ”ned elavad ja mĂ”ned surnud read. Siis tuli automaatne vaakum. Ta kĂŒsis andmebaasilt, milline on meie vanim tehing ja mis on selle ID. Ta sai selle ID, mis vĂ”ib olla mitu tundi vana vĂ”i kĂŒmme minutit vana. See sĂ”ltub sellest, kui suur on teie andmebaasi koormus. Ning ta asus otsima ridu, mida ta saaks mĂ€rgistada taaskasutatavateks, kuid ei leidnud meie tabelist selliseid rive.
Aga samal ajal jĂ€tkame me tabeliga töötamist. Teeme seal midagi, uuendame ja muudame andmeid. Mis aga andmebaasile sel ajal jÀÀb? Tal ei jÀÀ muud ĂŒle, kui kirjutada uued read olemasoleva tabeli lĂ”ppu. Seega hakkab meie tabeli suurus paisuma.
Tegelikkuses on meile tööks vajalikud rohelised read. Kuid sellise probleemi ajal on meil olukord, kus roheliste ridade protsent on kogu tabeli mahus ÀÀrmiselt madal.
Kui me teeme pĂ€ringu, peab andmebaas lĂ€bi kĂ€ima kĂ”ik read: nii punased kui ka rohelised, et leida vajalik rida. Ja tabeli paisumise mĂ”ju, mida tĂ€idavad kasutud andmed, nimetatakse âbloatâ, mis veel sööb meie ketta ruumi. Kas mĂ€letate, et oli 2 MB, nĂŒĂŒd on 300 MB? NĂŒĂŒd asendage megabaitid gigabaidiga ja te kaotate oma kettaressursid ĂŒsna kiiresti.

Millised on meie jaoks tagajÀrjed?
- Minu nÀites kasvas tabel ja indeks 150 korda. MÔnel meie kliendil on olnud isegi halvemad juhtumid, kus kettaruumi hakkas lihtsalt nappima.
- Tabelite suurus iseenesest kunagi ei vĂ€hene. Automaatne tĂŒhjendamine vĂ”ib mĂ”nel juhul lĂ”igata tabeli sabanema, kui seal on ainult surnud read. Kuid kuna toimub pidev rotatsioon, vĂ”ib ĂŒks roheline rida lĂ”puks kinni jÀÀda ja mitte uuenduda, samas kui kĂ”ik teised kirjutatakse kuskil tabeli algusesse. Kuid see on niivĂ”rd ebatĂ”enĂ€oline sĂŒndmus, et te ei peaks lootma, et teie tabel iseenesest vĂ€heneb.
- Andmebaas peab lÀbi kÀima kogu selle kasutu rivi. See kulutab meie diskiruume, protsessorite ressursse ja energiat.
- See mĂ”jutab meie rakendust otseselt, sest kui alguses kulus meil pĂ€ringule 10 millisekundit ja meie koodile 10 millisekundit, siis avarii ajal hakkasime pĂ€ringule kulutama sekundi ja koodile 10 millisekundit. See tĂ€hendab, et rakenduse jĂ”udlus on langenud korra vĂ”rra. Ja kui avarii lahendus leiti, kulub meil nĂŒĂŒd 20 millisekundit pĂ€ringule ja 10 millisekundit koodile. See tĂ€hendab, et oleme ikkagi poole vĂ€hem efektiivsed. Ja see kĂ”ik juhtus ĂŒhe tehingu tĂ”ttu, mis kukkus kinni, mis vĂ”ib-olla on ka meie sĂŒĂŒ.
- Ja kĂŒsimus on: 'Kuidas kĂ”ik tagasi tuua?', et meil oleks kĂ”ik korras ja pĂ€ringud töötaksid taas sama kiiresti kui enne avariid.

Selleks on kindel töötsĂŒkkel, mis tuleb lĂ€bi viia.
Esimene asi, mida peame tegema, on leida probleemsed tabelid, mis on paisunud. Me mÔistame, et teatud tabelite kirjutamine toimub aktiivsemalt, teistel vÀhem aktiivselt. Ja selleks kasutatakse laiendust. . Paigaldades selle laienduse, saate esitada pÀringuid, mis aitavad leida tabeleid, mis on piisavalt paisunud.
PĂ€rast nende tabelite leidmist tuleb need tihendada. Selleks on juba olemas tööriistad. Meie ettevĂ”ttes kasutame kolme tööriista. Esimene on sisseehitatud VACUUM FULL. See on karm, ranged ja halastamatu, kuid mĂ”nikord on see vĂ€ga kasulik. ja â on kolmanda osapoole utiliidid tabelite tihendamiseks. Ja need on andmebaasi suhtes Ă”rnemad.
Nende kasutamine sÔltub sellest, mis on teile mugavam. Kuid sellest rÀÀgin ma lÔpuks. Peamine on see, et on kolm tööriista. On, mida valida.
PÀrast seda, kui oleme kÔik korda saanud ja veendunud, et kÔik on hÀsti, peame teadma, kuidas selliseid olukordi tulevikus vÀltida:
- Seda on piisavalt lihtne vÀltida. Tuleb jÀlgida sessioonide kestvust Meistriserveris. Eriti ohtlikud on sessioonid, mis on idle in transaction. Need on need, mis avasid tehingu, tegid midagi ja lahkusid vÔi lihtsalt jÀid seisma, kadusid koodi sisse.
- Arendajatele on oluline testida koodi, kui esinevad sellised olukorrad. Seda ei ole keeruline teha. See on kasulik kontroll, mis aitab vÀltida paljusid "lapsepÔlve" probleeme, mis on seotud pikaajaliste tehingutega.

Nendel graafikutel soovisin nÀidata, kuidas tabel ja andmebaasi kÀitumine muutusid pÀrast seda, kui kasutasin antud juhul VACUUM FULL'i tabeli peal. See ei ole tootmiskeskkond.
Tabeli suurus naasis kiiresti normaalsesse tööseisundisse paar megabaiti. See ei mÔjutanud serveri keskmist vastusaega mÀrkimisvÀÀrselt.

Kuid meie katsetatava tabeli osas, kus me uuendasime kontode jÀÀke, nĂ€eme, et andmete uuendamise pĂ€ringute keskmine vastamisaeg on vĂ€henenud hĂ€daolukorra eelsetele tasemetele. Protsessorile rakendatud ressursid selle pĂ€ringu tĂ€itmiseks on samuti langenud hĂ€daolukorra eelsetele tasemetele. Ja parempoolne alumine graafik nĂ€itab, et nĂŒĂŒd leiame otse selle rea, mida vajame, ilma et peaksime lĂ€bima hulk surmaga lĂ”ppenud rease, mis olid enne tabeli kokkusurumist. Ja keskmine pĂ€ringute aeg on umbes samal tasemel pĂŒsinud. Kuid mul on siin pigem minu riistvara talitlushĂ€ire.

Selleks esimesed lood on lÔppenud. See on kÔige levinum ja juhtub kÔigiga, sÔltumata kliendi kogemusest, kui oskuslikud on programmeerijad. Varem vÔi hiljem juhtub see.
Teine lugu, kus me jaotame koormust ja optimeerime serveri ressursse

- Oleme juba kasvanud ja oleme tĂ”sised tegijad. MĂ”istame, et meil on replika ja oleks hea jaotada koormust: kirjutada Master'il ja lugeda replikalt. See olukord tekib tavaliselt siis, kui soovime koostada aruandeid vĂ”i ETL-i. Ja Ă€ri on sellest vĂ€ga rÔÔmus. Ta soovib vĂ€ga erinevaid aruandeid koos keeruka analĂŒĂŒsiga.
- Aruanded vĂ”tavad palju tunde, sest keerulist analĂŒĂŒsi ei saa arvutada millisekunditega. Me, nagu tublid tegijad, kirjutame koodi. Teeme rakenduses sisestusi, et kandu oleks Master'il, aruandeid tĂ€idame replikal.
- Jaotame koormust.
- KÔik töötab suurepÀraselt. Me oleme tublid.

Kuidas see situatsioon vÀlja nÀeb? Konkreetselt nende graafikute pÔhjal lisasin ma ka tehingute kestvuse replikalt. KÔik teised graafikud kuuluvad ainult Master-serverile.
Aruannete tabel on selleks ajaks mul kasvanud. Need on muutunud rohkemaks. NĂ€eme, et serveri keskmine vastamisaeg on stabiilne. NĂ€eme, et replikal on pikaajaline tehing, mis kestab 2 tundi. NĂ€eme rahulikku automaatset tĂŒhjendamist, mis töötleb surnud ridu. Ja kĂ”ik on meil hĂ€sti.

Konkreetse katse tabeli osas jÀtkame saldo vÀrskendamist kontodel. Samuti on meil stabiilne vastuse aeg pÀringule ja stabiilne ressursikasutus. Meil on kÔik hÀsti.

KÔik on hÀsti, kuni meie raportid hakkavad tulistama replikatsiooni konflikti tÔttu. Ja need tulistuvad pideva perioodilisusega.
Me hÔivame interneti ja hakkame lugema, miks see juhtub. Ja leiame lahenduse.
Esimene lahendus on suurendada replikatsiooni viivitust. Me teame, et meie raport töötab 3 tundi. Seame replikatsiooni viivituseks 3 tundi. KÀivitame kÔik, kuid meil jÀtkuvad probleemid, et raportid mÔnikord tulistuvad.
Me soovime, et kĂ”ik oleks ideaalne. JĂ€tkame uurimist. Ja leiame internetis suurepĂ€rase seadistuse â hot_standby_feedback. LĂŒlitame selle sisse. Hot_standby_feedback vĂ”imaldab meil peatada autovakumeerimise töö Meistris. Nii vabaneme tĂ€ielikult replikatsiooni konfliktidest. Ja meil on kĂ”ik raportitega hĂ€sti.

Aga mis siis juhtub meie Peaserveriga? Peaserveriga on meil totaalne hĂ€da. Praegu jĂ€lgime graafikuid, kui aktiveerisin mĂ”lemad seaded. Ja me nĂ€eme, et replika seanss on mingil viisil hakanud mĂ”jutama olukorda Peaserveris. See tĂ”esti mĂ”jutab, sest see on peatama pannud autovakuumi, mis puhastab surnud read. Meie tabeli suurus on taas taevasse tĂ”usnud. Keskmine pĂ€ringute tĂ€itmise aeg kogu andmebaasis on samuti jĂ€rsult tĂ”usnud. Autovakuumid on natuke ĂŒle koormatud.

Konkreetse tabeli osas nÀeme, et andmete vÀrskendamise aeg on samuti jÀrsult tÔusnud. Protsessori ressursikasutuse tarbimine on samuti vÀga suurenenud. Me uuesti suuname suurt hulka surnud, kasutu read. Ja selle tabeli vastamisaeg, tehingute arv on langenud.

Kuidas see vÀlja nÀeb, kui me ei tea, millest ma enne rÀÀkisin?
- Alustame probleemide otsimist. Kui me oleme esimeses osas probleemidega kokku puutunud, teame, et see vĂ”ib tuleneda pikaajalisest tehingust ning vaatame Masti. Probleem on meil Masti juures. See on ĂŒle koormatud. See kuumeneb, Load Average on lĂ€henenud sajale.
- KĂŒsimused seal tunnivad, kuid seal ei nĂ€e me mingeid pikki tehinguid. Ja ei saa aru, milles on asi. Ei saa aru, kust otsida.
- Kontrollime serveri riistvara. VÔib-olla on meil raid kokku kukkunud. VÔib-olla on mÀluplokk lÀbi kukkunud. Mis iganes vÔib juhtuda. Kuid ei, serverid on uued, kÔik töötab suurepÀraselt.
- KÔik jooksevad: administraatorid, arendajad ja direktor. Miski ei aita.
- Ja mingil hetkel hakkab kÔik ootamatult iseenesest paranema.

Replikas töötas meil sel ajal pĂ€ring ja lĂ€ks. Saime aruande. Ărikliendil on endiselt hea meel. Nagu nĂ€eme, on meie tabel taas kasvanud ja ei plaani vĂ€heneda. Sessioonide graafikul olen jĂ€tnud tĂŒkikese sellest pikast tehingust replikast, et saaksite hinnata, kui kaua olukorra stabiliseerumine aega vĂ”tab.
Seans on kadunud. Ja alles mÔne aja pÀrast hakkab server enam-vÀhem korda saama. Ja keskmine vastamisaeg pÀringutele Master-serveris stabiliseerub. Sest lÔpuks on automaatne vakumeerimine saanud vÔimaluse surnud read puhastada ja mÀrgistada. Ja ta on hakanud oma tööd tegema. Nii kiiresti, kui ta seda teeb, tuleme me korda.

Katsetataval tabelil, kus uuendame saldoid, nÀeme tÀpselt sama pilti. Keskmine saldo uuendamise aeg normaliseerub samuti jÀrk-jÀrgult. Protsessori poolt tarbitavad ressursid vÀhenevad samuti. Ja tehingute arv sekundis naaseb normaali. Kuid normaali mitte sellisena, nagu see oli enne Ônnetust.

Igal juhul saame me jÔudluses languse nagu esimesel korral, poolteise kuni kahe korra vÔrra, vahel isegi rohkem.
Me nÀisime tegevat kÔik Ôigesti. Jagasime koormust. Seade ei seisa. Targalt jagasime pÀringud, kuid ikkagi lÀks kÔik halvasti.
- Kas hot_standby_feedback'i mitte lubada? Jah, seda ei soovitata lubada ilma olulise pÔhjuseta. Sest see reguleerija mÔjutab otseselt Meistri serverit ja peatab seal automaatvakumimist. Kui te lubate seda mÔnes replikas ja unustate selle, vÔite tappa Meistri ja saada suuri probleeme rakendusega.
- Kas max_standby_streaming_delay'd suurendada? Jah, aruannete puhul â see on nii. Kui teil on kolmekordne aruanne ja te ei soovi, et see probleemide tĂ”ttu kokku kukuks, lihtsalt suurendage viivitust. Pikaajaline aruanne ei vaja kunagi andmeid, mis on just praegu andmebaasi tulnud. Kui see on kolmekordne, tĂ€hendab see, et kĂ€itate seda mĂ”ne vanema andmeperioodi jaoks. Ja kas teie jaoks on kolm vĂ”i kuus tundi viivitust â see ei mĂ€ngi mingit rolli, kuid nii saate stabiilselt aruandeid ja ei pea nende kadumise pĂ€rast muretsema.
- Muidugi on oluline jĂ€lgida pikki sessioone replikates, eriti kui olete otsustanud lubada hot_standby_feedback replikas. Sest vĂ”ib juhtuda ĂŒkskĂ”ik mis. Oleme andnud selle replikatsiooni arendajale, et ta testiks pĂ€ringute kohta. Ta kirjutas pöörase pĂ€ringu. KĂ€ivitas selle ja lĂ€ks teed juua, ning meie saime kokku pandud Masteri. VĂ”i me lubasime sinna vale rakenduse. Olukordi on palju. Sessioone replikates tuleb jĂ€lgida sama pĂ”hjalikult kui Masteris.
- Ja kui teil on replikate seas kiireid ja pikka aega kesta pĂ€ringuid, siis on sel juhul parem laadija jaotamiseks need jagada. See viitab streaming_delay'le. Kiirete jaoks tuleks omada ĂŒhte replikat vĂ€ikese replikeerimise viivitusega. Pikkade aruandlike pĂ€ringute jaoks tuleks omada replikat, mis vĂ”ib jÀÀda 6 tunni vĂ”i pĂ€eva vĂ”rra maha. See on tĂ€iesti normaalne olukord.
Eemaldame tagajÀrjed ikka sama meetodiga:
- Leidke paisutatud tabelid.
- Ja surume kokku kÔige sobivama tööriistaga, mis meile sobib.
Teine lugu sai siin otsa. Liigume kolmanda loo juurde.

Ka see on meile ĂŒsna tavaline, kus me teeme migreerimise.

- Iga tarkvara areneb. NÔuded tema suhtes muutuvad. Me tahame igal juhul areneda. Ja juhtub, et peame andmeid tabelis uuendama, just viima lÀbi vÀrskenduse meie migratsiooni plaanis uue funktsionaalsuse jaoks, mille me oma arendustegevuses juurutame.
- Vana andmeformaat ei sobi. Ătleme, et vaatame teisele tabelile, kus mul on tehingud nende kontode osas. Ja ĂŒtleme, et need olid rublades, kuid oleme otsustanud tĂ€psust tĂ”sta ja teha kopikates. Selleks peame tegema uuenduse: tehingu summa vĂ€li tuleb korrutada sajaga.
- Kaasaegses maailmas kasutame automatiseeritud andmebaasi versioonikontrolli vahendeid. Ătleme, et . Kirjutame sinna meie migratsiooni. Testime seda meie testandmebaasis. KĂ”ik lĂ€heb hĂ€sti. Uuendus toimub. See blokeerib töö mĂ”neks ajaks, aga saame uuendatud andmed. Ja saame kĂ€ivitada sellel meie uue funktsionaalsuse. KĂ”ik on testitud, kontrollitud. KĂ”ik on kinnitatud.
- Teostasime plaanilised tööd, viisime lÀbi migratsiooni.

Siin on migreerimise vĂ€rskendus, mida teie ees esitatakse. Kuna need on minu arvelduse operatsioonid, oli tabeli maht 15 GB. Ja kuna me uuendame iga rida, suurendasime tabeli suurust kahekordseks, sest kirjutasime iga rea ĂŒle.

Migreerimise ajal ei saanud me selle tabeliga midagi teha, sest kÔik pÀringud olid jÀrjekorras ja ootasid, kuni see uuendus lÔpule jÔuab. Kuid siin tahan ma juhtida teie tÀhelepanu vertikaalsel teljel olevatele numbritele. St. meil oli keskmine pÀringu aeg enne migreerimist umbes 5 millisekundit ning protsessori koormus, ketta mÀlust lugemise plokkoperatsioonide arv oli vÀiksem kui 7,5.

Migreerimine toimus, aga jÀlle tekkisid probleemid.
Migreerimine Ônnestus, kuid:
- Vana funktsionaalsus hakkas töötama kauem.
- Tabel kasvas jÀlle suuremaks.
- Serveri koormus suurenes jÀlle suuremaks, kui oli.
- Ja loomulikult jÀtkame veel selle funktsionaalsuse kallal töötamist, mis töötas hÀsti, ning oleme seda veidi parandanud.
Ja see on jÀlle bloat, mis hÀirib meid taas.

Siin ma demonstreerin, et tabel, nagu eelnevatel kahel juhul, ei plaanita tagasi varasematele mÔÔtmetele naasta. Serveri keskmine koormus nÀib olevat normaalne.

Ja kui me vaatame arvetega tabelit, siis nĂ€eme, et meie keskmine pĂ€ringu aeg on kahekordistunud. Protsessori koormus ja mĂ€lu tarvitamine on tĂ”usnud ĂŒle 7,5, kui see oli varem madalam. Protsessorite puhul on tĂ”us olnud kahekordne, plokkoperatsioonide puhul 1,5 korda, st me oleme saanud serveri jĂ”udluse halvenemise. Selle tagajĂ€rjel ka meie rakenduse jĂ”udlus.

Oluline on mĂ”ista, kuidas selliseid migratsioone Ă”igesti teha. Ja neid on vajalik teostada. Teeme neid ĂŒsna tihti.
- Selliseid suuri migratsioone ei tehta automaatselt. Need peavad olema alati kontrolli all.
- Töötaja Ôigete teadmiste jÀrelevalve on vajalik. Kui teie meeskonnas on DBA, siis las see teeb DBA. See on tema töö. Kui ei ole, siis las seda teostab kÔige kogenum inimene, kes oskab andmebaasidega töötada.
- Uus andmebaasi skeem, isegi kui me uuendame ainult ĂŒht veergu, valmistame alati etappidena, st eelnevalt enne uue rakenduse versiooni vĂ€ljalaskmist:
- Lisatakse uusi vÀlju, kuhu salvestame just vÀrskendatud andmed.
- Kandime andmeid vanast vÀljast uude vÀljast vÀikeste osade kaupa. Miks me seda teeme? Esiteks, me kontrollime alati protsessi kÀiku. Me teame, et oleme juba nii palju partiiid viinud ja meil on veel nii palju jÀÀnud.
- Teine positiivne aspekt on see, et iga sellise partii vahel sulgeme transaktsiooni, avame uue ja see vÔimaldab automaatset vaakumit tabeli suhtes töötada, mÀrgistada surnud read taaskasutamiseks.
- Ridade jaoks, mis ilmuvad rakenduse töö kÀigus (meil on endiselt aktiivne vana rakendus), lisame vallandaja, mis salvestab uued vÀÀrtused uutesse vÀljadessse. Meie puhul - see on vana vÀÀrtuse korrutamine sajaga.
- Kui me oleme tĂ”eliselt kangekaelsed ja soovime sama vĂ€lja, siis pĂ€rast kĂ”iki migratsioone ja enne uue rakenduse versiooni kĂ€ivitamist lihtsalt nimetame vĂ€ljaanded ĂŒmber. Vanad mingiks vĂ€ljamĂ”eldud nimeks ja uued vĂ€ljad nimetame vanadeks.
- Ainult pÀrast seda kÀivitame uue versiooni rakendusest.
Ja sellega ei teki meil bloat'i ega ole meil jÔudluse kaotust.
Sellega lÔppes kolmas lugu.

NĂŒĂŒd rÀÀgime veidi rohkem tööriistadest, millest mainisin kĂ”ige esimeses loos.
Enne kui otsite bloat'i, on kindlasti vajalik paigaldada laiendus. .
Kuna te ei pea ise pÀringuid vÀlja mÔtlema, oleme oma töös need pÀringud juba valmis kirjutanud. Te saate neid kasutada. Siin on esitatud kaks pÀringut.
- Esimene töötab ĂŒsna kaua, kuid nĂ€itab tĂ€pseid bloat'i vÀÀrtusi tabeli lĂ”ikes.
- Teine töötab kiiremini ja on vĂ€ga efektiivne, kui tuleb kiiresti hinnata â kas tabelis on bloat vĂ”i ei. Ja te peaksite mĂ”istma, et bloat Postgresi tabelites on alati olemas. See on MVCC mudeli omadus.
- Ja 20% bloat on enamasti tabelite puhul normaalne. See tÀhendab, et te ei pea muretsema ja seda tabelit kompresseerima.
Kuidas tuvastada vale suurusega tabeleid, oleme aru saanud, kui nad paisuvad kasututest andmetest.
NĂŒĂŒd rÀÀgime, kuidas paisumist parandada:
- Kui meil on vĂ€ike tabel ja head kettad, st kuni ĂŒhe gigabaidini tabeliis on tĂ€iesti vĂ”imalik kasutada VACUUM FULL. See annab teile eksklusiivse lukustuse tabelile paariks sekundiks, aga teeb selle kiiresti ja efektiivselt. Mida teeb VACUUM FULL? See vĂ”tab eksklusiivse lukustuse tabelile ja kirjutab vanad read uude tabelisse. LĂ”pus vahetab need omavahel. Vanad failid kustutab ja uued asendab vanadega. Ent oma töö ajal vĂ”tab see eksklusiivse lukustuse tabelilt. See tĂ€hendab, et te ei saa selle tabeliga midagi teha: ei saa kirjutada, lugeda ega muuta. Ja VACUUM FULL vajab diskil lisaruumi andmete salvestamiseks.
- JĂ€rgmine tööriist . Selle pĂ”himĂ”te on vĂ€ga sarnane VACUUM FULL-ile, kuna see kirjutab samuti andmed vanadest failidest uutesse ja asendab neid tabelis. Kuid see ei vĂ”ta alguses eksklusiivset lukku tabelile, vaid ainult siis, kui andmed on juba valmis failide asendamiseks. Diskiruumi nĂ”udmised on sarnased VACUUM FULL-iga. Teil on vaja tĂ€iendavat ruumi kettal, mis vĂ”ib vahel olla kriitiline, kui teil on terabaidised tabelid. Samuti on see ĂŒsna protsessorinĂ€ljane, kuna teeb aktiivset sisendi-vĂ€ljaannet.
- Kolmas utiliit on . See kÀsitleb ressursse sÀÀstlikumalt, kuna töötab veidi erinevatel pÔhimÔtetel. pgcompacttable peamine idee on see, et see viib tabelis kÔik elusread algusesse uuendustega. Ja seejÀrel kÀivitab vakkuumi selle tabeli peal, kuna teame, et alguses on elusread ja lÔpus surnud read. Ja vakkuum ise lÔikab juba selle sabaga, st tÀiendavat ketta ruumi ei nÔuta palju. Samuti saab seda ressursse sÀÀstlikumalt suruda.
Tööriistadega on kÔik.

Kui teema bloat teid huvitab ja soovite sĂŒgavamale sukelduda, siis siin on mĂ”ned kasulikud lingid:
- â see on minu kolleegi ettekande link. See kĂ€sitleb ĂŒldiselt, kuhu kaob ruum Postgres'i töö ja elu jooksul. Seal on vĂ€ga suur ja pĂ”hjalik tehniline osa andmebaasi administraatoritele bloat'i kohta.
- â see on link meie repole, kus hoiame hulga kasulikke skripte andmebaasi seisundi kontrollimiseks. Sealt leiate skripte bloat'i otsimiseks.
- ja lingid tööriistadele, mis aitavad teil tabeleid kokku suruda.
- â see on link minu kolleegi postitusele. Seal kĂ€sitleb ta bloat'i ĂŒsna tĂ”siselt ja pĂ”hjalikult, juba tasemel, mis on lĂ€henev administraatoritele.
Ma pĂŒĂŒdsin rohkem nĂ€idata hirmu sellel tasemel, mis arendajatele, sest nad on otsesed meie andmebaasi kliendid ja peavad aru saama, kuhu millised tegevused viivad. Loodan, et mul Ă”nnestus. AitĂ€h tĂ€helepanu eest!
KĂŒsimused
AitÀh ettekande eest! Te rÀÀkisite, kuidas probleeme tuvastada. Kuidas neid ennetada? Mul oli olukord, kus pÀringud hangusid mitte ainult seetÔttu, et need pöördusid mÔne vÀlisteenuse poole. Need olid lihtsalt mÔningad metsikud joins. Seal olid mingid pisikesed, kahjutud pÀringud, mis pÀevad viibisid, ja siis hakkasid mingit jama tegema. See on vÀga sarnane sellele, mida te kirjeldasite. Kuidas seda jÀlgida? Kas peab pidevalt vaatama, milline pÀring on kinni? Kuidas seda ennetada?
Antud juhul on see teie ettevĂ”tte administraatorite ĂŒlesanne, mitte tingimata DBA.
Mina olen administraator.
PostgreSQL-is on olemas vaade nimega pg_stat_activity, kus on nÀha kinni jÀÀnud pÀringud. Ja saate nÀha, kui kaua need seal on olnud.
Kas ma pean iga 5 minuti tagant sisse logima ja vaatama?
Seadke cron ja kontrollige. Kui teil on pikaajaline pÀring, saatke kiri ja kÔik. Te ei pea seda visuaalselt jÀlgima, see on automatiseeritav. Te saate kirja, reageerite sellele. VÔite ka automaatselt kÀituda.
Kas on selged pÔhjused, miks see juhtub?
Mina nime olen mitmed loetledes. Teised on keerukamad nÀited. See vestlus vÔib vÔtta kaua aega.
AitĂ€h ettekande eest! Soovin tĂ€psustada pg_repack utiliidi kohta. Kui see ei kehtesta eksklusiivset lukku, siisâŠ
See loob eksklusiivse luku.
⊠Siis vÔin ma potentsiaalselt andmeid kaotada. Minu rakendus ei tohi sel ajal midagi kirjutada?
Ei, see töötab rahulikult tabeliga, st pg_repack liigub esmalt kÔik elavad read, mis seal on. Loomulikult toimub seal mingisugune kirje tabelis. Ta lihtsalt lisab selle lÔpu.
St lÔpuks teeb ta seda ikkagi?
LÔpuks vÔtab ta eksklusiivse luku, et neid faile vahetada.
Kas see on kiiremini kui VACUUM FULL?
VACUUM FULL, kui see alustas, vÔttis kohe eksklusiivse luku. Ja seni, kuni ta ei ole kÔike lÔpetanud, ei vabasta ta seda. Aga pg_repack vÔtab eksklusiivse luku ainult failide vahetamise hetkeks. Sel ajal ei saa te sinna kirjutada, kuid andmed ei kao, kÔik on korras.
Tere! Te rÀÀkisite automaatse vaakumi toimimisest. Seal oli graafik punaste, kollaste ja roheliste lahtritega. T. e. kollased â ta mĂ€rkis need kui kustutatud. Ja seetĂ”ttu saab neisse kirjutada midagi uut?
Jah. Postgres ei kustuta ridu. Sellel on selline eripĂ€ra. Kui me uuendame rida, siis mĂ€rkisime vana kui kustutatud. Seal on tehingu id, mis muutis seda rida, ja kirjutame uue rea. Ja meil on sessioonid, mis vĂ”ivad neid lugeda. Mingil hetkel muutuvad nad juba tĂ€iesti vanaks. Ja automaatse vaakumi töö idee on selles, et ta jookseb nende ridade vahelt lĂ€bi ja mĂ€rkib nad kui mittevajalikud. Ja sinna saab andmeid ĂŒle kirjutada.
MĂ”istsin. Kuid kĂŒsimus ei ole sellest. Ma ei lĂ”petanud. Oletame, et meil on tabel. Seal on muutuva suurusega vĂ€ljad. Ja kui ma ĂŒritan midagi uut lisada, siis see ei pruugi lihtsalt vanasse lahtrisse mahtuda.
Ei, seal igal juhul vĂ€rskendatakse kogu rida. Postgresis on andmete salvestamiseks kaks mudelit. See valib andme tĂŒĂŒbist lĂ€htuvalt. On andmeid, mis salvestatakse otse tabelisse, ning on ka tos-andmeid. Need on suured andmehulgad: tekst, json. Need salvestatakse eraldi tabelitesse. Ja nende tabelite puhul kehtib sama lugu bloat'iga, st kĂ”ik on sama. Lihtsalt need on eraldi vĂ€lja toodud.
AitÀh ettekande eest! Kui vastuvÔetav on kasutada pÀringute kestuse piiramiseks statement timeout'i?
VĂ€ga vastuvĂ”etav. Me kasutame seda igal pool. Kuna meil ei ole oma teenuseid, pakume veebipĂ”hist tuge ning meie kliendid on ĂŒsna erinevad. KĂ”ik on sellega tĂ€iesti rahul. St meil on cron'is ĂŒlesanded, mis kontrollivad. Lihtsalt lepitakse kliendiga kokku sessioonide kestus, mille eel me ei katkesta. See vĂ”ib olla minut vĂ”i 10 minutit. See sĂ”ltub andmebaasi koormusest ja selle eesmĂ€rgist. Kuid kĂ”igil kasutame pg_stat_activity.
AitĂ€h ettekande eest! Proovin teie ettekannet oma rakendustele rakendada. Tundub, et igal pool alustame tehingut, lĂ”petame selle selgelt. Kui on mingisugune erand, siis ikkagi toimub rollback. Siis mĂ”tlesin. Tehing vĂ”ib alata ju ka mitte selgelt. See vĂ”ib olla vihje tĂŒdrukule, ilmselt. Kui ma lihtsalt uuendan запОŃĐž, algab PostgreSQLâis tehing ja see lĂ”peb alles siis, kui ĂŒhendus katkeb?
Kui rÀÀgite nĂŒĂŒd rakenduse tasemest, siis see sĂ”ltub kasutatavast draiverist, sellest ORM-ist, mida kasutatakse. Seal on palju seadistusi. Kui teil on auto commit sisse lĂŒlitatud, siis tehing algab ja kohe sulgub.
St. tÀhendab, et see sulgub kohe pÀrast uuendamist?
See sĂ”ltub seadistustest. Ăht seadistust mainisin. See on auto commit. See on ĂŒsna levinud. Kui see on sisse lĂŒlitatud, siis tehing avatakse ja suletakse. Kui te ei ole selgelt öelnud 'start transaction' ja 'end transaction', vaid lihtsalt kĂ€ivitasite pĂ€ringu seansis.
Tere! AitÀh ettekande eest! Kujutame ette, et meil on andmebaas, mis kasvab pidevalt ja serveris hakkab ruum otsa saama. Kas on mingeid tööriistu, et seda olukorda parandada?
Serveri ruumi tuleks kindlasti jÀlgida.
NÀiteks DBA lÀks teed jooma, oli kuurordis jne.
Kui failisĂŒsteem luuakse, siis seal luuakse vĂ€hemalt mingi reserveeritud ruum, kuhu andmeid ei kirjutata.
Ent kui ruum on tÀiesti nullis?
Seal on see nimega reserved space, st seda on vÔimalik vabastada ja sÔltuvalt sellest, kui suurt seda on loodud, saate vabade kohtade. Vaikimisi ei tea ma, kui palju seal on. Teises olukorras tuleb toimetada kettaid, et oleks ruumi taastamise operatsiooni lÀbiviimiseks. Saate eemaldada mingi tabeli, mis teil kindlasti ei ole vajalik.
Teisi tööriistu ei ole?
See on alati kÀsitsi tehtav töö. Ja ruumi osas selgub, mis seal parem oleks teha, kuna andmed on kriitilised ja mitte kriitilised. Iga andmebaasi ja rakenduse puhul, mis sellega töötab, sÔltub see ettevÔttest. Alati toimub otsus ruumi alusel.
AitĂ€h ettekande eest! Mul on kaks kĂŒsimust. Esiteks, te demonstreerisite slaide, kus nĂ€idati, et hetkeseisus olevate tehingute korral kasvab nii tabeliruumi maht kui ka indeksi suurus. Ja edasi ettekandes oli palju utiliite, mis pakivad tabelit. Aga mis juhtub indeksiga?
Need pakivad ka neid.
Aga vakuum ei puuduta indexit?
MÔned töötlused puudutavad indekseid. NÀiteks, pg_rapack, pgcompacttable. Vakuum taastab indeksid, see mÔjutab neid. VACUUM FULL-i mÔte on kÔik uuesti kirjutada, st see töötab kÔigiga.
Ja teine kĂŒsimus. Ma ei saanud aru, miks raportid replikaates nii palju sĂ”ltuvad replikatsioonist. Mul tundus, et raportid on lugemine ja replikatsioon on kirjutamine.
Milles seis on replikatsiooni konflikt? Meil on Master, kus toimuvad protsessid. Meil on automaatne vaakum. Mida teeb automaatne vaakum? Ta eemaldab mĂ”ned vanad read. Kui sel ajal on replikas pĂ€ring, mis loeb neid vanu ridu, ja Masteris on olukord, kus automaatne vaakum on need read mĂ€rkinud kui vĂ”imalikud kirjutamiseks, siis me kirjutame need ĂŒle. Ja me saame andmepaki, kui peame kirjutama ĂŒle need read, mis on vajalikud pĂ€ringu jaoks replikas, siis replikatsioon ootab mÀÀratud ajamisaega, mille olete seadistanud. Ja siis otsustab PostgreSQL, mis on tema jaoks olulisem. Ja replikatsioon on tema jaoks olulisem kui pĂ€ring ning ta katkestab pĂ€ringu, et teha need muudatused replikas.
Andrei, mul on kĂŒsimus. Need imelised graafikud, mida te esitlemise ajal nĂ€itasite, on need tulemused mingist teie utiliidist? Millest graafikud on koostatud?
See on teenus .
Kas see on kaubanduslik toode?
Jah. See on kaubanduslik toode.
Allikas: habr.com
