Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Kèk tan nan tan kap vini an byen lwen, retire otomatik la nan done ki pa nesesè yo pral youn nan travay yo enpòtan nan DBMS la [1]. Nan entre-temps la, nou menm nou bezwen pran swen nan efase oswa deplase done ki pa nesesè nan sistèm depo mwens chè. Ann di ou deside efase kèk milyon ranje. Yon travay jistis senp, sitou si kondisyon an konnen epi gen yon endèks apwopriye. "DELETE FROM table1 WHERE col1 =:value" - ki sa ki ka pi senp, dwa?

Videyo:

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

  • Mwen te nan komite pwogram Highload la depi premye ane a, sa vle di depi 2007.

  • Apre sa, mwen te ak Postgres depi 2005. Itilize li nan anpil pwojè.

  • Gwoup ak RuPostges tou depi 2007.

  • Nou vinn plis pase 2100 patisipan nan Meetup. Li se dezyèm nan mond lan apre New York, depase pa San Francisco pou yon tan long.

  • Mwen te viv nan Kalifòni pou plizyè ane. Mwen fè fas plis ak konpayi Ameriken yo, ki gen ladan yo gwo. Yo se itilizatè aktif nan Postgres. Epi gen tout kalite bagay ki enteresan.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

https://postgres.ai/ se konpayi mwen an. Nou se nan biznis la nan otomatize travay ki elimine ralentissement devlopman.

Si w ap fè yon bagay, Lè sa a, pafwa gen kèk kalite ploge alantou Postgres. Ann di ou bezwen tann administratè a mete yon stand tès pou ou, oswa ou bezwen tann DBA a reponn ou. Epi nou jwenn blokaj sa yo nan pwosesis devlopman, tès ak administrasyon epi eseye elimine yo avèk èd nan automatisation ak nouvo apwòch.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

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

Mwen te dènyèman nan VLDB nan Los Angeles. Sa a se pi gwo konferans sou baz done. Epi te gen yon rapò ke nan tan kap vini an DBMS pa pral sèlman magazen, men tou, otomatikman efase done yo. Sa a se yon nouvo sijè.

Gen plis ak plis done nan mond lan nan zettabytes - sa a se 1 petabytes. Epi kounye a li deja estime ke nou gen plis pase 000 zettabytes done ki estoke nan mond lan. E gen plis ak plis nan yo.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

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

Ak kisa pou fè ak li? Li evidan li bezwen yo dwe retire. Men yon lyen ki mennen nan rapò enteresan sa a. Men, jiskaprezan sa a pa te aplike nan DBMS la.

Moun ki ka konte lajan vle de bagay. Yo vle nou efase, kidonk teknikman nou ta dwe kapab fè li.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Ki sa mwen pral di annapre se kèk sitiyasyon abstrè ki gen ladann yon pakèt sitiyasyon reyèl, sa vle di yon kalite konpilasyon de sa ki aktyèlman rive m 'ak baz done ki antoure yo anpil fwa, anpil ane. Rato yo toupatou ak tout moun mache sou yo tout tan.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Ann di nou gen yon baz oswa plizyè baz k ap grandi. Ak kèk dosye se evidamman fatra. Pou egzanp, itilizatè a te kòmanse fè yon bagay la, men li pa t 'fini li. Epi apre kèk tan nou konnen ke fini sa a pa ka estoke ankò. Sa vle di, nou ta renmen netwaye kèk bagay fatra yo nan lòd yo ekonomize espas, amelyore pèfòmans, elatriye.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

An jeneral, travay la se otomatize sipresyon an nan bagay espesifik, liy espesifik nan kèk tab.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Epi nou gen yon demann konsa, ke nou pral pale sou jodi a, se sa ki sou retire fatra.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Nou te mande yon pwomotè ki gen eksperyans fè li. Li te pran demann sa a, tcheke li pou tèt li - tout bagay ap travay. Teste sou sèn - tout bagay anfòm. Woule soti - tout bagay ap travay. Yon fwa pa jou nou kouri li - tout bagay anfòm.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Baz done a ap grandi ak grandi. Chak jou DELETE kòmanse travay yon ti kras pi dousman.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Lè sa a, nou konprann ke nou kounye a gen yon konpayi maketing ak trafik la pral plizyè fwa pi gwo, kidonk nou deside tanporèman pran yon poz bagay ki pa nesesè. Epi bliye retounen.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Kèk mwa apre yo te sonje. Ak pwomotè sa a kite oswa okipe ak yon lòt bagay, enstwi yon lòt retounen li.

Li tcheke sou dev, sou sèn - tout bagay se OK. Natirèlman, ou toujou bezwen netwaye sa ki akimile. Li tcheke tout bagay mache.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Kisa k ap pase apre? Lè sa a, tout bagay tonbe apa pou nou. Li gout pou ke nan kèk pwen tout bagay tonbe. Tout moun nan chòk, pèsonn pa konprann sa k ap pase. Lè sa a, li sanble ke pwoblèm nan te nan sa a DELETE.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Yon bagay ale mal? Isit la se yon lis sa ki te kapab ale mal. Kiyès nan sa yo ki pi enpòtan?

  • Pou egzanp, pa te gen okenn revizyon, sa vle di ekspè DBA a pa t 'gade li. Li ta imedyatman jwenn pwoblèm nan ak yon je ki gen eksperyans, epi anplis, li gen aksè a prod, kote plizyè milyon liy yo te akimile.

  • Petèt yo tcheke yon bagay ki mal.

  • Petèt pyès ki nan konpitè a demode epi ou bezwen ajou baz sa a.

  • Oswa yon bagay ki mal ak baz done a li menm, epi nou bezwen deplase soti nan Postgres nan MySQL.

  • Oswa petèt gen yon bagay ki mal ak operasyon an.

  • Petèt gen kèk erè nan òganizasyon an nan travay epi ou bezwen revoke yon moun epi anboche pi bon moun yo?

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Pa te gen okenn chèk DBA. Si ta gen yon DBA, li ta wè sa yo plizyè milyon liy e menm san okenn eksperyans ta di: "Yo pa fè sa." Sipoze si kòd sa a te nan GitLab, GitHub epi ta gen yon pwosesis revizyon kòd epi li pa t 'tankou ke san apwobasyon DBA a operasyon sa a ta fèt sou prod, Lè sa a, evidamman DBA a ta di: "Sa pa ka fèt. ”

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Apre sa, li ta di ke ou pral gen pwoblèm ak disk IO ak tout pwosesis pral fou, ka gen kadna, epi tou ou pral bloke otovakyòm pou yon pakèt minit, kidonk sa a pa bon.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

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

Dezyèm erè a - yo tcheke nan move kote. Nou te wè apre lefèt ke yon anpil nan done tenten akimile sou prod, men pwomotè a pa t 'akimile done nan baz done sa a, e pa gen moun ki te kreye tenten sa a pandan staging. An konsekans, te gen 1 liy ki byen vit travay deyò.

Nou konprann ke tès nou yo fèb, se sa ki, pwosesis ki bati a pa trape pwoblèm. Yon eksperyans DB adekwat pa te fèt.

Yon eksperyans ideyal se de preferans te pote sou menm ekipman an. Li pa toujou posib pou w fè sa sou menm ekipman an, men li enpòtan anpil pou li se yon kopi tout gwosè baz done a. Se sa mwen t ap preche depi plizyè ane kounye a. Ak yon ane de sa mwen te pale sou sa a, ou ka gade li tout sou YouTube.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Petèt ekipman nou an move? Si ou gade, Lè sa a, latansi a sote. Nou te wè ke itilizasyon se 100%. Natirèlman, si sa yo te kondui NVMe modèn, Lè sa a, li ta pwobableman pi fasil pou nou. E petèt nou pa ta kouche nan li.

Si ou gen nyaj, Lè sa a, ajou a fasil fè la. Leve nouvo kopi sou nouvo pyès ki nan konpitè. chanje sou. Ak tout se byen. Ase fasil.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Èske li posib pou yon jan kanmenm manyen pi piti disk yo? Ak isit la, jis avèk èd nan DBA, nou plonje nan yon sèten sijè ki rele akor pwen kontwòl. Li sanble ke nou pa t 'gen kontwòl pòs.

Ki sa ki se checkpoint? Li nan nenpòt DBMS. Lè ou gen done nan memwa ki chanje, li pa imedyatman ekri sou disk. Enfòmasyon ke done yo te chanje premye ekri nan jounal ekri-ahead la. Ak nan kèk pwen, DBMS a deside ke li lè yo jete paj reyèl nan disk, pou ke si nou gen yon echèk, nou ka fè mwens REDO. Se tankou yon jwèt. Si yo touye nou, nou pral kòmanse jwèt la soti nan pòs ki sot pase a. Ak tout DBMS aplike li.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Anviwònman yo nan Postgres yo rete dèyè. Yo fèt pou volim done ak tranzaksyon ki gen 10-15 ane. Ak pòs pa gen okenn eksepsyon.

Men enfòmasyon ki soti nan rapò chèk Postgres nou an, sa vle di chèk sante otomatik. Ak isit la se kèk baz done nan plizyè teraocte. Epi li ka wè byen ke baraj fòse nan prèske 90% nan ka yo.

Sa sa vle di? Gen de paramèt la. Checkpoint ka vini pa timeout, pou egzanp, nan 10 minit. Oswa li ka vini lè yo te ranpli anpil done.

Ak pa default max_wal_saze mete sou 1 gigaocte. An reyalite, sa vrèman rive nan Postgres apre 300-400 megabytes. Ou te chanje anpil done ak pòs ou a rive.

Men, si pa gen moun ki branche li, ak sèvis la te grandi, ak konpayi an touche anpil lajan, li gen yon anpil nan tranzaksyon, Lè sa a, pòs la vini yon fwa pa minit, pafwa chak 30 segonn, epi pafwa menm sipèpoze. Sa a se byen move.

E nou bezwen fer sir ki i vin mwens souvan. Sa vle di, nou ka ogmante max_wal_size. Epi li pral vini mwens souvan.

Men, nou te devlope yon metodoloji antye pou kouman fè li pi kòrèkteman, se sa ki, ki jan yo pran yon desizyon sou chwazi anviwònman, byen klè ki baze sou done espesifik.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

An konsekans, nou ap fè de seri eksperyans sou baz done.

Premye seri a - nou chanje max_wal_size. Epi nou ap fè yon operasyon masiv. Premyèman, nou fè li sou anviwònman an default nan 1 gigaocte. Epi nou fè yon masiv DELETE nan plizyè milyon liy.

Ou ka wè ki jan li difisil pou nou. Nou wè ke disk IO se trè move. Nou gade konbyen WAL nou te pwodwi, paske sa a trè enpòtan. Ann wè konbyen fwa pòs la te pase. Epi nou wè ke li pa bon.

Apre sa, nou ogmante max_wal_size. Nou repete. Nou ogmante, nou repete. Ak anpil fwa. Nan prensip, 10 pwen se yon bon bagay, kote 1, 2, 4, 8 jigokte. Apre sa, nou gade nan konpòtman an nan yon sistèm patikilye. Li klè ke isit la ekipman yo ta dwe tankou sou prod. Ou dwe gen menm disk yo, menm kantite memwa, ak menm anviwònman Postgres yo.

Ak nan fason sa a nou pral echanj sistèm nou an, epi nou konnen ki jan DBMS yo pral konpòte yo nan ka ta gen yon move mas DELETE, ki jan li pral checkpoint.

Checkpoint nan Larisi yo se pòs.

Egzanp: Efase plizyè milyon ranje pa endèks, ranje yo "gaye" atravè paj.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Men yon egzanp. Sa a se kèk baz. Ak anviwònman an default nan 1 gigabyte pou max_wal_size, li trè klè ke disk nou yo ale nan etajè a pou anrejistreman. Foto sa a se yon sentòm tipik nan yon pasyan trè malad, se sa ki, li reyèlman te santi move. Epi te gen yon sèl operasyon, te gen jis yon DELETE nan plizyè milyon liy.

Si yo pèmèt yon operasyon konsa nan prod, Lè sa a, nou pral jis kouche, paske li klè ke yon sèl DELETE touye nou nan etajè a.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Pli lwen, kote 16 jigokte, li klè ke dan yo te deja ale. Dan yo deja pi bon, se sa ki, nou ap frape nan plafon an, men se pa tèlman mal. Te gen kèk libète la. Sou bò dwat la se dosye a. Ak kantite operasyon yo - dezyèm graf la. Epi li klè ke nou deja respire yon ti kras pi fasil lè 16 gigabytes.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Ak kote 64 gigabytes ka wè ke li te vin konplètman pi bon. Deja dan yo pwononse, gen plis opòtinite yo siviv lòt operasyon ak fè yon bagay ak disk la.

Poukisa se konsa?

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Mwen pral plonje nan detay yo yon ti kras, men sijè sa a, ki jan yo fè akor pwen kontwòl, ka lakòz yon rapò antye, kidonk mwen pa pral chaje anpil, men mwen pral dekri yon ti kras ki difikilte ki genyen.

Si pòs la rive twò souvan, epi nou mete ajou liy nou yo pa sekans, men jwenn pa endèks, ki se yon bon bagay, paske nou pa efase tab la tout antye, Lè sa a, li ka rive ke nan premye nou manyen premye paj la, Lè sa a, milyèm lan, Apre sa, li tounen nan premye a. Men, si ant vizit sa yo nan premye paj la, checkpoint te deja sove li sou disk, Lè sa a, li pral sove li ankò, paske nou te sal li yon dezyèm fwa.

Epi nou pral fòse pòs pou sove li anpil fwa. Ki jan ta gen operasyon redondants pou li.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Men, sa se pa tout. Paj yo se 8 kilookte nan Postgres ak 4 kilookte nan Linux. Epi gen yon anviwònman full_page_writes. Li aktive pa default. Ak sa a kòrèk, paske si nou fèmen li, Lè sa a, gen yon danje ke sèlman mwatye nan paj la pral sove si li aksidan.

Konpòtman ekri nan WAL nan mòso annavan yo se konsa ke lè nou gen yon pòs epi nou chanje paj la pou premye fwa, tout paj la, sa vle di, tout 8 kilobyte, antre nan mòso annavans la, byenke nou sèlman chanje paj la. liy, ki peze 100 bytes. Epi nou dwe ekri tout paj la.

Nan chanjman ki vin apre, pral gen sèlman yon tuple espesifik, men pou premye fwa nou ekri tout bagay.

Epi, kòmsadwa, si pòs la te rive ankò, Lè sa a, nou dwe kòmanse tout bagay soti nan grate ankò epi pouse tout paj la. Avèk pòs souvan, lè nou mache nan menm paj yo, full_page_writes = on ap plis pase sa li ta ka, sa vle di nou jenere plis WAL. Plis yo voye nan kopi, nan achiv la, nan disk.

Epi, kòmsadwa, nou gen de redondans.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Si nou ogmante max_wal_size, li sanble ke nou rann li pi fasil pou tou de checkpoint ak wal ekriven. Epi sa se gwo.

Ann mete yon terabyte epi viv ak li. Ki sa ki mal nan li? Sa a se move, paske nan ka ta gen yon echèk, nou pral monte pou èdtan, paske pòs la te yon bon bout tan de sa ak anpil te deja chanje. Epi nou bezwen fè tout sa REDO. Se konsa, nou fè dezyèm seri eksperyans yo.

Nou fè yon operasyon epi wè lè pòs la ap fini, nou touye -9 Postgres espre.

Apre sa, nou kòmanse li ankò, epi wè konbyen tan li pral monte sou ekipman sa a, sa vle di konbyen li pral REDO nan move sitiyasyon sa a.

De fwa mwen pral note ke sitiyasyon an se move. Premyèman, nou te fè aksidan jis anvan pòs la te fini, kidonk nou gen anpil bagay pou nou pèdi. E dezyenmman, nou ti fer en operasyon masiv. Men, si pòs yo te sou timeout, lè sa a, gen plis chans, mwens WAL ta dwe pwodwi depi dènye pòs yo. Sa vle di, li se yon defisi doub.

Nou mezire yon sitiyasyon konsa pou diferan gwosè max_wal_size epi nou konprann ke si max_wal_size se 64 gigabytes, Lè sa a, nan yon ka doub pi move nou pral monte pou 10 minit. Apre sa, nou panse si li kostim nou oswa ou pa. Sa a se yon kesyon biznis. Nou bezwen montre foto sa a bay moun ki responsab desizyon biznis yo epi mande, “Konbyen tan nou ka kouche pi plis nan ka ta gen yon pwoblèm? Èske nou ka kouche nan sitiyasyon ki pi mal la pou 3-5 minit? Epi ou pran yon desizyon.

Ak isit la se yon pwen enteresan. Nou gen yon koup nan rapò sou Patroni nan konferans lan. E petèt w ap itilize li. Sa a se yon autofailover pou Postgres. GitLab ak Data Egret te pale sou sa.

Men, si ou gen yon autofailover ki vini nan 30 segonn, Lè sa a, petèt nou ka kouche pou 10 minit? Paske nou pral chanje nan kopi a nan pwen sa a, ak tout bagay pral byen. Sa a se yon pwen moot. Mwen pa konnen yon repons klè. Mwen jis santi ke sijè sa a se pa sèlman alantou rekiperasyon aksidan.

Si nou gen yon rekiperasyon long apre yon echèk, Lè sa a, nou pral alèz nan anpil lòt sitiyasyon. Pou egzanp, nan eksperyans yo menm, lè nou fè yon bagay epi pafwa gen yo rete tann pou 10 minit.

Mwen toujou pa ta ale twò lwen, menm si nou gen yon autofailover. Kòm yon règ, valè tankou 64, 100 jigokte yo se bon valè. Pafwa li menm vo chwazi mwens. An jeneral, sa a se yon syans sibtil.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Pou fè iterasyon, pou egzanp, max_wal_size = 1, 8, ou bezwen repete operasyon an mas anpil fwa. Ou te fè li. Ak sou baz la menm ou vle fè l 'ankò, men ou te deja efase tout bagay. Kisa pou fe?

Mwen pral pale pita sou solisyon nou an, ki sa nou fè nan lòd yo iterasyon nan sitiyasyon sa yo. Lè sa a se apwòch ki pi kòrèk la.

Men, nan ka sa a, nou te gen chans. Si, jan li di isit la "KÒMANSE, EFASE, ROLLBACK", Lè sa a, nou ka repete EFISYE. Sa vle di, si nou anile li tèt nou, Lè sa a, nou ka repete li. Ak fizikman nan ou done yo pral kouche nan menm kote a. Ou pa menm jwenn okenn gonfleman. Ou ka repete sou sa yo DELETE.

DELETE ak ROLLBACK sa a se ideyal pou akor pwen kontwòl, menm si ou pa gen yon laboratwa baz done byen deplwaye.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Nou te fè yon plak ak yon kolòn "i". Postgres gen kolòn sèvis piblik. Yo envizib sof si yo mande yo espesyalman. Sa yo se: ctid, xmid, xmax.

Ctid se yon adrès fizik. Zewo paj, premye tuple nan paj la.

Li ka wè ke apre ROOLBACK tuple la rete nan menm kote. Sa vle di, nou ka eseye ankò, li pral konpòte menm jan an. Sa a se bagay prensipal la.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Xmax se tan an nan lanmò nan tuple la. Li te gen tenm sou li, men Postgres konnen ke tranzaksyon an te woule tounen, kidonk li pa enpòtan si li nan 0 oswa li se yon tranzaksyon woule tounen. Sa a sijere ke li posib iterasyon sou DELETE epi tcheke operasyon yo esansyèl nan konpòtman sistèm nan. Ou ka fè laboratwa baz done pou pòv yo.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Sa a se sou pwogramè yo. Konsènan DBA, tou, yo toujou reprimande pwogramè yo pou sa a: "Poukisa w ap fè operasyon sa yo long ak difisil?". Sa a se yon sijè pèpandikilè konplètman diferan. Te gen administrasyon, epi kounye a pral gen devlopman.

Li evidan, nou pa te kraze an miyèt moso. Li klè. Li enposib pa kraze sa yo DELETE pou yon pil dè milyon de liy nan pati. Li pral fè pou 20 minit, ak tout bagay pral kouche. Men, malerezman, menm devlopè ki gen eksperyans fè erè, menm nan konpayi trè gwo.

Poukisa li enpòtan pou kraze?

  • Si nou wè disk la difisil, ann ralanti li. Men, si nou kase, Lè sa a, nou ka ajoute poz, nou ka ralanti throttling.

  • Epi nou p ap bloke lòt moun pou yon bon bout tan. Nan kèk ka li pa enpòtan, si w ap efase fatra reyèl ke pèsonn pa ap travay sou, Lè sa a, gen plis chans ou pa pral bloke nenpòt moun eksepte travay la otovakyòm, paske li pral tann pou tranzaksyon an fini. Men, si ou retire yon bagay ke yon lòt moun ka mande, Lè sa a, yo pral bloke, pral gen kèk kalite reyaksyon chèn. Tranzaksyon long yo ta dwe evite sou sit entènèt ak aplikasyon pou mobil.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

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

Sa a se enteresan. Mwen souvan wè ke devlopè mande: "Ki gwosè pake mwen ta dwe chwazi?".

Li klè ke pi gwo gwosè pake a, se pi piti sou tèt tranzaksyon an, sa vle di, anplis anlè soti nan tranzaksyon yo. Men, an menm tan an, tan an ogmante pou tranzaksyon sa a.

Mwen gen yon règ trè senp: pran otan ke ou kapab, men pa ale sou ègzèkutabl pou chak segonn.

Poukisa yon dezyèm? Eksplikasyon an trè senp ak konprann pou tout moun, menm moun ki pa teknik. Nou wè yon reyaksyon. Ann pran 50 milisgond. Si yon bagay te chanje, lè sa a je nou pral reyaji. Si mwens, lè sa a pi difisil. Si yon bagay reponn apre 100 milisgond, pou egzanp, ou klike sou sourit la, epi li reponn ou apre 100 milisgond, ou deja santi ti reta sa a. Yon dezyèm deja perçu kòm fren.

An konsekans, si nou kraze operasyon mas nou an nan eklat 10 segonn, Lè sa a, nou gen yon risk ke nou pral bloke yon moun. Epi li pral travay pou kèk segond, ak moun ap deja remake li. Se poutèt sa, mwen pito pa fè plis pase yon segonn. Men, an menm tan an, pa kraze li trè tise byen, paske sou tèt tranzaksyon an pral aparan. Baz la pral pi difisil, ak lòt pwoblèm diferan ka leve.

Nou chwazi gwosè pake a. Nan chak ka, nou ka fè li yon fason diferan. Èske yo ka otomatize. Epi nou konvenki nan efikasite nan pwosesis la nan yon sèl pake. Sa vle di, nou fè DELETE yon pake oswa MIZAJOU.

An pasan, tout sa m ap pale a pa sèlman sou DELETE. Kòm ou devine, sa yo se nenpòt operasyon esansyèl sou done.

Epi nou wè ke plan an ekselan. Ou ka wè eskanè endèks la, endèks sèlman eskanè se menm pi bon. Epi nou gen yon ti kantite done ki enplike. Ak mwens pase yon dezyèm akonpli. Super.

E nou ankor bezwen fer sir ki napa degradasyon. Sa rive ke premye pake yo byen vit travay deyò, ak Lè sa a, li vin pi mal, vin pi mal ak vin pi mal. Pwosesis la se konsa ke ou bezwen teste anpil. Sa a se egzakteman sa laboratwa baz done se pou.

Epi nou toujou gen pou prepare yon bagay pou li pral pèmèt nou swiv sa kòrèkteman nan pwodiksyon an. Pou egzanp, nou ka ekri tan an nan jounal la, nou ka ekri kote nou ye kounye a ak ki moun nou te efase kounye a. E sa ap pèmèt nou konprann sa k ap pase pita. Ak nan ka yon bagay ale mal, byen vit jwenn pwoblèm nan.

Si nou bezwen tcheke efikasite nan demann epi nou bezwen repete anpil fwa, Lè sa a, gen yon bagay tankou yon bot parèy. Li deja pare. Li se itilize pa plizyè douzèn devlopè chak jou. Apre sa, li konnen ki jan yo bay yon baz done terabyte gwo sou demann nan 30 segonn, kopi pwòp ou a. Epi ou ka efase yon bagay la epi di RESET, epi efase li ankò. Ou ka fè eksperyans ak li nan fason sa a. Mwen wè yon avni pou bagay sa a. Epi nou deja fè li.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

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

Ki sa ki estrateji partitioning? Mwen wè 3 diferan estrateji partition ke devlopè yo sou pake a ap itilize.

Premye a se trè senp. Nou gen yon ID nimerik. Apre sa, kite a kraze li nan diferan entèval ak travay ak sa. Dezavantaj la klè. Nan premye segman an, nou ka gen 100 liy fatra reyèl, nan dezyèm 5 liy yo oswa pa ditou, oswa tout 1 liy yo pral tounen fatra. Travay trè inegal, men li fasil pou kraze. Yo pran ID maksimòm lan epi yo kraze l. Sa a se yon apwòch nayif.

Dezyèm estrateji a se yon apwòch ekilibre. Yo itilize li nan Gitlab. Yo pran epi tcheke tab la. Nou te jwenn limit pake ID yo pou chak pake te gen egzakteman 10 dosye. Epi mete yo nan yon keu. Apre sa, nou travay. Ou ka fè sa nan plizyè fil.

Nan estrateji an premye, tou, nan chemen an, ou ka fè sa nan plizyè fil. Li pa difisil.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

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

Men, gen yon apwòch pi fre ak pi bon. Sa a se twazyèm estrateji. Ak lè sa posib, li se pi bon yo chwazi li. Nou fè sa sou baz yon endèks espesyal. Nan ka sa a, li pral gen plis chans pou yon endèks dapre kondisyon fatra nou yo ak ID. Nou pral enkli ID a pou ke li se yon endèks sèlman eskanè pou nou pa ale nan pil la.

Anjeneral, eskanè endèks sèlman pi vit pase eskanè endèks.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Epi nou byen vit jwenn ID nou yo ke nou vle retire. BATCH_SIZE nou chwazi davans. Epi nou pa sèlman jwenn yo, nou jwenn yo nan yon fason espesyal epi imedyatman Hack yo. Men, nou fèmen pou si yo deja fèmen, nou pa fèmen yo, men avanse pou pi devan epi pran pwochen yo. Sa a se pou aktyalizasyon sote fèmen. Karakteristik super sa a nan Postgres pèmèt nou travay nan plizyè fil si nou vle. Li posib nan yon sèl kouran. Ak isit la gen yon CTE - sa a se yon sèl demann. Epi nou gen yon efase reyèl k ap pase nan dezyèm etaj CTE sa a - returning *. Ou ka retounen id, men li pi bon *si ou pa gen anpil done sou chak liy.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Poukisa nou bezwen li? Sa a se sa nou bezwen rapòte. Nou gen kounye a efase anpil liy an reyalite. Epi nou gen fwontyè pa ID oswa pa created_at tankou sa a. Ou ka fè min, max. Yon lòt bagay ka fè. Ou ka bagay anpil isit la. Epi li trè pratik pou siveyans.

Gen yon lòt nòt sou endèks la. Si nou deside ke nou bezwen yon endèks espesyal pou travay sa a, Lè sa a, nou bezwen asire w ke li pa gate pil sèlman mizajou tuples. Sa vle di, Postgres gen estatistik sa yo. Ou ka wè sa nan pg_stat_user_tables pou tab ou a. Ou ka wè si mizajou cho yo te itilize oswa ou pa.

Gen sitiyasyon lè nouvo endèks ou a ka tou senpleman koupe yo. Epi ou gen tout lòt mizajou ki deja ap travay, ralanti. Se pa sèlman paske endèks la parèt (chak endèks ralanti mizajou yon ti kras, men yon ti kras), men isit la li toujou ruine li. Epi li enposib fè optimize espesyal pou tab sa a. Sa rive pafwa. Sa a se tankou yon sibtilite ke kèk moun sonje. Ak rato sa a se fasil etap sou. Pafwa li rive ke ou bezwen jwenn yon apwòch soti nan lòt bò a epi ou toujou ap fè san yo pa nouvo endèks sa a, oswa fè yon lòt endèks, oswa nan kèk lòt fason, pou egzanp, ou ka itilize dezyèm metòd la.

Men, sa a se estrateji ki pi optimal, ki jan yo divize an lo ak tire nan lo ak yon sèl demann, efase yon ti kras, elatriye.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Tranzaksyon lontan https://gitlab.com/snippets/1890447

Bloke otovakyòm - https://gitlab.com/snippets/1889668

pwoblèm bloke - https://gitlab.com/snippets/1890428

Erè #5 se yon gwo. Nikolai soti nan Okmeter te pale de siveyans Postgres. Siveyans Postgres ideyal, malerezman, pa egziste. Gen kèk ki pi pre, kèk ki pi lwen. Okmeter se ase pre yo te pafè, men yon anpil ki manke epi yo bezwen ajoute. Ou bezwen pare pou sa.

Pou egzanp, tuples mouri yo pi byen kontwole. Si ou gen anpil bagay ki mouri nan tab la, Lè sa a, gen yon bagay ki mal. Li pi bon pou reyaji kounye a, otreman ka gen degradasyon, epi nou ka kouche. Li rive.

Si gen yon gwo IO, Lè sa a, li klè ke sa a pa bon.

Tranzaksyon lontan tou. Tranzaksyon long pa ta dwe pèmèt sou OLTP. Ak isit la se yon lyen nan yon snippet ki pèmèt ou pran snippet sa a epi ki deja fè kèk swiv tranzaksyon long.

Poukisa tranzaksyon lontan yo move? Paske tout kadna yo pral lage sèlman nan fen an. Epi nou vis tout moun. Anplis, nou bloke otovakyòm pou tout tab. Li pa bon ditou. Menm si ou gen sibstiti cho pèmèt sou kopi a, li toujou move. An jeneral, okenn kote li pi bon pou evite tranzaksyon ki long yo.

Si nou gen anpil tab ki pa aspiratè, Lè sa a, nou bezwen gen yon alèt. Isit la yon sitiyasyon konsa posib. Nou ka endirèkteman afekte operasyon an nan autovacuum. Sa a se yon ti bout nan Avito, ke mwen yon ti kras amelyore. Epi li te tounen yon zouti enteresan yo wè sa nou genyen ak autovacuum. Pou egzanp, kèk tab ap tann la epi yo pa pral tann pou vire yo. Ou bezwen tou mete l 'nan siveyans ak gen yon alèt.

Ak pwoblèm blòk. Forest nan pye bwa blòk. Mwen renmen pran yon bagay nan men yon moun ak amelyore li. Isit la mwen te pran yon fre CTE rekursif soti nan Data Egret ki montre yon forè nan pye bwa fèmen. Sa a se yon bon zouti dyagnostik. Ak sou baz li yo, ou ka tou bati siveyans. Men, sa a dwe fè ak anpil atansyon. Ou bezwen fè yon ti statement_timeout pou tèt ou. Ak lock_timeout se dezirab.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Pafwa tout erè sa yo rive nan sòm.

Dapre mwen, erè prensipal la isit la se òganizasyonèl. Li se òganizasyonèl, paske teknik la pa rale. Sa a se nimewo 2 - yo tcheke nan move kote.

Nou tcheke nan move kote, paske nou pa t 'gen yon script pwodiksyon, ki se fasil tcheke sou. Yon pwomotè ka pa gen aksè a pwodiksyon ditou.

Epi nou tcheke pa la. Si nou te tcheke la, nou ta wè li tèt nou. Pwomotè a te wè li tout menm san yon DBA si li tcheke li nan yon bon anviwònman, kote gen menm kantite done ak yon kote ki idantik. Li ta wè tout degradasyon sa yo e li ta wont.

Plis enfòmasyon sou autovacuum. Apre nou fin fè yon gwo bale plizyè milyon liy, nou toujou bezwen fè REPACK. Sa a se espesyalman enpòtan pou endèks. Yo pral santi yo move apre nou netwaye tout bagay la.

Men, si ou vle pote tounen travay la netwaye chak jou, Lè sa a, mwen ta sijere fè li pi souvan, men pi piti. Li kapab yon fwa pa minit oswa menm pi souvan yon ti kras. Epi ou bezwen kontwole de bagay: ke bagay sa a pa gen okenn erè e ke li pa lag dèyè. Trick ke mwen te montre pral jis rezoud sa a.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Sa nou fè se sous louvri. Li afiche sou GitLab. Epi nou fè li pou moun ka tcheke menm san yon DBA. Nou ap fè yon laboratwa baz done, se sa ki, nou rele eleman nan baz sou ki Joe ap travay kounye a. Epi ou ka pwan yon kopi pwodiksyon an. Koulye a, gen yon aplikasyon nan Joe pou kanson, ou ka di la: "eksplike tankou yon demann" epi imedyatman jwenn rezilta a pou kopi ou nan baz done a. Ou ka menm DELETE la, epi pèsonn pa pral remake li.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Ann di ou gen 10 terabytes, nou fè baz done laboratwa tou 10 terabytes. Ak baz done 10 teraocte similtane, 10 devlopè ka travay ansanm. Tout moun ka fè sa yo vle. Ka efase, gout, elatriye Sa a se tankou yon fantezi. Nou pral pale de sa demen.

Mezanmi DELETE. Nikolay Samokhvalov (Postgres.ai)

Yo rele sa mens pwovizyon. Sa a se pwovizyon sibtil. Sa a se kèk kalite fantasy ki retire anpil reta nan devlopman, nan tès ak fè mond lan yon pi bon plas nan sans sa a. Sa vle di, li jis pèmèt ou evite pwoblèm ak operasyon esansyèl.

Egzanp: baz done 5 terabyte, jwenn yon kopi nan mwens pase 30 segonn. Epi li pa menm depann sou gwosè a, se sa ki, li pa gen pwoblèm konbyen terabytes.

Jodi a ou ka ale nan postgres.ai epi fouye nan zouti nou yo. Ou ka enskri pou wè sa ki la. Ou ka enstale bot sa a. Li gratis. Ekri.

Kesyon ou yo

Trè souvan nan sitiyasyon reyèl li vire soti ke done yo ki ta dwe rete nan tablo a se anpil mwens pase sa ki bezwen yo dwe efase. Sa vle di, nan yon sitiyasyon konsa, li se souvan pi fasil aplike yon apwòch sa a, lè li pi fasil yo kreye yon nouvo objè, kopi sèlman done ki nesesè yo la, ak kòf tab la fin vye granmoun. Li klè ke yon apwòch pwogram ki nesesè pou moman sa a, pandan w ap chanje. Ki jan apwòch sa a ye?

Sa a se yon apwòch trè bon ak yon travay trè bon. Li sanble anpil ak sa pg_repack fè, li sanble anpil ak sa ou dwe fè lè ou fè ID 4 byte. Anpil kad te fè sa kèk ane de sa, epi jis plak yo te grandi, epi yo bezwen konvèti nan 8 bytes.

Travay sa a se byen difisil. Nou te fè li. Epi ou dwe pran anpil prekosyon. Gen kadna, elatriye Men, li ap fèt. Sa vle di, apwòch estanda a se ale ak pg_repack. Ou deklare yon etikèt konsa. Epi anvan ou kòmanse telechaje done snapshot nan li, ou deklare tou yon plak ki swiv tout chanjman yo. Gen yon Trick ke ou ka pa menm swiv kèk chanjman. Gen sibtilite. Lè sa a, ou chanje pa woule chanjman. Pral gen yon ti poz lè nou fèmen tout moun, men an jeneral sa ap fèt.

Si ou gade nan pg_repack sou GitHub, Lè sa a, gen, lè te gen yon travay konvèti yon ID soti nan int 4 nan int 8, Lè sa a, te gen yon lide yo sèvi ak pg_repack tèt li. Sa a se posib tou, men li se yon ti jan nan yon Hack, men li pral travay pou sa a tou. Ou ka entèvni nan deklanche pg_repack itilize epi di la: "Nou pa bezwen done sa yo", sa vle di nou transfere sèlman sa nou bezwen. Lè sa a, li jis switch ak sa a li.

Avèk apwòch sa a, nou toujou jwenn yon dezyèm kopi tab la, kote done yo deja endis ak anpile trè respire ak bèl endèks.

Bloat pa prezan, li se yon bon apwòch. Men, mwen konnen ke gen tantativ pou devlope yon automatisation pou sa a, sa vle di fè yon solisyon inivèsèl. Mwen ka mete ou an kontak ak automatisation sa a. Li ekri nan Python, ki se yon bon bagay.

Mwen jis yon ti kras nan mond lan nan MySQL, Se konsa, mwen te vin koute. Epi nou itilize apwòch sa a.

Men, se sèlman si nou gen 90%. Si nou gen 5%, Lè sa a, li pa trè bon yo sèvi ak li.

Mèsi pou rapò a! Si pa gen okenn resous pou fè yon kopi konplè prod, èske gen nenpòt algorithm oswa fòmil pou kalkile chaj la oswa gwosè?

Bon kesyon. Jiskaprezan, nou kapab jwenn baz done milti-terabyte. Menm si pyès ki nan konpitè pa gen menm bagay la tou, pou egzanp, mwens memwa, mwens processeur ak disk yo pa egzakteman menm bagay la, men toujou nou fè li. Si pa gen absoliman okenn kote, Lè sa a, ou bezwen panse. Kite m reflechi jiska demen, ou vini, nou pral pale, sa a se yon bon kesyon.

Mèsi pou rapò a! Ou te kòmanse premye sou lefèt ke gen yon Postgres fre, ki gen limit sa yo ak sa yo, men li ap devlope. Lè sa a se tout yon beki an jeneral. Èske tout bagay sa yo pa an konfli ak devlopman nan Postgres li menm, nan ki kèk DELETE deferent pral parèt oswa yon lòt bagay ki ta dwe kenbe nan yon nivo ki ba sa nou yo ap eseye fwote ak kèk nan mwayen etranj nou isit la?

Si nou te di nan SQL efase oswa mete ajou anpil dosye nan yon sèl tranzaksyon, Lè sa a, ki jan Postgres ka distribye li la? Nou limite fizikman nan operasyon yo. Nou pral toujou fè li pou yon tan long. Epi nou pral fèmen nan moman sa a, elatriye.

Fè ak endèks.

Mwen ka asime ke menm akor pwen kontwòl la ka otomatize. Yon jou li ta ka. Men lè sa a mwen pa vrèman konprann kesyon an.

Kesyon an se, èske gen yon vektè devlopman konsa ki ale isit la epi la, ak isit la ou ale paralèl? Moun sa yo. Yo poko reflechi sou sa?

Mwen te pale sou prensip ki ka itilize kounye a. Gen yon lòt bot Nancy, ak sa a ou ka fè akor otomatik pòs. Èske li pral yon jou nan Postgres? Mwen pa konnen, li poko menm te diskite. Nou toujou lwen de sa. Men, gen syantis ki fè nouvo sistèm. Apre sa, yo pouse nou nan endis otomatik yo. Gen devlopman. Pou egzanp, ou ka gade nan akor oto. Li chwazi paramèt otomatikman. Men, li pa pral fè akor pòs kontwòl pou ou ankò. Sa vle di, li pral ranmase pou pèfòmans, tanpon koki, elatriye.

Ak pou akor pwen kontwòl, ou ka fè sa: si ou gen mil grap ak pyès ki nan konpitè diferan, diferan machin vityèl nan nwaj la, ou ka itilize bot nou an. Nancy fè automatisation. Epi yo pral chwazi max_wal_size dapre paramèt sib ou otomatikman. Men, byen lwen tèlman sa a se pa menm fèmen nan nwayo a, malerezman.

Bon apremidi Ou te pale sou danje ki genyen nan tranzaksyon long. Ou te di ke autovacuum bloke nan ka ta gen sipresyon. Ki lòt bagay li fè nou mal? Paske n ap pale plis sou libere espas epi pou nou kapab sèvi ak li. Ki lòt bagay nou manke?

Autovacuum se petèt pa pi gwo pwoblèm isit la. Ak lefèt ke yon tranzaksyon long ka fèmen lòt tranzaksyon, posibilite sa a se pi danjere. Li ka oswa pa ka rankontre. Si li te rankontre, Lè sa a, li ka trè move. Ak autovacuum - sa a se tou yon pwoblèm. Gen de pwoblèm ak tranzaksyon long nan OLTP: kadna ak autovacuum. Men, si ou gen fidbak sibstiti cho pèmèt sou kopi a, Lè sa a, w ap toujou resevwa yon seri otovakyòm sou mèt la, li pral rive nan kopi a. Men, omwen pa pral gen okenn kadna. Epi pral gen loks. Nou ap pale de chanjman done, kidonk kadna yo se yon pwen enpòtan isit la. Men, si sa a se tout pou yon tan, long tan, Lè sa a, pi plis ak plis tranzaksyon yo fèmen. Yo ka vòlè lòt moun. Epi pye bwa lok parèt. Mwen bay yon lyen ki mennen nan snippet la. Ak pwoblèm sa a vin pi aparan pi vit pase pwoblèm nan ak autovacuum, ki ka sèlman akimile.

Mèsi pou rapò a! Ou te kòmanse rapò w la lè w te di ou te fè yon tès mal. Nou kontinye lide nou ke nou bezwen pran menm ekipman an, ak baz la nan menm fason an. Ann di nou te bay pwomotè a yon baz. Apre sa, li respekte demann lan. Epi li sanble ap anfòm. Men, li pa tcheke pou viv, men pou viv, pou egzanp, nou gen yon chaj nan 60-70%. E menm si nou itilize akor sa a, li pa travay trè byen.

Gen yon ekspè nan ekip la ak itilize ekspè DBA ki ka predi sa ki pral rive ak yon chaj background reyèl enpòtan. Lè nou jis kondwi chanjman pwòp nou yo, nou wè foto a. Men, yon apwòch ki pi avanse, lè nou te fè menm bagay la ankò, men ak yon chaj simulation ak pwodiksyon. Li byen fre. Jiska lè sa a, ou dwe grandi. Se tankou yon granmoun. Nou jis gade sa nou genyen ak tou gade si nou gen ase resous. Sa se yon bon kesyon.

Lè nou deja fè yon seleksyon fatra epi nou gen, pou egzanp, yon drapo efase

Sa a se sa autovacuum fè otomatikman nan Postgres.

Oh, li fè li?

Autovacuum se pèseptè fatra a.

Mèsi!

Mèsi pou rapò a! Èske gen yon opsyon imedyatman desine yon baz done ak patisyon nan yon fason ke tout fatra vin sal soti nan tab prensipal la yon kote sou bò a?

Natirèlman genyen.

Lè sa a, li posib pou pwoteje tèt nou si nou te fèmen yon tab ki pa ta dwe itilize?

Natirèlman genyen. Men, se tankou yon kesyon poul ak ze. Si nou tout konnen sa ki pral rive nan tan kap vini an, lè sa a, nan kou, nou pral fè tout bagay fre. Men biznis la ap chanje, gen nouvo kolòn, nouvo demann. Lè sa a, - oops, nou vle retire li. Men, sitiyasyon ideyal sa a, nan lavi li rive, men se pa toujou. Men, an jeneral li se yon bon lide. Jis tronpe ak sa a.

Sous: www.habr.com

Add nouvo kòmantè