TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Soovitan tutvuda Andrei Salnikovi 2016. aasta alguses esitatud ettekande "TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is" kokkuvĂ”ttega.

Selles ettekandes kĂ€sitlen peamisi vigu rakendustes, mis tekivad rakenduse projekteerimise ja kodeerimise etapis. Keskendun vaid neile vigadele, mis viivad bloat'i tekkimiseni PostgreSQL-is. Reeglina on see teie sĂŒsteemi jĂ”udluse languse algus, kuigi algselt ei olnud mingeid nĂ€iliselt halbu mĂ€rke.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Tere tulemast! See ettekande ei ole nii tehniline kui eelmine minu kolleegi esitlus. See ettekande on suunatud peamiselt tagaplaneedi sĂŒsteemide arendajatele, kuna meil on piisavalt palju kliente. Ja kĂ”ik nad teevad samu vigu. Nendest rÀÀgin ma teile. Selgitan, millistele fataalsetele ja halbadele tagajĂ€rgedele need vead viivad.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Miks tekivad vead? Need tekivad kahe pÔhjusel: mÔnikord lootuses, et Àkki lÀheb Ônneks, ja teadmatusest mehhanismide osas, mis toimuvad andmebaasi ja rakenduse vahel, samuti andmebaasi enda sees.

Toon teile kolm nĂ€idet koos kohutavate piltidega, kuidas kĂ”ik halvemaks lĂ€heb. RÀÀgin lĂŒhidalt mehhanismist, mis seal toimub. Ja kuidas nendega toime tulla, kui nad juhtuvad, ja milliseid ennetavaid meetodeid kasutada vigade vĂ€ltimiseks. RÀÀgin abistavatest tööriistadest ja annan kasulikke linke.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Kasutasin testandmebaasi, kus mul oli kaks tabelit. Üks tabel klientide arvetega, teine nende arvete tehingutega. Ja teatud perioodilisusega uuendame nende arvetel olevaid jÀÀke.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Tabeli algandmed: see on piisavalt vĂ€ike, 2 MB. Andmebaasi ja konkreetselt tabeli vastuse aeg on samuti vĂ€ga hea. Ja pĂ€ris hea koormus – 2000 tehingut sekundis tabeli kohta.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Ja kogu selle ettekande jooksul nĂ€itan teile graafikuid, et oleks selge, mis toimub. Alati on 2 slaidi graafikut. Esimene slaid – see, mis toimub serveris ĂŒldiselt.

Ja antud olukorras nÀeme, et meie tabel on tÔeliselt vÀike. Indeks on vÀike, 2 MB. See on esimene graafik vasakul.

Keskmine vastuse aeg serveris on samuti stabiilne, vĂ€ikene. See on ĂŒlemises paremas graafikus.

Vasaku alumise diagrammi peal on kÔige pikemad tehingud. NÀeme, et tehingud tÀidetakse kiiresti. Ja automaatne vaakum ei tööta veel, kuna see oli starditest. Edasi hakkab see tööle ja on meile kasulik.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Teine slaid on alati pĂŒhendatud katsetatavale tabelile. Selles olukorras uuendame pidevalt kliendi kontode jÀÀke. Ja me nĂ€eme, et keskmine reageerimisaeg uuendustegevuses on piisavalt hea, vĂ€hem kui millisekund. NĂ€eme, et protsessori ressursid (see on paremas ĂŒlanurgas olev diagramm) on samuti tasakaalustatult ja piisavalt vĂ€ikesed.

Paremas alumises diagrammis nĂ€itab, kui palju operatiivset ja kettamĂ€lu me otsime meie vajaliku rida, enne kui selle uuendame. Ja tabeli operatsioonide arv – 2000 sekundis, nagu ma ĂŒtlesin alguses.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Ja nĂŒĂŒd toimub meil tragöödia. Mingil pĂ”hjusel tekib pikk unustatud tehing. PĂ”hjused on tavaliselt kĂ”ik banaalsed:

  • Üks levinumaid pĂ”hjusi on see, et me rakenduse koodis alustasime vĂ€lisesse teenusesse pöördumist. Ja see teenus ei vasta meile. St avasime tehingu, tegime muudatuse andmebaasis ja lĂ€ksime rakendusest e-kirju lugema vĂ”i mĂ”nda teise teenusesse meie infrastruktuuris, ja see ei vasta meile mingil pĂ”hjusel. Ja meil jĂ€i seanss seisundisse – ei ole teada, millal see lahtiseks saab.
  • Teine olukord, kui meie koodis mingil pĂ”hjusel tekkis erand. Ja me ei töötanud vĂ€lja tehingu sulgemist erandi korral. Ja meil tekkis rippuv seanss avatud tehinguga.
  • Ja viimane – see on ka ĂŒsna levinud juhtum. See on kehva kvaliteediga kood. MĂ”ned raamistikud avavad tehingu. See ripub ja te ei pruugi rakenduses teada, et see on riputatud.

Kuhu need asjad viivad?

Sellest tulenevalt hakkavad meie tabelid ja indeksid jĂ€rsult paisuma. See on just see bloati efekt. Andmebaasi jaoks vĂ€ljendub see selles, et meie andmebaasi reageerimisaeg suureneb jĂ€rsult, koormus andmebaasi serverile tĂ”useb. Ja tulemuseks hakkab rakendus kannatama. Sest kui te kulutasite koodis 10 millisekundit andmebaasi pĂ€ringule, 10 millisekundit oma loogika jaoks, siis teie funktsioon töötas 20 millisekundit. Ja nĂŒĂŒd on teie olukord tĂ€iesti kurb.

Ja vaatame, mis toimub. Vasak alammÔÔtja nĂ€itab, et meil on pikad tehingud. Ja kui vaatame vasakut ĂŒlemist graafikut, siis nĂ€eme, et meie kahe megabaidi suurune tabel on jĂ€rsku tĂ”usnud 300 megabaidini. Samas andmete hulk tabelis ei muutunud, st seal on palju rĂ€mpsu.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Üldine olukord keskmise serveri vastuseaja osas on samuti muutunud mitmes jĂ€rjestikus. St kĂ”ik serveripĂ€ringud on tĂ”siselt kasvanud. Ja samal ajal on kĂ€ima lĂ€inud Postgresi sisemised protsessid autovakuumi nĂ€ol, mis ĂŒritavad midagi teha ja vĂ”tavad ressursse.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Mis meie tabeliga juhtub? TĂ€pselt sama asi. Keskmine vastuseaeg tabeli jaoks on tĂ”usnud mitmes jĂ€rjestikus. Kui rÀÀkida ressursside tarbimisest, siis nĂ€eme, et protsessorile on koormus jĂ€rsult suurenenud. See on paremal ĂŒlemisel graafikul. Ja see suurenemine toimub, kuna protsessor peab otsima palju kasutut rida ĂŒhe vajaliku leidmiseks. See on paremal alumisel graafikul. Ja tulemuseks on see, et meie pĂ€ringute arv sekundis hakkas jĂ€rsult vĂ€henema, kuna andmebaas ei suuda töödelda sama palju pĂ€ringuid.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Peame uuesti ellu Àrkama. Uurime internetist, et pikad tehingud toovad probleeme. Leiame ja lÔpetame selle tehingu. Ja siis muutub kÔik normaalseks. KÔik töötab nagu peab.

Me rahunesime, kuid mĂ”ne aja pĂ€rast hakkame mĂ€rkama, et rakendus ei tööta enam nagu oli enne avariid. PĂ€ringud töödeldakse siiski aeglasemalt, oluliselt aeglasemalt. ÜkskĂ”ik kui poolteist kuni kaks korda aeglasemalt, mis puudutab minu nĂ€idet. Serveri koormus on samuti kĂ”rgem kui avariieelsel ajal.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

KĂŒsimus on: „Mis toimub andmebaasiga sel hetkel?“. Andmebaasis toimub jĂ€rgnev olukord. Tehingute graafikul nĂ€ete, et see on peatunud ja seal tĂ”epoolest ei ole pikki tehinguid. Kuid tabeli suurus avarii ajal on saanud fataalselt suureks. Ja sellest ajast alates ei ole see vĂ€henenud. Keskmine aeg andmebaasi jaoks on stabiliseerunud. Ja vastused tunduvad liikuvat normaalselt, meie jaoks vastuvĂ”etava kiirusena. Autovakuum on muutunud aktiivsemaks ja hakkas tegema midagi tabeliga, kuna tal on vaja töödelda suuremat hulka andmeid.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Konkreetsete arve tabeli osas, kus me muudame jÀÀke: pÀringu vastusaeg on nÀiliselt naasnud normaalsusesse. Kuid tegelikult on see poolteise korra vÔrra kÔrgem.

Ja protsessori koormuse osas nĂ€eme, et protsessori koormus ei ole naasnud enne avariid vajaliku tasemeni. PĂ”hjused peituvad just paremas alanurgas olevas graafikus. On nĂ€ha, et seal toimub teatud koguse mĂ€lu ĂŒletamine. See tĂ€hendab, et vajaliku rea leidmiseks kulutame andmebaasi serveri ressursse mĂ”ttetu andmete töötlemise tĂ”ttu. Tehingute arv sekundis on stabiliseerunud.

Üldiselt on kĂ”ik hĂ€sti, aga olukord on halvem kui enne. Selge andmebaasi deklareerimine meie rakenduse tagajĂ€rjel, mis töötab selle andmebaasiga.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Ja et aru saada, mis seal toimub, kui te ei olnud eelmisel ettekandel, siis nĂŒĂŒd natuke teooriat. Teooria sisemisest protsessist. Miks on autovakuum ja mida see teeb?

LĂŒhidalt arusaamiseks. Teatud hetkel on meil tabel. Tabelis on meil read. Need read vĂ”ivad olla aktiivsed, elavad, meie jaoks vajalikud. Joonisel on nad rohelise vĂ€rviga mĂ€rgitud. Ja on surnud read, mis on juba tööd teinud, on uuendatud, millele on lisatud uusi kirjeid. Ja need on mĂ€rgitud, et nad ei ole andmebaasile enam huvitavad. Kuid nad jÀÀvad tabelisse Postgresi eripĂ€ra tĂ”ttu.

Miks on vajalik autovakuum? Autovakuum tuleb teatud hetkel, pöördub andmebaasi poole ja kĂŒsib: "Palun anna mulle kĂ”ige vanema tehingu id, mis on praegu andmebaasis avatud." Andmebaas tagastab selle id. Ja autovakuum tuginedes sellele lĂ€bib tabeli read. Ja kui ta nĂ€eb, et teatud read on muutunud palju vanemate tehingute tĂ”ttu, siis on tal Ă”igus neid mĂ€rgistada ridadena, mida saame tulevikus uuesti kasutada, kirjutades sinna uusi andmeid. See on taustprotsess.

Selle ajal jÀtkame andmebaasiga töötamist, jÀtkame tabelis muudatuste tegemist. Ja nendele ridadele, mida saame uuesti kasutada, kirjutame uusi andmeid. Nii et meil tekib ringkÀik, st seal tekib pidevalt mÔningaid vanu surnud ridad, mille asemel kirjutame uusi ridu, mis meile vajalikud. Ja see on PostgreSQL-i töötamise normaalne seisund.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Mis juhtus avarii ajal? Kuidas see protsess seal toimus?

Meil oli mingisugune tabel, mĂ”ned read olid elavad ja mĂ”ned surnud. Siis tuli automaatne vaakum. See kĂŒsis andmebaasist, 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 koormus teie andmebaasis. Ja ta lĂ€ks otsima ridu, mida ta saaks mĂ€rgistada taaskasutatavateks. Ja ta ei leidnud meie tabelis selliseid ridu.

Aga samal ajal jĂ€tkame me tabeliga töötamist. Teeme seal midagi, uuendame, muudame andmeid. Ja mida andmebaas sel ajal teeb? Tal ei jÀÀ muud ĂŒle, kui kirjutada uusi ridu olemasoleva tabeli lĂ”ppu. Ja seelĂ€bi meie tabeli suurus hakkab paisuma.

Tegelikult vajame me töötamiseks rohelisi ridu. Aga sellise probleemi ajal on meil nii, et roheliste ridade protsent kogu tabeli mahus on ÀÀrmiselt madal.

Ja kui me sooritame 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, mis sisaldab kasutu teavet, nimetatakse "bloat", mis sööb Ă€ra meie kettaruumi. Kas mĂ€letate, oli 2 MB, nĂŒĂŒd on 300 MB? NĂŒĂŒd vahetage megabaitide asemel gigabaitide ja te vĂ”ite kiiresti kaotada kogu oma kettaruumi.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Millised tagajÀrjed vÔivad meile olla?

  • Minu nĂ€ites kasvas tabel ja indeks 150 korda. MĂ”nel meie kliendil on olnud isegi tĂ”sisemaid juhtumeid, kui kettaruumi hakkas otsa saama.
  • Tabelite suurus ei vĂ€hene kunagi iseenesest. Automaatne vaakum vĂ”ib mĂ”nel juhul tabeli sabajupi Ă€ra lĂ”igata, kui seal on ainult surnud read. Aga kuna toimub pidev rotatsioon, vĂ”ib ĂŒks roheline rida lĂ”pus jÀÀda seisma ja mitte uuenduda, samas kui kĂ”ik teised kirjutatakse kuskil tabeli algusesse. Aga see on nii ebatĂ”enĂ€oline sĂŒndmus, et teie tabel ise mingil mÀÀral vĂ€heneks, mis ei ole midagi, millele tasuks loota.
  • Andmebaas peab lĂ€bi töötama kogu hulga mĂ”ttetuid ridu. Ja me kulutame kettaruumi, kulutame protsessori ressursse ja elektrit.
  • Ja see mĂ”jutab otseselt meie rakendust, kuna kui alguses kulutasime pĂ€ringule 10 millisekundit ja meie koodile samuti 10 millisekundit, siis avarii ajal hakkasime kulutama pĂ€ringule ĂŒhe sekundi ja koodile 10 millisekundit, st rakenduse jĂ”udlus vĂ€henes oluliselt. Kui avarii lĂ”petati, kulus meil 20 millisekundit pĂ€ringule ja 10 millisekundit koodile. See tĂ€hendab, et meie jĂ”udlus langes endiselt 1,5 korda. Ja see kĂ”ik oli tingitud ĂŒhest tehingust, mis jĂ€i pidama, ilmselt meie enda sĂŒĂŒl.
  • Ja kĂŒsimus on: 'Kuidas kĂ”ik tagasi saada?', et meie sĂŒsteem toimiks taas sama kiiresti nagu enne avariid.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Selleks on olemas kindel töötsĂŒkkel, mida tuleb jĂ€rgida.

Esiteks peame leidma probleemsed tabelid, mis on paisunud. Me mÔistame, et teatud tabelitesse toimub aktiivsem kirjutamine, teistesse aga vÀhem. Selleks kasutatakse laiendust pgstattuple. PÀrast selle laienduse installimist saate kirjutada pÀringuid, mis aitavad leida piisavalt paisunud tabeleid.

PĂ€rast nende tabelite leidmist tuleb need kokku vĂ”tta. Selleks on olemas tööriistad. Meie ettevĂ”ttes kasutame kolme tööriista. Esimene on sisseehitatud VACUUM FULL. See on karm, range ja halastamatu, kuid mĂ”nikord on see vĂ€ga kasulik. Pg_repack ja pgcompacttable – need on kolmandate osapoolte utiliidid tabelite kokku pakkumiseks. Need on andmebaasi suhtes Ă”rnemad.

Neid kasutatakse sÔltuvalt sellest, mis teile mugavam on. Kuid sellest rÀÀgin ma lÔpupoole. Peamine on see, et meil on kolm tööriista. On, mida valida.

PÀrast kÔigi parandamist ja veendumist, et kÔik on hÀsti, peame teadma, kuidas tulevikus selliseid olukordi Àra hoida:

  • Seda on ĂŒsna lihtne vĂ€ltida. Tuleb jĂ€lgida seansside kestvust Master-serveris. Eriti ohtlikud seansid on olukorras idle in transaction. Need on need, kus avati tehing, tehti midagi ja mindi minema vĂ”i lihtsalt jĂ€i pidama, kadus koodi sisse.
  • Ja teie, kui arendajad, peate oma koodi testima selliste olukordade tekkimise hetkel. See ei ole keeruline. See on kasulik kontroll. Te vĂ€ltite paljusid 'laste' probleeme, mis on seotud pikemate tehingutega.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Nendel graafikutes soovisin nÀidata, kuidas tabel ja andmebaasi kÀitumine muutusid pÀrast seda, kui ma lÀksin selles konkreetses juhul VACUUM FULL tabelis. See pole mul tootmisserver.

Tabeli suurus naasis kohe normaalsesse tööolekusse paariks megabaitiks. See ei avaldanud keskmisele serveri vastusajale suurt mÔju.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Kuid meie katsetatava tabeli puhul, kus uuendasime kontode jÀÀke, nĂ€eme, et keskmine vastusaja andmete uuendamise pĂ€ringus on vĂ€henenud enne avariide taset. Protsessori ressursid, mida selle pĂ€ringu tĂ€itmiseks tarbiti, on samuti langenud enne avariide taset. Ja paremal alumises graafikus nĂ€eme, et nĂŒĂŒd leiame kohe tĂ€pselt selle rea, mida vajame, ilma et peaksime lĂ€bi kĂ€ima hulk surnud reasid, mis olid enne tabeli tihendamist. Ja keskmine pĂ€ringute aeg on peaaegu samal tasemel pĂŒsinud. Aga siin on mul pigem minu seadme viga.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Sellega esimene lugu lÔppes. See on kÔige levinum. Ja see juhtub kÔigil, sÔltumata kliendi kogemusest vÔi kui kvalifitseeritud programmistid seal on. Varem vÔi hiljem see juhtub.

Teine lugu, kus jagame koormust ja optimeerime serveri ressursse.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

  • Me oleme juba kasvanud ja saanud tĂ”sisteks mĂ€ngijateks. Ja mĂ”istame, et meil on replikatsioon ja oleks hea koormust tasakaalustada: kirjutades Meistrile ja lugedes replikatsioonilt. See olukord tekib tavaliselt, kui soovime koostada mĂ”ningaid aruandeid vĂ”i ETL. Ja Ă€ri on selle ĂŒle vĂ€ga rÔÔmus. Nad soovivad vĂ€ga erinevaid aruandeid koos keeruka analĂŒĂŒtikaga.
  • Aruanded on mitu tundi, kuna keerukat analĂŒĂŒsi ei saa sekundite jooksul arvutada. Me, kui julged poisid, kirjutame koodi. Teeme rakenduses sisestusi, et me kirjutame Meistrile, aruandeid teeme replikatsioonilt.
  • Jagame koormust.
  • KĂ”ik töötab suurepĂ€raselt. Me oleme tublid.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Kuidas see olukord vĂ€lja nĂ€eb? Konkreetselt nendel graafikutel lisasin ma veel replikatsiooniga tehingute kestuse. KĂ”ik ĂŒlejÀÀnud graafikud kuuluvad ainult Meistriserverile.

Raportide tabel minu kÀesoleval hetkel on kasvanud. Neid on rohkem. NÀeme, et serveri keskmine reageerimisaeg on stabiilne. NÀeme, et replika peal on meil pikaajaline tehing, mis kestab juba 2 tundi. NÀeme rahulikku automaatvÔrgu tööd, mis töötleb surnud ridu. Ja meie olukord on hea.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Konkreetselt katsetatava tabeli osas jÀtkame seal kontode jÀÀkide vÀrskendamist. Ja meil on samuti stabiilne reageerimisaeg pÀringutele, stabiilne ressursi tarbimine. Meie olukord on hea.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

KÔik on hÀsti seni, kuni meie raportid ei hakka pihta replikeerimise konfliktiga. Ja nad pÔrkavad kokku pideva perioodilisusega.

Uurime internetti ja hakkame lugema, miks see juhtub. Ja leiame lahenduse.

Esimene lahendus on suurendada replikeerimise viivitust. Me teame, et meie raport töötab 3 tundi. Seame replikeerimise viivituseks 3 tundi. KÀivitame kÔik, kuid meil on siiski jÀtkuvalt probleeme, et raportid mÔnikord katkestatakse.

Soovime, et kĂ”ik oleks tĂ€iuslik. Uurime edasi. Ja leiame internetist suurepĂ€rase seadistuse – hot_standby_feedback. LĂŒlitame selle sisse. Hot_standby_feedback vĂ”imaldab meil peatada automaatvĂ”rgu töö Masteris. Seega saame tĂ€ielikult vabaneda replikeerimise konfliktidest. Ja meie raportid toimivad kĂ”ik hĂ€sti.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Aga mis toimub sel ajal meie Master-serveriga? Master-serveris on tĂ€ielik katastroof. Praegu vaatame graafikuid, kui lĂŒlitasin sisse mĂ”lemad seadistused. Ja nĂ€eme, et sessioon replika peal hakkas mingil moel mĂ”jutama olukorda Master-serveris. Ta tĂ”epoolest mĂ”jutab, sest see peatas automaatvĂ”rgu, mis puhastab surnud ridu. Meie tabeli suurus on taas tĂ”usnud. Keskmine pĂ€ringute tĂ€itmise aeg kogu andmebaasis on samuti tĂ”usnud. AutomaatvĂ”rgud on natuke pingestunud.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Konkreetselt meie tabeli osas nÀeme, et andmete vÀrskendamine on samuti tÔusnud. Protsessori ressursi tarbimine on samuti vÀga palju suurenenud. Meie kÀest on tagasi sonteerunud suur hulk surnud ja kasutut rida. Ja vastuse aeg selle tabeli osas, tehingute arv on langenud.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Kuidas see vÀlja nÀeks, kui me ei tea, millest ma seni rÀÀkisin?

  • Alustame probleemide otsimist. Kui me kohtasime probleeme esimese osaga, siis teame, et see vĂ”ib olla seotud pika tehinguga ja uurime Masterit. Probleem on meil Masteris. See jĂ€relpĂ”rutab. See kuumeneb, selle koormuse keskmine on saja ringis.
  • Seal tĂ”kked pĂ€ringud, kuid me ei nĂ€e seal mingeid pikaajalisi tehinguid. Ja ei saa aru, mis toimub. Ei saa aru, kus otsida.
  • Kontrollime serveri riistvara. VĂ”ib-olla on meil raid purunenud. VĂ”ib-olla on meil mĂ€lukaart tuksis. Midagi vĂ”ib juhtuda. Aga ei, serverid on uued, kĂ”ik töötab suurepĂ€raselt.
  • KĂ”ik jooksevad ringi: administraatorid, arendajad ja direktor. Miski ei aita.
  • Ja mingil hetkel hakkab kĂ”ik ootamatult iseenesest taastuma.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Meil on replika ajal seal pĂ€ring töötatud ja lahkunud. Saime aruande. Äri on endiselt rahul. Nagu nĂ€eme, on meie tabel taas kasvanud ja ei plaani vĂ€heneda. Seansside graafikul jĂ€tsin tĂŒki sellest pikast tehingust replikast, et saaksite hinnata, kui kaua aega kulub, kuni olukord stabiliseerub.

Seanss lahkus. Ja alles mÔne aja pÀrast tuleb server enam-vÀhem korras tagasi. Ja pÀringute keskmine vastusaeg Master-serveris normaliseerub. Sest lÔpuks sai autovakumeerimine vÔimaluse surnud read puhastada ja mÀrgistada. Ja ta hakkas oma tööd tegema. Ja nii kiiresti kui ta seda teeb, nii kiiresti me saame end korda.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Testitavas tabelis, kus me uuendame kontode jÀÀke, nÀeme tÀiesti sama pilti. Keskmine konto uuendamise aeg normaliseerub ka jÀrk-jÀrgult. Protsessori tarbimisressursid vÀhenevad samuti. Ja tehingute arv sekundis naaseb normaali. Kuid taas ei normaliseeru see selliseks, nagu oli enne katastroofi.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Juhul, kui me saame ikka tootmisvÔimekuse languse, nagu esimesel juhul, poolteise kuni kahe korra vÔrra, mÔnikord isegi rohkem.

Me paistame, et oleme kÔik Ôigesti teinud. Jaotame koormust. Riistvara ei seisa. Oleme arukalt jaganud pÀringud, aga ikkagi lÀks kÔik halvasti.

  • Kas on soovitatav mitte lubada hot_standby_feedback? Jah, seda ei soovitata ilma heade pĂ”hjusteta lubada. Sest see seade mĂ”jutab otseselt Peaseeni ja peatab seal automaatse vakuumi töö. Kui te jĂ€tate selle lubatuks mingisuguses koopias ja unustate selle, vĂ”ite tappa Peaseeni ning tekitada suuri probleeme rakenduses.
  • Kas on soovitatav suurendada max_standby_streaming_delay? Jah, see on tĂ”si aruannete puhul. Kui teil on kolm tundi kestnud aruanne ja te ei soovi, et see kukuks replikatsioonide konfliktide tĂ”ttu, suurendage lihtsalt viivitust. Pikad aruanded ei vaja kunagi andmeid, mis on just nĂŒĂŒd andmebaasi jĂ”udnud. Kui tegemist on kolm tundi kestva aruandega, siis kĂ€ivitate selle vanade andmete ajavahemiku kohta. Ja kas teil on kolm tundi viivitust vĂ”i kuus tundi viivitust – ei oma mingit tĂ€htsust, aga te saate stabiilselt aruandeid ja ei koge nende Ă€kilisi kukkumisi.
  • Loomulikult tuleb kontrollida pikki sessioone koopiatel, eriti kui olete otsustanud lubada hot_standby_feedback koopial. Sest juhtuda vĂ”ib ĂŒkskĂ”ik, mis. Andsite selle koopia arendajale, et ta testiks pĂ€ringuid. Ta kirjutas meeletu pĂ€ringu. KĂ€ivitas ja lĂ€ks teed jooma, samas kui meie saime Peaseeni ĂŒlekoormuse. VĂ”i lubasime sinna vale rakenduse. Situatsioonid on mitmekesised. Sessioone koopiatel tuleb kontrollida sama hoolikalt nagu Peaseeni puhul.
  • Ja kui teil on kiireid ja pikki pĂ€ringuid koopiatel, siis on sel juhul parem koormuse jaotamiseks need jagada. See viitab streaming_delay'le. Kiirete jaoks on soovitatav kasutada ĂŒhte koopiat vĂ€ikese replikatsiooniviivitusega. Pikemate aruannete pĂ€ringute jaoks on soovitatav kasutada koopiat, mis vĂ”ib viibida 6 tundi vĂ”i kuni terve pĂ€eva. See on tĂ€iesti normaalne olukord.

Eemaldame tagajÀrjed ikka sama viisi kaudu:

  • Otsime ĂŒles paisutatud tabelid.
  • Ja surume need kokku sobivama tööriistaga, mis meile meeldib.

Teine lugu on selles lÔppenud. LÀhme kolmandasse lugu.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

KĂŒllaltki tavaline meie jaoks, kus me teeme migratsiooni.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

  • Iga tarkvaratoode kasvab. NĂ”udmised muutuvad. Me tahame alati areneda. Ja juhtub, et meil on vaja andmeid tabelis uuendada, just teha uuendust seoses meie migreerimisega uue funktsionaalsuse osas, mida rakendame meie arengu raames.
  • Vana andmevorming ei sobi. Oletame, et pöördume nĂŒĂŒd teise tabeli poole, kus mul on need kontode tehingud. Ja oletame, et need olid rubla, kuid me otsustasime suurendada tĂ€psust ja teha neid kopeekades. Selleks peame tegema uuenduse: tehingu summaarv korrutada sajaga.
  • Kaasaegses maailmas kasutame andmebaasi versioonihalduse automatiseeritud vahendeid. Oletame, Liquibase. Kirjutame sinna meie migreerimise. Testime seda meie testandmebaasis. KĂ”ik on suurepĂ€rane. Uuendus lĂ€heb lĂ€bi. See blokeerib töö mĂ”neks ajaks, kuid saame vĂ€rskendatud andmed. Ja saame sellel pĂ”hinedes uusi funktsioone kĂ€ivitada. Oleme kĂ”ik testinud, kontrollinud. KĂ”ik on kinnitatud.
  • Teostasime kavandatud tööd, viisime lĂ€bi migreerimise.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Siin on teie ees esitatud migreerimine koos uuendusega. Kuna mul on tehingud kontode lĂ”ikes, oli tabeli suurus 15 GB. Ja kuna me uuendame iga rida, paisus tabel uuenduse tĂ”ttu kaks korda, sest me kirjutasime iga rea ĂŒle.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Migreerimise ajal ei saanud me sellega midagi teha, kuna kÔik pÀringud sellele seisis jÀrjekorras ja ootasid, kuni see uuendus lÔppeb. Kuid siinkohal tahan juhtida teie tÀhelepanu vertikaalsel teljel olevatele numbritele. See tÀhendab, et meil oli keskmine pÀringu aeg enne migreerimist umbes 5 millisekundit ja protsessori koormus, mÀludiskilt loetud blokeerimise operatsioonide arv on vÀiksem kui 7,5.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Viisime lÀbi migreerimise ja saime jÀlle probleeme.

Migreerimine lÀks edukalt, kuid:

  • Vana funktsionaalsus hakkas töötama aeglasemalt.
  • Tabel kasvas taas suuruse poolest.
  • Serveri koormus on taas suurem kui oli.
  • Ja loomulikult, seni kuni me veel tegeleme heade töödega, oleme seda veidi parandanud.

Ja see on jÀlle bloat, mis rikub meie elu.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Siin demonstreerin, et tabel, nagu ka eelnevatel juhtudel, ei kavatse naasta eelmistele suurustele. Serveri keskmine koormus tundub olevat vastuvÔetav.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Kui me vaatame arve tabelit, siis nĂ€eme, et meie pĂ€ringu keskmine aeg on kahekordistunud. Protsessori koormus ja mĂ€lus lĂ€bi vaadatud ridade arv on tĂ”usnud ĂŒle 7,5, kuigi see oli alla. Protsessorite puhul tĂ”usis see kaks korda, plokkoperatsioonide puhul aga 1,5 korda, st oleme saanud serveri jĂ”udluse languse. Ja selle tagajĂ€rjel - meie rakenduse jĂ”udluse languse. Samuti jĂ€i kutsete arv ligikaudu samale tasemele.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Siinkohal on oluline mĂ”ista, kuidas Ă”igesti selliseid migreerimise protsesse teha. Ja neid on oluline teha. Teeme neid ĂŒsna regulaarselt.

  • Selliseid suures mahus migreerimisi ei tehta automaatselt. Need peavad alati olema kontrolleeritud.
  • Kontroll peab olema teadliku inimese poolt. Kui teie meeskonnas on andmebaasi administraator (DBA), siis las teeb seda tema. See on tema töö. Kui ei, siis las teeb seda kĂ”ige kogenum inimene, kes teab, kuidas andmebaasidega töötada.
  • Uus andmebaasi skeem, isegi kui uuendame ainult ĂŒhte veergu, valmistame me alati ette etappide kaupa, st enne, kui rakenduse uus versioon vĂ€lja viiakse:
  • Lisatakse uued vĂ€ljad, kuhu salvestame just uuendatud andmed.
  • Kandame andmed vanast vĂ€ljast uude vĂ€hehaaval. Miks me seda teeme? Esiteks kontrollime me alati selle protsessi kulgu. Teame, et oleme juba ĂŒle kandnud teatud hulga ja meil on veel nii palju ĂŒle kandmata.
  • Teiseks positiivne efekt on see, et iga sellise erandi vahel sulgeme tehingu, avame uue ja see vĂ”imaldab automaatvakumeerida tabelis, mĂ€rgistades surnud read taaskasutamiseks.
  • Ridade puhul, mis ilmuvad rakenduse töö kĂ€igus (meie vana rakendus töötab veel), lisame katse, mis salvestab uued vÀÀrtused uuteks vĂ€ljadeks. Meie puhul - see on vana vÀÀrtuse korrutamine saja.
  • Kui me oleme tĂ€iesti jonnakad ja tahame sama vĂ€li, siis kĂ”igi migreerimiste lĂ”ppedes ja enne uue rakenduse versiooni vĂ€ljalaskmist, lihtsalt muutame vĂ€ljade nimed. Vanad saame mingi vĂ€lja mĂ”eldud nimeks, uued vĂ€ljad muutume jĂ€lle vanadeks.
  • Ja alles seejĂ€rel kĂ€ivitame uue rakenduse versiooni.

Sellega me ei saa bloat'i ja meie jÔudlus ei lange.

Selle lÔppes kolmas lugu.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat.sql

https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat_approx.sql

Ja nĂŒĂŒd pisut pĂ”hjalikumalt tööriistadest, millest ma esimeses loos rÀÀkisin.

Enne kui bloat'i otsima hakkate, peate kindlasti paigaldama laienduse. pgstattuple.

Et te ei peaks pÀringute loomisega vaevama, oleme oma töös juba need pÀringud kirja pannud. Saate neid kasutada. Siin on esitatud kaks pÀringut.

  • Esimene töötab ĂŒsna kaua, kuid see nĂ€itab teile bloat'i tĂ€pseid vÀÀrtusi tabelis.
  • Teine töötab kiiremini ja on vĂ€ga tĂ”hus, kui on vaja kiiresti hinnata – kas tabelis on bloat vĂ”i mitte. Ja peaksite aru saama, et Postgres'i tabelites on bloat alati. See on tema MVCC mudeli eripĂ€ra.
  • Ja 20% bloat on enamikul juhtudel tabelite jaoks normaalne. S.t. te ei pea muretsema ja seda tabelit kokku suruma.

Kuidas tuvastada tabelid, mis on meie jaoks paisunud, oleme juba aru saanud, sealhulgas, kui need on paisunud kasutud andmed.

NĂŒĂŒd rÀÀgime bloat'i parandamisest:

  • Kui meil on vĂ€ike tabel ja head kettad, s.t. kui tabeli suurus on alla gigabaidi, on tĂ€iesti vĂ”imalik kasutada VACUUM FULL-i. See vĂ”tab eksklusiivse lukustuse tabelil paariks sekundiks ja see on okei, kuna see teeb kiiresti ja tĂ”husalt kĂ”ik vajalikud toimingud. Mida teeb VACUUM FULL? See vĂ”tab eksklusiivse lukustuse tabelil ja kirjutab elavad read uude tabelisse vanadest tabelitest. Ja lĂ”puks vahetab nad omavahel kohad. Vanad failid kustutab, uued asendab vanadega. Kuid oma töö ajal vĂ”tab ta eksklusiivse lukustuse tabelist. See tĂ€hendab, et te ei saa selle tabeliga mitte midagi teha: ei saa kirjutada, ei saa lugeda, ei saa muuta. Ja VACUUM FULL nĂ”uab lisaruumi kettal, et andmeid salvestada.
  • JĂ€rgmine tööriist pg_repack. Oma pĂ”himĂ”ttelt on see vĂ€ga sarnane VACUUM FULL-ile, kuna see kirjutab samuti andmed vanadest failidest uutesse ja asendab need tabelis. Kuid see ei vĂ”ta alguses eksklusiivset lukustust tabelil, vaid vĂ”tab selle alles siis, kui tal on juba valmis andmed failidega asendamiseks. Temaga seotud kettaressursside nĂ”uded on VACUUM FULL-iga sarnased. Teil on vaja kettal lisaruumi, mis vĂ”ib mĂ”nikord olla kriitiline, kui teil on terabaiti suuruseid tabeleid. Ja ta on ka ĂŒsna ressursinĂ”udlik protsessorilt, kuna tegeleb aktiivselt sisendi-vĂ€ljundi tööga.
  • Kolmas utiliit on pgcompacttable. Ta on ressursse sÀÀstvam, kuna töötab natuke erinevatel pĂ”himĂ”tetel. Pgcompacttable peamine idee on see, et see uuendustega viib kĂ”ik elavad read tabeli algusesse. Ja siis kĂ€ivitab selle tabeli ĂŒlevaatuse, kuna me teame, et meil on alguses elavad ja lĂ”pus surnud read. Ülevaatus lĂ”ikab selle saba Ă€ra, st see ei vaja palju tĂ€iendavat kettaruumi. Ja lisaks on seda veel vĂ”imalik ressursside osas vĂ€hendada.

Tööriistadega on kÔik.

TĂŒĂŒpilised vead rakendustes, mis viivad bloat'i tekkimiseni PostgreSQL-is. Andrei Salnikovi

Kui teema bloat tundub teile huvitav ja soovite sĂŒgavamale minna, siis siin on mĂ”ned kasulikud lingid:

Ma pĂŒĂŒdsin siin rohkem nĂ€idata hirmutust arendajatele, kuna nad on meie andmebaaside otsesed kliendid ja peavad mĂ”istma, millised on teod ja nende tagajĂ€rjed. 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 jĂ€id seisma mitte ainult seetĂ”ttu, et need kasutasid mĂ”nda vĂ€list teenust. Seal olid lihtsalt mĂ”ned tobedad liitmise pĂ€ringud. Seal oli mĂ”ni ĂŒsna kahjutu mikropĂ€ring, mis jĂ€i pĂ€evaks seisma ja seejĂ€rel hakkas toimetama mingit jama. See on vĂ€ga sarnane sellele, mida te kirjeldasite. Kuidas seda jĂ€lgida? Kas peaksin pidevalt vaatama, milline pĂ€ring on seisma jÀÀnud? Kuidas seda ennetada?

Sel juhul – see on ĂŒlesanne teie ettevĂ”tte halduritele, mitte tingimata DBA-dele.

Ma olen haldur.

PostgreSQL'is on selline vaade nagu pg_stat_activity, kus kuvatakse seisma jÀÀnud pÀringud. Ja te saate nÀha, kui kaua need seal olnud on.

Kas ma pean iga 5 minuti tagant sisse logima ja vaatama?

Seadke cron töö ja kontrollige. Kui teil on pikk pÀring, saatke kiri ja kÔik. T. e. teil ei ole vaja silmadega vaadata, see on automatiseeritav. Te saate kirja, millele reageerite. VÔite ka automaatselt vastata.

Kas on ilmsed pÔhjused, miks see juhtub?

MÔned neist olen Àra nimetanud. Teised on keerulisemad nÀited. Ja seal vÔib jutt pikaks minna.

AitÀh ettekande eest! Soovin tÀpsustada utiliiti pg_repack. Kui see ei tee eksklusiivset lukku, siis...

See teeb eksklusiivset lukku.


 siis ma vÔin potentsiaalselt andmeid kaotada. Minu rakendus ei tohi sel ajal midagi kirjutada?

Ei, see töötab rahulikult tabeliga, t. e. pg_repack tĂ”stab esimesena ĂŒles kĂ”ik elavread, mis seal on. Loomulikult toimub seal mingisugune kirjutamine tabelisse. Ta lihtsalt lisab selle saba juurde.

T. e. ta siiski teeb lÔpus?

LÔpus vÔtab ta eksklusiivse lukustuse, et neid faile omavahel vahetada.

Kas see on kiirem kui VACUUM FULL?

VACUUM FULL, kui see kÀivitub, vÔtab kohe eksklusiivse lukustuse. Ja seni, kuni ta kÔike ei tee, ei vabasta ta seda. Ja pg_repack vÔtab eksklusiivse lukustuse ainult failide asendamise hetkel. Sel ajal te ei saa sinna kirjutada, kuid andmed ei kao, kÔik on korras.

Tere! RÀÀkisite automaatse vakumeerimise tööst. Seal oli graafik punaste, kollaste ja roheliste rakkudega. T. e. kollased – ta mĂ€rkis need kustutatuks. Ja seetĂ”ttu vĂ”ib neisse midagi uut kirjutada?

Jah. Postgres ei kustuta ridu. Tal on selline eripÀra. Kui me rida uuendame, mÀrgime vana kustutatuks. Seal tuleb id tehingu, mis selle rida muutis, ja me kirjutame uue rea. Ja meil on sessioonid, mis potentsiaalselt vÔivad neid lugeda. Teatud hetkel muutuvad need vÀga vanaks. Ja automaatse vakumeerimise eesmÀrk on see, et ta lÀbib need read ja mÀrgib need kui mittevajalikud. Ja sinna saab andmeid taas kirjutada.

Sain aru. Kuid kĂŒsimus ei ole tĂ€iesti selles. Ma ei lĂ”petanud. Oletame, et meil on tabel. Seal on muutuva suurusega vĂ€ljad. Ja kui ma pĂŒĂŒan midagi uut sisestada, siis see ei pruugi lihtsalt vanasse rakku mahtuda.

Ei, seal igal juhul uuendatakse kogu rida. Postgres'el on kaks andmeid salvestamise mudelit. See valib andmete tĂŒĂŒbi jĂ€rgi. On andmeid, mis salvestatakse otse tabelisse, ja on ka tos-andmed. Need on suured andmemahtud: tekst, json. Need salvestatakse eraldi tabelitesse. Ja nende tabelitega on sama lugu bloat'iga, s.t. kĂ”ik on sama. Lihtsalt on need eraldi vĂ€lja tĂ”stetud.

AitÀh ettekande eest! Kui mÔistlik on kasutada pÀringute kestuse piiramiseks statement timeout'i?

See on vĂ€ga vastuvĂ”etav. Me kasutame seda igal pool. Kuna meil pole oma teenuseid, pakume eemalt tuge, on klientuur ĂŒsna mitmekesine. Ja kĂ”ik on selle peale tĂ€iesti rahul. S.t. meil on ĂŒlesanded cron'is, mis kontrollivad seda. Lihtsalt kliendiga lepime kokku seansside kestuse, millest varem me ei katkesta. See vĂ”ib olla minut, see vĂ”ib olla 10 minutit. See sĂ”ltub andmebaasi koormusest ja selle eesmĂ€rgist. Kuid kĂ”ik kasutavad pg_stat_activity't.

AitĂ€h ettekande eest! PĂŒĂŒan teie ettekannet oma rakendustele kohandada. Tundub, et me alustame kĂ”ikjal tehingut, lĂ”petame selle selgelt. Kui mingi exception toimub, siis rollback ikkagi toimub. Ja siis ma mĂ”tlesin. Sest tehing vĂ”ib alata ka mitte selgelt. See on ilmselt vihje tĂŒdrukule. Kui ma lihtsalt uuendan kirjet, kas tehing algab PostgreSQL'is ja lĂ”petatakse alles siis, kui ĂŒhendus katkeb?

Kui rÀÀgite praegu rakenduse tasemest, siis see sĂ”ltub kasutatavast draiverist, sellest ORM'ist, mida kasutatakse. Seal on palju seadeid. Kui teil on auto commit sisse lĂŒlitatud, siis tehing algab kohe ja sulgub kohe.

S.t. see sulgub kohe pÀrast uuendamist?

See sĂ”ltub seadetest. Ühe seade, mida ma mainisin. See on auto commit on. See on ĂŒsna levinud. Kui see on sisse lĂŒlitatud, avatakse tehing ja suletakse. Kui te ei ole selgelt öelnud 'start transaction' ja 'end transaction', vaid lihtsalt kĂ€ivitasite sessioonis pĂ€ringu.

Tere! AitÀh ettekande eest! Kujutame ette, et meil on andmebaas, mis paisub ja paisub ja siin serveris lÔpeb ruum. Kas on mingeid tööriistu, et seda olukorda parandada?

Serveri ruumi tuleks tÔepoolest jÀlgida.

NÀiteks DBA lÀks teed jooma, oli puhkuse ajal jne.

Kui failisĂŒsteem luuakse, siis seal luuakse vĂ€hemalt mingit reserveeritud ruumi, kuhu andmeid ei kirjutata.

Aga kui kĂ”ik on tĂ€iesti tĂŒhi?

Seal nimetatakse seda reserveeritud ruumiks, st selle saab vabastada ja sĂ”ltuvalt sellest, kui suureks see loodud on, saate vabade ruutmeetrite arvu. Vaikimisi ma ei tea, kui palju seal on. Teises olukorras tuleb tarnida ketas, et teil oleks ruumi taastamistegevuse lĂ€biviimiseks. VĂ”ite kustutada mĂ”ne tabeli, mis on teile garanteeritult ĂŒleliigne.

Teisi tööriistu ei ole?

See on alati kÀsitöö. Ja kohapeal tuvastatakse, mida teha, kuna andmed on kriitilised ja on mitte-kriitilised. Iga andmebaasi ja rakenduse jaoks, mis seda kasutab, sÔltub see Àrist. See otsustatakse alati kohapeal.

AitĂ€h ettekande eest! Mul on kaks kĂŒsimust. Esiteks, te tutvustasite slaide, kus nĂ€idati, et kui tehingud hanguvad, suureneb nii tabeli ruumi maht kui ka indeksi suurus. Ja seejĂ€rel ettekandes oli palju utiliite, mis paketivad tabelit. Mis toimub indeksi puhul?

Need paketivad ka neid.

Aga vacuum ei mÔjuta indeksi?

MÔned töötavad indeksi kallal. NÀiteks pg_rapack, pgcompacttable. Vacuum loob indekseid uuesti, mÔjutab neid. VACUUM FULLi olemus on see, et kÔik uuesti kirjutada, st see töötab kÔigi kallal.

Ja teine kĂŒsimus. Ma ei saanud aru, miks aruanded replikates nii palju sĂ”ltuvad ise replikatsioonist. Tundus, et aruanded on lugemine ja replikatsioon on kirjutamine.

Kus tekib replikatsiooni konflikt? Meil on Master, kus toimuvad protsessid. Meil toimub automaatne vacuum. Automaatne vacuum, mis see tegelikult teeb? See eemaldab mÔned vanad read. Kui meil samal ajal toimub replikas pÀring, mis loeb neid vanu ridu, ja Masteris on juhtunud, et automaatne vacuum on need read vÔimalike kirjutamiseks mÀrkinud, siis me need uuesti kirjutame. Ja me saame andmepaketi ajal, kui peame uuesti kirjutama need read, mis on replikas pÀringule vajalikud, siis replikatsiooni protsess ootab seda seadistatud ajavahemikku. SeejÀrel otsustab PostgreSQL, mis on tema jaoks olulisem. Ja replikatsioon on tema jaoks olulisem kui pÀring ja ta katkestab pÀringu, et teha need muudatused replikas.

Andrej, mul on kĂŒsimus. Need imelised graafikud, mida te nĂ€itasite esitluse ajal, on teie tööriista tulemus? Millega graafikud koostati?

See on teenus Okmeter.

Kas see on kaubanduslik toode?

Jah. See on kaubanduslik toode.

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster