BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

En dag i en avlÀgsen framtid kommer automatisk borttagning av onödiga data att vara en av de viktiga uppgifterna för ett DBMS [1]. Under tiden mÄste vi sjÀlva ta hand om att radera eller flytta onödig data till billigare lagringssystem. LÄt oss sÀga att du bestÀmmer dig för att ta bort flera miljoner rader. En ganska enkel uppgift, speciellt om tillstÄndet Àr kÀnt och det finns ett lÀmpligt index. "DELETE FROM table1 WHERE col1 = :value" - vad kan vara enklare, eller hur?

videor:

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

  • Jag har suttit i Highload-programkommittĂ©n sedan första Ă„ret, d.v.s. sedan 2007.

  • Och jag har varit med Postgres sedan 2005. AnvĂ€nde det i mĂ„nga projekt.

  • Gruppen har ocksĂ„ varit med i RuPostges sedan 2007.

  • Vi har vuxit till 2100+ deltagare pĂ„ Meetup. Detta Ă€r den andra platsen i vĂ€rlden efter New York, efter att ha kört om San Francisco för lĂ€nge sedan.

  • Jag har bott i Kalifornien i flera Ă„r. Jag jobbar mest med amerikanska företag, inklusive stora. De Ă€r aktiva Postgres-anvĂ€ndare. Och alla möjliga intressanta saker dyker upp dĂ€r.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

https://postgres.ai/ – det hĂ€r Ă€r mitt företag. Vi arbetar med att automatisera uppgifter som eliminerar utvecklingsavbrott.

Om du gör nÄgot, ibland finns det nÄgra fel runt Postgres. LÄt oss sÀga att du mÄste vÀnta tills administratören fÄr dig en testbÀnk, eller sÄ mÄste du vÀnta tills DBA svarar dig. Och vi hittar sÄdana flaskhalsar i utvecklings-, testnings- och administrationsprocessen och försöker eliminera dem med hjÀlp av automatisering och nya tillvÀgagÄngssÀtt.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

https://www.seagate.com/files/www-content/our-story/trends/files/idc-seagate-dataage-whitepaper.pdf

Jag var nyligen pÄ VLDB i Los Angeles. Detta Àr den största databaskonferensen. Och det fanns en rapport som i framtiden kommer DBMS inte bara att lagra, utan ocksÄ automatiskt radera data. Det hÀr Àr ett nytt Àmne.

Det finns mer och mer data i vÀrlden. Zetabyte Àr 1 000 000 petabyte. Och nu uppskattas det redan att vi har mer Àn 100 zettabyte data lagrade i vÀrlden. Och det blir fler och fler av dem.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

https://vldb2019.github.io/files/VLDB19-keynote-2-slides.pdf

Och vad ska man göra med det? Det Àr klart att det mÄste raderas. HÀr Àr en lÀnk till denna intressanta rapport. Men hittills har detta inte implementerats i DBMS.

De som vet hur man rÀknar pengar vill ha tvÄ saker. De vill att vi ska radera, sÄ tekniskt sett mÄste vi kunna göra det.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Det jag kommer att berÀtta hÀrnÀst Àr en abstrakt situation som inkluderar ett gÀng verkliga situationer, det vill sÀga en viss sammanstÀllning av vad som faktiskt hÀnde mig och de omgivande databaserna mÄnga gÄnger, mÄnga Är. Rakes finns överallt och alla trampar pÄ dem hela tiden.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

LÄt oss sÀga att vi har en bas eller flera baser som vÀxer. Och nÄgra av skivorna Àr uppenbart skrÀp. AnvÀndaren började till exempel göra nÄgot dÀr, men avslutade inte. Och efter en tid vet vi att detta oavslutade arbete inte lÀngre kan lagras. Det vill sÀga, vi skulle vilja stÀda lite skrÀpsaker för att spara utrymme, förbÀttra prestanda osv.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

I allmÀnhet Àr uppgiften att automatisera borttagningen av specifika saker, specifika rader i en tabell.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Och vi har en förfrÄgan som vi kommer att prata om idag, det vill sÀga om sopborttagning.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Vi bad en erfaren utvecklare att göra detta. Han tog denna begÀran, kontrollerade den sjÀlv - allt fungerar. Jag testade det pÄ iscensÀttning - allt Àr bra. Rullade ut det - allt fungerar. En gÄng om dagen kör vi detta - allt Àr bra.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Databasen vÀxer och vÀxer. Den dagliga DELETE börjar fungera lite lÄngsammare.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

DÄ inser vi att vi nu Àr ett marknadsföringsföretag och trafiken kommer att bli flera gÄnger större, sÄ vi bestÀmmer oss för att tillfÀlligt pausa onödiga saker. Och vi glömmer att lÀmna tillbaka den.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

NÄgra mÄnader senare kom de ihÄg. Och den utvecklaren slutade eller var upptagen med nÄgot annat, de tilldelade en annan att lÀmna tillbaka den.

Han kollade pÄ dev, pÄ iscensÀttning - allt Àr OK. Naturligtvis behöver du fortfarande stÀda upp det som har samlats. Han kollade, allt fungerar.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Vad hÀnder sen? Sedan faller allt isÀr för oss. Det sjunker sÄ mycket att allt nÄgon gÄng ramlar ner. Alla Àr i chock, ingen förstÄr vad som hÀnder. Och sedan visar det sig att denna DELETE var problemet.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

NÄgot gick fel? HÀr Àr en lista över saker som kan gÄ fel. Vilken av dessa Àr viktigast?

  • Det fanns till exempel ingen recension, d.v.s. DBA-experten tittade inte. Med ett erfaret öga skulle han genast hitta problemet, och dessutom har han tillgĂ„ng till prod, dĂ€r flera miljoner rader har samlats.

  • Kanske har de kollat ​​nĂ„got fel.

  • Kanske Ă€r hĂ„rdvaran förĂ„ldrad och du behöver uppgradera den hĂ€r databasen.

  • Eller sĂ„ Ă€r nĂ„got fel med sjĂ€lva databasen, och vi mĂ„ste flytta frĂ„n Postgres till MySQL.

  • Eller sĂ„ kanske det Ă€r nĂ„got fel pĂ„ operationen.

  • Kanske finns det nĂ„gra fel i organisationen av arbetet och du behöver sparka nĂ„gon och anstĂ€lla bĂ€ttre folk?

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Det fanns ingen DBA-kontroll. Om det fanns en DBA skulle han se dessa flera miljoner rader och Ă€ven utan nĂ„gra experiment skulle han sĂ€ga: "De gör inte det." LĂ„t oss sĂ€ga att om den hĂ€r koden fanns i GitLab, GitHub och det fanns en kodgranskningsprocess och det inte fanns nĂ„got sĂ„dant att utan DBA-godkĂ€nnande skulle denna operation ske pĂ„ prod, dĂ„ skulle DBA sjĂ€lvklart sĂ€ga: "Du kan inte göra det. ”

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Och han skulle sÀga att du kommer att ha problem med disk-IO och alla processer kommer att bli galna, det kan finnas lÄs, och du kommer ocksÄ att blockera autovakuumet i ett gÀng minuter, sÄ det hÀr Àr inte bra.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

http://bit.ly/nancy-hl2018-2

Det andra misstaget Àr att de checkade pÄ fel stÀlle. Vi sÄg i efterhand att mycket skrÀpdata hade samlats pÄ prod, men utvecklaren hade inte samlat data i den hÀr databasen, och ingen skapade riktigt detta skrÀp pÄ iscensÀttning. Följaktligen fanns det 1 000 linjer, som snabbt blev klara.

Vi förstÄr att vÄra tester Àr svaga, det vill sÀga att processen som byggs inte fÄngar problem. Ett adekvat DB-experiment utfördes inte.

Ett idealiskt experiment bör helst utföras pÄ samma utrustning. Det Àr inte alltid möjligt att göra detta pÄ samma hÄrdvara, men det Àr mycket viktigt att det Àr en kopia av databasen i full storlek. Detta Àr vad jag har predikat i flera Är nu. Och för ett Är sedan pratade jag om detta, du kan se allt pÄ YouTube.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Kanske Àr vÄr utrustning dÄlig? Om du tittar har latensen hoppat. Vi sÄg att Ätervinningen var 100 %. Naturligtvis, om dessa vore moderna NVMe-enheter, sÄ skulle det förmodligen vara mycket lÀttare för oss. Och vi kanske inte skulle lÀgga oss pÄ grund av det.

Om du har moln Ă€r uppgraderingen enkel. Vi lanserade nya repliker pĂ„ ny hĂ„rdvara. ÖvergĂ„ng. Och allt Ă€r bra. Ganska lĂ€tt.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Är det möjligt att pĂ„ nĂ„got sĂ€tt röra mindre diskar? Och hĂ€r, med hjĂ€lp av DBA, dyker vi in ​​i ett visst Ă€mne som kallas checkpoint tuning. Det visar sig att vi inte har utfört checkpoint tuning.

Vad Ă€r en checkpoint? Detta Ă€r tillgĂ€ngligt i alla DBMS. NĂ€r data i ditt minne Ă€ndras skrivs de inte direkt till diskar. Information om att data har Ă€ndrats skrivs först till framĂ„tloggen, i framskrivningsloggen. Och nĂ„gon gĂ„ng bestĂ€mmer DBMS att det Ă€r dags att kasta de riktiga sidorna pĂ„ disken, sĂ„ att om vi har ett fel kan vi göra mindre om. Det Ă€r som en leksak. Om vi ​​dödas kommer vi att starta spelet frĂ„n den sista checkpointen. Och alla DBMS implementerar detta.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

InstÀllningarna i Postgres slÀpar efter. De Àr designade för 10-15 Är gamla volymer av data och operationer. Och checkpoint Àr inget undantag.

Denna information kommer frÄn vÄr rapport med Postgres check-up, det vill sÀga automatisk hÀlsokontroll. Och hÀr Àr en databas med flera terabyte. Och det Àr tydligt att kontrollpunkter tvingas fram i nÀstan 90 % av fallen.

Vad betyder det? Det finns tvÄ instÀllningar dÀr. Checkpoint kan intrÀffa i timeout, till exempel inom 10 minuter. Eller det kan intrÀffa nÀr ganska mycket data har fyllts i.

Och som standard Àr max_wal_saze instÀlld pÄ 1 gigabyte. Faktum Àr att detta faktiskt hÀnder i Postgres efter 300-400 megabyte. Du har Àndrat sÄ mycket data och du har en checkpoint.

Och om ingen stÀllde in den, men tjÀnsten har vuxit och företaget tjÀnar mycket pengar, det har mÄnga transaktioner, dÄ sker kontrollpunkten en gÄng i minuten, ibland en gÄng var 30:e sekund, och ibland överlappar de varandra. . Det hÀr Àr riktigt dÄligt.

Och vi mÄste se till att det kommer mer sÀllan. Det vill sÀga, vi kan höja max_wal_size. Och han kommer att attackera mindre ofta.

Men vi har utvecklat en hel metod för hur man gör detta mer korrekt, det vill sÀga hur man fattar beslut om att vÀlja instÀllningar, tydligt baserat pÄ specifik data.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Följaktligen utför vi tvÄ serier av databasexperiment.

Första serien - vi Àndrar max_wal_size. Och vi genomför en massiv operation. Först gör vi det med standardinstÀllningen 1 gigabyte. Och vi gör en massiv DELETE av mÄnga miljoner rader.

Du kan se hur svÄrt det Àr för oss. Vi ser att disk IO Àr mycket dÄlig. LÄt oss se hur mycket WAL vi genererade, för det hÀr Àr vÀldigt viktigt. LÄt oss se hur mÄnga gÄnger checkpointen hÀnde. Och vi ser att det inte Àr bra.

DĂ€refter ökar vi max_wal_size. Vi upprepar. Öka, upprepa. Och sĂ„ mĂ„nga gĂ„nger. I princip Ă€r 10 poĂ€ng bra, dĂ€r 1, 2, 4, 8 gigabyte. Och vi tittar pĂ„ beteendet hos ett specifikt system. Det Ă€r klart att utrustningen hĂ€r ska vara som pĂ„ prod. Du bör ha samma diskar, samma mĂ€ngd minne och samma Postgres-instĂ€llningar.

Och pÄ detta sÀtt kommer vi att byta ut vÄrt system, och vi vet hur DBMS kommer att bete sig i hÀndelse av en dÄlig massa DELETE, hur den kommer att kontrollera.

Kontrollpunkt pÄ ryska betyder kontrollpunkter.

Exempel: TA BORT flera miljoner rader efter index, raderna Àr "spridda" över sidorna.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

HÀr Àr ett exempel. Detta Àr nÄgon grund. Och med standardinstÀllningen pÄ 1 gigabyte för max_wal_size Àr det vÀldigt tydligt att vÄra diskar för inspelning gÄr till hyllan. Den hÀr bilden Àr ett typiskt symptom pÄ en mycket sjuk patient, det vill sÀga att han verkligen mÄdde dÄligt. Och det var bara en operation, hÀr var bara DELETE av flera miljoner rader.

Om en sÄdan operation tillÄts i prod, dÄ ramlar vi bara ner, för det Àr klart att en DELETE dödar oss i hyllan.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Vidare, dÀr det finns 16 gigabyte, kan du se att tÀnderna redan har börjat dyka upp. TÀnderna Àr redan bÀttre, det vill sÀga vi knackar i taket, men inte sÄ illa. Lite frihet dök upp dÀr. Till höger finns inspelningen. Och antalet operationer Àr den andra grafen. Och det Àr tydligt att vi redan andas lite lÀttare med 16 gigabyte.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Och dÀr 64 gigabyte syns har det blivit helt bÀttre. Redan tÀnderna syns tydligt, det finns fler möjligheter att överleva andra operationer och göra nÄgot med disken.

Varför sÄ?

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Jag kommer att dyka in i detaljerna lite, men det hÀr Àmnet om hur man utför kontrollpunktsinstÀllning kan resultera i en hel rapport, sÄ jag kommer inte gÄ in för mycket i detalj, men jag kommer att beskriva lite vilka svÄrigheter det finns.

Om kontrollpunkten hÀnder för ofta och vi inte uppdaterar vÄra rader sekventiellt, utan hittar dem efter index, vilket Àr bra, eftersom vi inte tar bort hela tabellen, kan det hÀnda att vi först rörde första sidan, sedan den tusende, och sedan ÄtervÀnde till den första. Och om kontrollpunkten redan har sparat den pÄ disken mellan dessa besök pÄ första sidan, kommer den att spara den igen, eftersom vi har smutsad ner den en andra gÄng.

Och vi kommer att tvinga checkpointen att rÀdda den mÄnga gÄnger. Som om det finns överflödiga operationer för det.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Men det Àr inte allt. I Postgres vÀger sidor 8 kilobyte och i Linux 4 kilobyte. Och det finns en instÀllning full_page_writes. Den Àr aktiverad som standard. Och detta Àr korrekt, för om vi stÀnger av det finns det en risk att om det blir ett misslyckande sÄ sparas bara hÀlften av sidan.

Beteendet för inmatningen i framÄtloggens WAL Àr sÄdant att nÀr vi har en kontrollpunkt och vi byter sida för första gÄngen hamnar hela sidan, det vill sÀga alla 8 kilobyte, i framÄtloggen, Àven om vi Àndrade bara en rad som vÀger 100 byte. Och vi tvingas skriva ner hela sidan.

I efterföljande Àndringar kommer det bara att finnas en specifik tupel, men för första gÄngen skriver vi ner allt.

Och följaktligen, om kontrollpunkten hÀnder igen, mÄste vi börja allt frÄn början igen och fylla pÄ hela sidan. Med frekventa kontrollpunkter, nÀr vi gÄr igenom samma sidor, kommer full_page_writes = on att vara större Àn det skulle kunna vara, dvs vi genererar mer WAL. Mer skickas till repliker, till arkivet, till disken.

Och följaktligen har vi tvÄ uppsÀgningar.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Om vi ​​ökar max_wal_size visar det sig att vi underlĂ€ttar arbetet för bĂ„de checkpoint och wal writer. Och det Ă€r jĂ€ttebra.

LÄt oss installera en terabyte och leva med den. Vad Àr det för dÄligt med det? Detta Àr dÄligt, för i hÀndelse av misslyckande kommer vi att gÄ upp i timmar, eftersom checkpointen var för lÀnge sedan och mycket har redan förÀndrats. Och vi mÄste göra REDO för allt detta. Och sÄ gör vi en andra serie experiment.

Vi gör operationen och ser nÀr checkpointen Àr nÀra att slutföras, vi gör en kill -9 Postgres med flit.

Och efter det startar vi det igen och ser hur lÄng tid det tar att stiga pÄ den hÀr utrustningen, dvs hur mycket REDO den kommer att göra i denna dÄliga situation.

Jag kommer att notera tvÄ gÄnger att situationen Àr dÄlig. För det första föll vi precis före slutet av checkpointen, sÄ vi har mycket att förlora. Och för det andra hade vi en massiv operation. Och om checkpoints hade en timeout, skulle troligen mindre WAL ha genererats sedan den senaste checkpointen. Det vill sÀga, det hÀr Àr en tvÄ gÄnger förlorare.

Vi mĂ€ter denna situation för olika max_wal_size och förstĂ„r att om max_wal_size Ă€r 64 gigabyte, sĂ„ kommer vi i en dubbelt vĂ€rsta situation att stiga i 10 minuter. Och vi funderar pĂ„ om det hĂ€r passar oss eller inte. Det hĂ€r Ă€r en affĂ€rsfrĂ„ga. Vi mĂ„ste visa den hĂ€r bilden för de som Ă€r ansvariga för affĂ€rsbeslut och frĂ„ga: "Vad Ă€r den maximala tiden vi kan vĂ€nta vid problem? Kan vi ligga ner i en sĂ€mre situation i 3-5 minuter?” Och du fattar ett beslut.

Och hÀr finns en intressant poÀng. Vi har ett par reportage om Patroni pÄ konferensen. Och du kanske anvÀnder den. Detta Àr autofailover för Postgres. GitLab och Data Egret pratade om detta.

Och om du har en autofailover som intrÀffar inom 30 sekunder, sÄ kanske vi kan ligga ner i 10 minuter? För vid det hÀr laget kommer vi att byta till repliken, och allt kommer att bli bra. Detta Àr en kontroversiell frÄga. Jag vet inget klart svar. Jag kÀnner bara att det hÀr Àmnet inte bara handlar om katastrofÄterstÀllning.

Om vi ​​har en lĂ„ng Ă„terhĂ€mtning frĂ„n ett misslyckande, kommer vi att vara obekvĂ€ma i mĂ„nga andra situationer. Till exempel i samma experiment, nĂ€r vi gör nĂ„got och ibland mĂ„ste vĂ€nta i 10 minuter.

Jag skulle fortfarande inte gÄ för lÄngt, Àven om vi har autofailover. Som regel Àr vÀrden som 64, 100 gigabyte bra vÀrden. Ibland Àr det till och med vÀrt att vÀlja mindre. I allmÀnhet Àr detta en subtil vetenskap.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

För att till exempel iterera max_wal_size = 1, 8 mÄste du upprepa massoperationen mÄnga gÄnger. Du gjorde det. Och du vill göra det igen pÄ samma bas, men du har redan tagit bort allt. Vad ska man göra?

Jag kommer att berÀtta senare om vÄr lösning och vad vi gör för att upprepa i sÄdana situationer. Och detta Àr det mest korrekta tillvÀgagÄngssÀttet.

Men i det hÀr fallet hade vi tur. Om, som det stÄr hÀr "BEGIN, DELETE, ROLLBACK", sÄ kan vi upprepa DELETE. Det vill sÀga om vi avbröt det sjÀlva, dÄ kan vi upprepa det. Och fysiskt kommer din data att finnas dÀr. Du fÄr inte ens nÄgon svullnad. Du kan iterera pÄ en sÄdan DELETE.

Denna DELETE med ROLLBACK Àr idealisk för kontrollpunktsinstÀllning, Àven om du inte har en korrekt distribuerad databaslabb.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Vi gjorde en skylt med en kolumn "i". Postgres har verktygskolumner. De Àr osynliga om de inte specifikt efterfrÄgas. Dessa Àr: ctid, xmid, xmax.

Ctid Àr den fysiska adressen. Sida noll, den första tuppeln pÄ sidan.

Det kan ses att efter ROOLBACK stannade tupeln kvar pÄ samma plats. Det vill sÀga, vi kan försöka igen, det kommer att bete sig likadant. Detta Àr huvudsaken.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Xmax Àr tidpunkten för tupelns död. Det Àr inmatat, men Postgres vet att denna transaktion ÄterstÀlldes, sÄ det spelar ingen roll om det Àr 0 eller en ÄterstÀlld transaktion. Detta tyder pÄ att DELETE kan anvÀndas för att iterera och testa massiva operationer av systembeteende. Du kan göra databaslabb för de fattiga.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Det hÀr handlar om programmerare. Om DBA ocksÄ, de skÀller alltid programmerare för detta: "Varför gör du sÄ lÄnga och svÄra operationer?" Det hÀr Àr ett helt annat vinkelrÀtt Àmne. Tidigare fanns det administration, men nu blir det utveckling.

Uppenbarligen har vi inte brutit ner det i bitar. Kusten Àr klar. Det Àr omöjligt att dela en sÄdan DELETE för ett gÀng miljontals rader i delar. Det tar 20 minuter att göra och allt kommer att ligga ner. Men tyvÀrr gör Àven erfarna utvecklare misstag, Àven i mycket stora företag.

Varför Àr det viktigt att bryta?

  • Om vi ​​ser att skivan Ă€r hĂ„rd, lĂ„t oss sakta ner den. Och om vi Ă€r trasiga, dĂ„ kan vi lĂ€gga till pauser, vi kan bromsa gasen.

  • Och vi kommer inte att blockera andra lĂ€nge. I vissa fall spelar det ingen roll, om du tar bort riktigt skrĂ€p som ingen jobbar pĂ„, dĂ„ kommer du med största sannolikhet inte att blockera nĂ„gon förutom autovacuums arbete eftersom det vĂ€ntar pĂ„ att transaktionen ska slutföras. Men om du raderar nĂ„got som nĂ„gon annan kan begĂ€ra, dĂ„ kommer de att blockeras, det blir nĂ„gon form av kedjereaktion. LĂ„nga transaktioner bör undvikas pĂ„ webbplatser och mobilapplikationer.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

https://postgres.ai/products/joe/

Det hÀr Àr intressant. Jag ser ofta utvecklare som frÄgar "Vilken paketstorlek ska jag vÀlja?"

Det Àr tydligt att ju större batchstorleken Àr, desto lÀgre blir transaktionsoverheaden, dvs ytterligare transaktionsoverhead. Men samtidigt ökar tiden för denna transaktion.

Jag har en vÀldigt enkel regel: ta sÄ mÄnga som möjligt, men överskrid inte exekveringen per sekund.

Varför en sekund? Förklaringen Àr vÀldigt enkel och förstÄelig för alla, Àven icke-tekniska personer. Vi ser reaktionen. LÄt oss ta 50 millisekunder. Om nÄgot har förÀndrats kommer vÄrt öga att reagera. Om det Àr mindre Àr det svÄrare. Om nÄgot svarar efter 100 millisekunder, till exempel, du klickade med musen och det svarade dig efter 100 millisekunder, kÀnner du redan denna lilla fördröjning. En tvÄa uppfattas redan som en broms.

Följaktligen, om vi delar upp vÄra massoperationer i 10-sekunders skurar, riskerar vi att blockera nÄgon. Och det kommer att fungera i nÄgra sekunder, och folk kommer redan att mÀrka det. Det Àr dÀrför jag föredrar att inte göra det mer Àn en sekund. Men samtidigt, bryt inte ner det för litet, eftersom transaktionskostnader kommer att mÀrkas. Det blir tyngre för basen och olika andra problem kan uppstÄ.

Vi vÀljer förpackningsstorlek. I varje fall kan vi göra detta pÄ olika sÀtt. Kan automatiseras. Och vi Àr övertygade om effektiviteten i att bearbeta en förpackning. Det vill sÀga, vi tar bort ett paket eller uppdaterar.

Förresten, allt jag berÀttar handlar inte bara om DELETE. Som du gissade Àr detta alla bulkoperationer pÄ data.

Och vi ser att planen Àr utmÀrkt. Du kan se index scan, Ànnu bÀttre index scan. Och vi har en liten mÀngd data inblandade. Och allt fungerar pÄ mindre Àn en sekund. Super.

Och vi mÄste fortfarande se till att det inte sker nÄgon nedbrytning. Det hÀnder att de första satserna snabbt blir klara, och sedan blir allt vÀrre och vÀrre och vÀrre. Processen Àr sÄdan att du behöver testa mycket. Det Àr precis vad databaslabb behövs för.

Och vi mÄste fortfarande förbereda nÄgot sÄ att vi kan övervaka detta korrekt i produktionen. Vi kan till exempel skriva tiden i loggen, vi kan skriva var vi Àr nu och vilka vi nu har raderat. Och detta kommer att tillÄta oss att senare förstÄ vad som hÀnder. Och om nÄgot gÄr fel, hitta problemet snabbt.

Om vi ​​behöver kontrollera effektiviteten av frĂ„gor och vi behöver iterera mĂ„nga gĂ„nger, sĂ„ finns det nĂ„got sĂ„dant som en kollega-bot. Han Ă€r redan redo. Den anvĂ€nds av dussintals utvecklare varje dag. Och han kan tillhandahĂ„lla en enorm terabytedatabas pĂ„ begĂ€ran pĂ„ 30 sekunder, din egen kopia. Och du kan radera nĂ„got dĂ€r och sĂ€ga RESET, och radera det igen. Du kan experimentera med det pĂ„ detta sĂ€tt. Jag ser en framtid i det hĂ€r. Och vi gör redan detta.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

https://docs.gitlab.com/ee/development/background_migrations.html

Vilka Àr partitioneringsstrategierna? Jag ser 3 olika partitioneringsstrategier som utvecklarna anvÀnder pÄ paketet.

Den första Àr vÀldigt enkel. Vi har ett numeriskt ID. Och lÄt oss dela upp det i olika intervaller och arbeta med det. Nackdelen Àr tydlig. I det första segmentet kan vi ha 100 rader med riktigt sopor, i det andra 5 rader eller inte alls, eller sÄ kommer alla 1 000 rader att visa sig vara sopor. Mycket ojÀmnt arbete, men lÀtt att bryta. De tog max legitimation och slog sönder den. Detta Àr ett naivt tillvÀgagÄngssÀtt.

Den andra strategin Àr en balanserad strategi. Det anvÀnds i Gitlab. Vi tog och skannade bordet. Vi hittade grÀnserna för ID-paketen sÄ att varje förpackning innehöll exakt 10 000 poster. Och de fastnade mig i nÄgon slags kö. Och vi bearbetar vidare. Det kan du göra i flera trÄdar.

I den första strategin kan du förresten Àven göra detta i flera trÄdar. Det Àr inte svÄrt.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

https://medium.com/@samokhvalov/how-partial-indexes-affect-update-performance-in-postgres-d05e0052abc

Men det finns ett svalare och mer optimalt tillvÀgagÄngssÀtt. Detta Àr den tredje strategin. Och nÀr det Àr möjligt Àr det bÀttre att vÀlja det. Vi gör detta utifrÄn ett speciellt index. I det hÀr fallet kommer det med största sannolikhet att vara ett index baserat pÄ vÄrt soptillstÄnd och ID. Vi kommer att inkludera ID sÄ att det bara Àr en indexskanning sÄ att vi inte gÄr till högen.

Vanligtvis Àr endast indexsökning snabbare Àn indexskanning.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Och vi hittar snabbt vÄra ID:n som vi vill radera. Vi vÀljer BATCH_SIZE i förvÀg. Och vi tar inte bara emot dem, vi tar emot dem pÄ ett speciellt sÀtt och fixar dem omedelbart. Men vi lÄser dem pÄ ett sÄdant sÀtt att om de redan Àr lÄsta sÄ lÄser vi dem inte, utan gÄr vidare och tar nÀsta. Detta Àr för uppdateringshopplÄst. Denna Postgres superfunktion lÄter oss arbeta i flera trÄdar om vi vill. Möjligen i en trÄd. Och sÄ finns det CTE - det hÀr Àr en begÀran. Och vi har verklig borttagning pÄ gÄng pÄ andra vÄningen av denna CTE - returning *. Du kan returnera id, men det Àr bÀttre *, om du har lite data pÄ varje rad.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Varför behöver vi detta? Vi behöver detta för att kunna rapportera. Vi har nu raderat sÄ mÄnga rader faktiskt. Och vÄra grÀnser efter ID eller create_at Àr sÄ hÀr. Du kan göra min, max. NÄgot annat kan göras. Det finns mycket du kan stoppa in hÀr. Och detta Àr mycket bekvÀmt för övervakning.

Det finns ytterligare en anteckning om indexet. Om vi ​​bestĂ€mmer oss för att vi behöver ett speciellt index för just den hĂ€r uppgiften, mĂ„ste vi se till att det inte förstör uppdateringar av heap bara tupler. Det vill sĂ€ga, Postgres har sĂ„dan statistik. Detta kan ses i pg_stat_user_tables för din tabell. Du kan se om heta uppdateringar anvĂ€nds eller inte.

Det finns situationer dÄ ditt nya index helt enkelt kan klippa bort dem. Och alla andra uppdateringar som redan körs kommer att sakta ner. Inte bara för att indexet dök upp (varje index saktar ner uppdateringarna lite, men bara lite), men hÀr kommer det fortfarande att röra till saker och ting. Och det Àr omöjligt att göra speciell optimering för detta bord. Detta hÀnder ibland. Detta Àr en sÄdan subtilitet som fÄ mÀnniskor kommer ihÄg. Och det Àr lÀtt att trampa pÄ denna rake. Ibland hÀnder det att du behöver hitta ett tillvÀgagÄngssÀtt frÄn andra sidan och ÀndÄ klara dig utan detta nya index, eller göra ett annat index, eller göra nÄgot annat, till exempel kan du anvÀnda den andra metoden.

Men detta Àr den mest optimala strategin, hur man delar upp den i batcher och skjuter i omgÄngar med en begÀran, raderar lite i taget, etc.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

LĂ„nga transaktioner - https://gitlab.com/snippets/1890447

Blockerad autovakuum https://gitlab.com/snippets/1889668

Blockeringsproblem https://gitlab.com/snippets/1890428

Misstag #5 Àr stort. Nikolay frÄn Okmeter pratade om Postgres-övervakning. TyvÀrr existerar inte perfekt Postgres-övervakning. Vissa Àr nÀrmare, andra Àr lÀngre. Okmeter Àr tillrÀckligt nÀra för att vara perfekt, men det Àr mycket som saknas och mÄste lÀggas till. Du mÄste vara beredd pÄ detta.

Till exempel Àr det bÀttre att övervaka döda tuplar. Om du har mÄnga döda grejer pÄ bordet sÄ Àr nÄgot fel. Det Àr bÀttre att reagera nu, annars kan det bli försÀmring dÀr, och vi kan ligga ner. Det hÀnder.

Om det finns en stor IO sÄ Àr det klart att detta inte Àr bra.

LÄnga transaktioner ocksÄ. LÄnga transaktioner bör inte tillÄtas pÄ OLTP. Och hÀr Àr en lÀnk till utdraget, som lÄter dig ta det hÀr utdraget och redan göra en del spÄrning av lÄnga transaktioner.

Varför Ă€r lĂ„nga transaktioner dĂ„liga? Eftersom alla lĂ„s slĂ€pps först i slutet. Och vi lĂ„ser in alla. Dessutom blockerar vi autovakuum för alla bord. Det hĂ€r Ă€r inte alls bra. Även om du har aktiverat hot standby pĂ„ repliken Ă€r detta fortfarande dĂ„ligt. I allmĂ€nhet Ă€r det bĂ€ttre att undvika lĂ„nga transaktioner var som helst.

Om vi ​​har mĂ„nga bord som inte dammsugs sĂ„ behöver vi ha en varning. En sĂ„dan situation Ă€r möjlig hĂ€r. Vi kan indirekt pĂ„verka driften av autovakuum. Det hĂ€r Ă€r ett utdrag frĂ„n Avito, som jag förbĂ€ttrat lite. Och det visade sig vara ett intressant verktyg för att se vad vi har med autovakuum. Till exempel finns det nĂ„gra bord som vĂ€ntar dĂ€r och de vĂ€ntar inte pĂ„ sin tur. Du mĂ„ste ocksĂ„ lĂ€gga den i övervakning och ha en varning.

Och utfÀrdar block. Skog av blockerande trÀd. Jag gillar att ta nÄgot frÄn nÄgon och förbÀttra det. HÀr tog jag en cool rekursiv CTE frÄn Data Egret, som visar en skog av lÄsande trÀd. Detta Àr bra för diagnostik. Och övervakning kan ocksÄ byggas pÄ dess grund. Men detta mÄste göras försiktigt. Du mÄste göra en liten statement_timeout för dig sjÀlv. Och lock_timeout Àr önskvÀrt.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Ibland uppstÄr alla dessa fel samtidigt.

Enligt min mening Àr det viktigaste misstaget hÀr organisatoriskt. Det Àr organisatoriskt, eftersom tekniken inte fungerar. Det hÀr Àr nummer 2 - de checkade pÄ fel stÀlle.

Vi kollade pÄ fel stÀlle eftersom vi inte hade en produktionsklon som var lÀtt att kontrollera. Utvecklaren kanske inte har tillgÄng till produktion alls.

Och vi kollade pĂ„ fel stĂ€lle. Om de hade kollat ​​dĂ€r sĂ„ hade vi sett det sjĂ€lva. Utvecklaren kunde se allt detta Ă€ven utan en DBA, om han kontrollerade det i en bra miljö, dĂ€r det finns samma mĂ€ngd data och ett identiskt arrangemang. Han skulle ha sett all denna förnedring och skulle ha skĂ€mts.

Mer om bildammsugaren. Efter att vi har gjort en massiv sanering av flera miljoner rader behöver vi fortfarande göra en OMPACKNING. Detta Àr sÀrskilt viktigt för index. De kommer att mÄ dÄligt efter att vi stÀdat allt dÀr.

Och om du vill ta tillbaka det dagliga arbetet med att strippa, skulle jag föreslÄ att du gör det oftare, men mindre. Det kan vara en gÄng i minuten eller till och med lite oftare. Och vi mÄste övervaka tvÄ saker: att den hÀr saken inte har nÄgra fel och att den inte slÀpar efter. Knepet som jag visade gör att du kan lösa detta.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Det vi gör Àr öppen kÀllkod. Detta publiceras pÄ GitLab. Och vi gör det sÄ att folk kan kolla Àven utan DBA. Vi gör ett databaslabb, det vill sÀga vi kallar baskomponenten som Joe för nÀrvarande arbetar med. Och du kan ta en kopia av produktionen. Nu finns det en implementering av Joe för slack, du kan sÀga dÀr: "förklara en sÄdan och sÄdan begÀran" och omedelbart fÄ resultatet för din kopia av databasen. Du kan till och med göra DELETE dÀr, och ingen kommer att mÀrka det.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

LÄt oss sÀga att du har 10 terabyte, vi gör ett databaslabb ocksÄ 10 terabyte. Och 10 utvecklare kan arbeta samtidigt med 10 terabyte databaser samtidigt. Alla fÄr göra vad de vill. Kan ta bort, slÀppa, etc. Det hÀr Àr fantastiskt. Vi kommer att prata om detta imorgon.

BĂ€sta DELETE. Nikolay Samokhvalov (Postgres.ai)

Detta kallas thin provisioning. Detta Àr subtil provisionering. Det hÀr Àr nÄgon form av fantasi som i hög grad eliminerar förseningar i utveckling och testning och gör vÀrlden till en bÀttre plats i detta avseende. Det vill sÀga, det lÄter dig bara undvika problem med massoperationer.

Exempel: 5 terabyte databas, erhÄller en kopia pÄ mindre Àn 30 sekunder. Och det beror inte ens pÄ storleken, det vill sÀga det spelar ingen roll hur mÄnga terabyte.

Idag kan du gÄ till postgres.ai och grÀva i vÄra verktyg. Du kan registrera dig och se vad som finns dÀr. Du kan installera den hÀr boten sjÀlv. Det Àr gratis. Skriva.

frÄgor

Mycket ofta i verkliga situationer visar det sig att data som ska finnas kvar i tabellen Àr mycket mindre Àn vad som behöver raderas. Det vill sÀga, i en sÄdan situation Àr det ofta lÀttare att implementera detta tillvÀgagÄngssÀtt, nÀr det Àr lÀttare att skapa ett nytt objekt, kopiera endast nödvÀndig data dit och transkribera den gamla tabellen. Det Àr tydligt att du behöver en mjukvarustrategi för det hÀr ögonblicket medan du byter. Hur Àr detta tillvÀgagÄngssÀtt?

Detta Àr ett mycket bra tillvÀgagÄngssÀtt och en mycket bra uppgift. Det Àr vÀldigt likt det som pg_repack gör, det Àr vÀldigt likt det du mÄste göra nÀr du ID-personer gjorde det till 4 byte. MÄnga ramverk gjorde detta för flera Är sedan, och plattorna har precis blivit större, och de mÄste konverteras till 8 byte.

Denna uppgift Àr ganska svÄr. Vi gjorde det. Och du mÄste vara mycket försiktig. Det finns lÄs etc. Men det Àr gjort. Det vill sÀga, standardmetoden Àr att anvÀnda pg_repack. Du tillkÀnnager ett sÄdant tecken. Och innan du börjar fylla den med ögonblicksbilddata, deklarerar du ocksÄ en tabell som spÄrar alla Àndringar. Det finns ett knep dÀr att du kanske inte ens spÄrar vissa förÀndringar. Det finns finesser. Och sedan byter du och rullar ut Àndringarna. Det blir en kort paus nÀr vi lÄser in alla, men överlag görs detta.

Om du tittar pÄ pg_repack pÄ GitHub, dÄ det fanns en uppgift att konvertera ID frÄn int 4 till int 8, dÄ fanns det en idé att anvÀnda sjÀlva pg_repack. Detta Àr ocksÄ möjligt, men det hÀr Àr lite av en hackermetod, men det kommer ocksÄ att fungera för detta. Du kan ingripa i triggern som anvÀnder pg_repack och sÀga dÀr: "Vi behöver inte denna data", dvs vi överför bara det vi behöver. Och sÄ byter han bara och det Àr det.

Med detta tillvÀgagÄngssÀtt fÄr vi ocksÄ en andra kopia av tabellen, dÀr data redan Àr indexerad och mycket smidigt upplagd med vackra index.

Bloat nej, det hÀr Àr ett bra tillvÀgagÄngssÀtt. Men jag vet att det finns försök att utveckla automatisering för detta, det vill sÀga att göra en universell lösning. Jag kan presentera dig för denna automatisering. Det Àr skrivet i Python, bra grejer.

Jag Àr bara lite frÄn MySQL-vÀrlden, sÄ jag kom för att lyssna. Och vi anvÀnder detta tillvÀgagÄngssÀtt.

Men det Ă€r bara om vi har 90%. Om vi ​​har 5 % Ă€r det inte sĂ€rskilt bra att anvĂ€nda det.

Tack för rapporten! Om det inte finns nÄgra resurser för att göra en fullstÀndig kopia av prod, finns det nÄgon algoritm eller formel för att berÀkna belastningen eller storleken?

Bra frĂ„ga. Hittills har vi kunnat hitta databaser med flera terabyte. Även om hĂ„rdvaran dĂ€r inte Ă€r densamma, till exempel mindre minne, mindre processor och diskarna inte Ă€r exakt likadana, gör vi det Ă€ndĂ„. Om det inte finns nĂ„gonstans, mĂ„ste du tĂ€nka pĂ„ det. LĂ„t mig tĂ€nka pĂ„ det tills imorgon, du kom, vi pratar, det hĂ€r Ă€r en bra frĂ„ga.

Tack för rapporten! Du började först prata om att det finns en cool Postgres, som har sÄdana och sÄdana begrÀnsningar, men den hÄller pÄ att utvecklas. Och det hÀr Àr i det stora hela en krycka. MotsÀger inte allt detta utvecklingen av Postgres sjÀlv, dÀr nÄgon form av DELETE-deferent kommer att dyka upp eller nÄgot annat som borde hÄlla pÄ en lÄg nivÄ vad vi försöker dölja hÀr med nÄgra av vÄra egna konstiga medel?

Om vi ​​i SQL sa att vi skulle radera eller uppdatera mĂ„nga poster i en transaktion, hur kan Postgres dĂ„ distribuera detta? Vi Ă€r fysiskt begrĂ€nsade i verksamheten. Vi kommer fortfarande att göra det hĂ€r lĂ€nge. Och vi kommer att lĂ„sa vid den hĂ€r tiden osv.

De gjorde samma sak med index.

Jag kan anta att samma kontrollpunktsinstÀllning skulle kunna automatiseras. NÄgon gÄng kan detta hÀnda. Men dÄ förstÄr jag inte riktigt frÄgan.

FrÄgan Àr: finns det en utvecklingsvektor som gÄr just dÀr och gÄr parallellt med din hÀr? De dÀr. TÀnker de inte pÄ det Àn?

Jag pratade om de principer som kan anvÀndas nu. Det finns en annan bot Nancy, med detta kan du göra automatiserad kontrollpunktsinstÀllning. Kommer detta nÄgonsin att hÀnda i Postgres? Jag vet inte, detta diskuteras inte ens Àn. Vi Àr lÄngt ifrÄn detta Àn. Men det finns forskare som gör nya system. Och de knuffar in oss i automatiska index. Det finns utvecklingar. Du kan till exempel titta pÄ autotuning. Den vÀljer parametrar automatiskt. Men han kommer inte att göra checkpoint tuning Ät dig Ànnu. Det vill sÀga, det kommer att vÀlja för prestanda, skalbuffert, etc.

Och för kontrollpunktsinstÀllning kan du göra följande: om du har tusen kluster och olika delar av hÄrdvara, olika virtuella maskiner i molnet, kan du anvÀnda vÄr bot Nancy göra automatisering. Och max_wal_size kommer att vÀljas automatiskt enligt dina mÄlinstÀllningar. Men Àn sÄ lÀnge Àr detta inte ens i nÀrheten av att vara i kÀrnan, tyvÀrr.

God eftermiddag Du pratade om farorna med lÄnga transaktioner. Du sa att autovakuum blockeras vid raderingar. Hur skadar detta oss annars? För vi pratar mer om att frigöra utrymme och att kunna anvÀnda det. Vad mer har vi att förlora?

Autovacuum Àr kanske inte det största problemet hÀr. Och det faktum att en lÄng transaktion kan blockera andra transaktioner Àr en farligare möjlighet. Hon kanske trÀffas eller inte. Om hon trÀffades kan det gÄ vÀldigt illa. Och med autovacuum Àr detta ocksÄ ett problem. Det finns tvÄ problem med lÄnga transaktioner i OLTP: lÄs och autovakuum. Och om du har hot standby-feedback aktiverad pÄ repliken, kommer autovakuumblockeringen ocksÄ att anlÀnda till mastern, den kommer frÄn repliken. Men det blir Ätminstone inga lÄs dÀr. Och hÀr kommer det att finnas lÄs. Vi pratar om dataförÀndringar, sÄ lÄs Àr en viktig punkt hÀr. Och om detta pÄgÄr under en lÄng, lÄng tid, blockeras fler och fler transaktioner. De kan fÄnga andra. Och lÄstrÀd dyker upp. Jag gav en lÀnk till utdraget. Och detta problem blir snabbt mer mÀrkbart Àn problemet med autovakuum, som bara kan ackumuleras.

Tack för rapporten! Du började din rapport med att sÀga att du testat fel. Vi fortsatte vÄr idé att vi mÄste ta samma utrustning, med basen exakt densamma. LÄt oss sÀga att vi gav utvecklaren en bas. Och han efterkom begÀran. Och han verkar ha det bra. Men den kontrollerar inte pÄ live, utan pÄ live, till exempel Àr vÄr belastning 60-70%. Och Àven om vi anvÀnder den hÀr instÀllningen blir det inte sÀrskilt bra

Att ha en expert i ditt team och anvÀnda DBA-experter som kan förutsÀga vad som kommer att hÀnda under verklig bakgrundsbelastning Àr viktigt. NÀr vi helt enkelt kört igenom vÄra rena förÀndringar ser vi bilden. Men ett mer avancerat tillvÀgagÄngssÀtt var nÀr vi gjorde samma sak igen, men med en simulerad produktionsbelastning. Det hÀr Àr helt coolt. Vi behöver fortfarande vÀxa till denna punkt. Den Àr mogen. Vi tittade rent pÄ vad vi har och tittade ocksÄ pÄ om vi har tillrÀckligt med resurser. Det Àr en bra frÄga.

NÀr vi redan gör ett sopval och vi har till exempel en raderad flagga

Detta Àr vad autovacuum gör automatiskt i Postgres.

Åh, gör han det?

Autovacuum Àr sopsamlaren.

Tack!

Tack för rapporten! Finns det ett alternativ att omedelbart designa en databas med partitionering sÄ att allt skrÀp tas bort frÄn huvudbordet nÄgonstans Ät sidan?

Har sÄklart.

Kan vi dÄ skydda oss om vi har lÄst ett bord som inte ska anvÀndas?

Har sĂ„klart. Men det hĂ€r Ă€r en frĂ„ga om kyckling och Ă€gg. Om vi ​​alla vet vad som kommer att hĂ€nda i framtiden, sĂ„ kommer vi naturligtvis att göra allt bra. Men verksamheten förĂ€ndras, nya kolumner och nya förfrĂ„gningar dyker upp. Och sedan - oj, vi vill ta bort det. Men detta Ă€r en idealisk situation, det hĂ€nder i livet, men inte alltid. Men överlag Ă€r det en bra idĂ©. Bara trunkera och det Ă€r allt.

KĂ€lla: will.com

LĂ€gg en kommentar