Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Mwen sijere ou li transkripsyon rapò a depi nan konmansman an nan 2016 pa Andrey Salnikov "Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql"

Nan rapò sa a, mwen pral analize erè prensipal yo nan aplikasyon ki rive nan etap nan konsepsyon ak ekri kòd aplikasyon an. Apre sa, mwen pral pran sèlman erè sa yo ki mennen nan gonfleman nan Postgresql. Kòm yon règ, sa a se kòmansman an nan fen pèfòmans nan sistèm ou an antye, byenke okòmansman pa gen okenn kondisyon pou sa a te vizib.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Mwen kontan akeyi tout moun! Rapò sa a pa teknik menm jan ak ansyen kòlèg mwen an. Rapò sa a se sitou ki vize a devlopè sistèm backend paske nou gen yon kantite jistis gwo kliyan. Epi yo tout fè menm erè yo. Mwen pral pale w sou yo. Mwen pral eksplike ki sa ki fatal ak move bagay erè sa yo mennen nan.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Poukisa yo fè erè? Yo fè pou de rezon: nan o aza, petèt li pral travay deyò ak paske nan inyorans nan kèk mekanis ki rive nan nivo ki genyen ant baz done a ak aplikasyon an, osi byen ke nan baz done a tèt li.

Mwen pral ba ou twa egzanp ak foto terib ki jan bagay yo te move. Mwen pral yon ti tan di ou sou mekanis ki rive la. Ak ki jan fè fas ak yo, ki lè yo te rive, ak ki metòd prevantif yo itilize pou anpeche erè. Mwen pral di ou sou zouti oksilyè yo epi bay lyen itil.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Mwen te itilize yon baz done tès kote mwen te gen de tab. Yon plak ak kont kliyan, lòt la ak tranzaksyon sou kont sa yo. Ak kèk frekans nou mete ajou balans yo sou kont sa yo.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Done inisyal nan plak la: li se byen piti, 2 MB. Tan an repons pou baz done a ak espesyalman pou siy la tou trè bon. Ak yon chaj jistis bon - 2 operasyon pou chak segonn dapre plak la.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

E atravè rapò sa a mwen pral montre w graf pou w ka byen konprann sa k ap pase. Ap toujou gen 2 glisad ak graf. Premye glise a se sa k ap pase an jeneral sou sèvè a.

Ak nan sitiyasyon sa a, nou wè ke nou reyèlman gen yon ti siy. Endèks la piti nan 2 MB. Sa a se premye graf ki sou bò gòch la.

Tan an repons mwayèn sou sèvè a se tou ki estab ak kout. Sa a se graf ki anlè dwat.

Graf gòch anba a montre tranzaksyon ki pi long yo. Nou wè ke tranzaksyon yo fini byen vit. Ak autovacuum a pa travay isit la ankò, paske li te yon tès kòmanse. L ap kontinye travay epi l ap itil nou.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Dezyèm glisad la ap toujou dedye a plak y ap teste a. Nan sitiyasyon sa a, nou toujou ap mete ajou balans kont kliyan an. Epi nou wè tan an mwayèn repons pou yon operasyon aktyalizasyon se byen bon, mwens pase yon milisgond. Nou wè ke resous processeur (sa a se graf anwo dwat) yo tou konsome respire ak byen piti.

Graf ki pi ba dwat la montre konbyen memwa fonksyònman ak disk nou ale nan rechèch nan liy nou an vle anvan mete ajou li. Ak kantite operasyon dapre siy la se 2 pou chak segonn, jan mwen te di nan kòmansman an.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Epi kounye a nou gen yon trajedi. Pou kèk rezon, gen yon tranzaksyon lontan bliye. Rezon ki fè yo anjeneral tout ordinèr:

  • Youn nan pi komen an se ke nou te kòmanse jwenn aksè nan yon sèvis ekstèn nan kòd aplikasyon an. Ak sèvis sa a pa reponn nou. Sa vle di, nou te louvri yon tranzaksyon, te fè yon chanjman nan baz done a epi yo te soti nan aplikasyon an li lapòs oswa nan yon lòt sèvis nan enfrastrikti nou an, epi pou kèk rezon li pa reponn nou. Epi sesyon nou an bloke nan yon eta kote li pa konnen ki lè li pral rezoud.
  • Dezyèm sitiyasyon an se lè yon eksepsyon ki te fèt nan kòd nou an pou kèk rezon. Ak nan eksepsyon a nou pa t 'pwosesis fèmen nan tranzaksyon an. Epi nou te fini ak yon sesyon pandye ak yon tranzaksyon ouvè.
  • Ak dènye a se tou yon ka jistis komen. Sa a se kòd bon jan kalite ki ba. Gen kèk kad ki louvri yon tranzaksyon. Li pandye, epi ou ka pa konnen nan aplikasyon an ke ou gen li pandye.

Ki kote bagay sa yo mennen?

Jiska pwen ke tab nou yo ak endèks yo kòmanse anfle dramatikman. Sa a se egzakteman menm efè a gonfleman. Pou baz done a, sa pral vle di ke tan an repons baz done ap ogmante trè sevè epi chaj la sou sèvè baz done a ap ogmante. Ak kòm yon rezilta, aplikasyon nou an ap soufri. Paske si ou te pase 10 milisgond nan kòd ou a sou yon demann nan baz done a, 10 milisgond sou lojik ou, Lè sa a, fonksyon ou te pran 20 milisgond pou konplete. Epi kounyeya sitiyasyon ou pral tris anpil.

Epi ann wè sa k ap pase. Graf gòch anba a montre ke nou gen yon tranzaksyon long long. Men, si nou gade nan graf la anwo gòch, nou wè ke gwosè a nan tab nou an te toudenkou vole soti nan de megabyte a 300 megabyte. An menm tan an, kantite done ki nan tablo a pa chanje, sa vle di gen yon gwo kantite fatra la.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Sitiyasyon an jeneral konsènan tan an repons sèvè mwayèn tou chanje pa plizyè lòd nan grandè. Sa vle di, tout demann sou sèvè a te kòmanse tonbe nèt. Ak an menm tan an, pwosesis entèn Postgres yo te lanse nan fòm lan nan autovacuum, ki ap eseye fè yon bagay ak konsome resous yo.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Kisa k ap pase ak siy nou an? Menm bagay la tou. Tan mwayèn repons nou an selon siy la te monte plizyè lòd nan grandè. Espesyalman an tèm de resous konsome, nou wè ke chaj la sou processeur a te ogmante anpil. Sa a se graf ki anlè dwat. Epi li te ogmante paske processeur a gen triye nan yon pakèt moun sou liy initil nan rechèch nan youn nan bezwen an. Sa a se graf ki anba a dwat. Ak kòm yon rezilta, kantite apèl nou an pou chak segonn te kòmanse desann trè siyifikativman, paske baz done a pa t 'gen tan pou trete menm kantite demann.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Nou bezwen retounen nan lavi. Nou ale sou entènèt epi chèche konnen ke tranzaksyon ki long mennen nan pwoblèm. Nou jwenn ak touye tranzaksyon sa a. Epi tout bagay ap vin nòmal pou nou. Tout bagay ap travay jan li ta dwe.

Nou kalme, men apre yon ti tan nou kòmanse remake ke aplikasyon an pa travay menm jan ak anvan ijans la. Demann yo toujou trete pi dousman, ak siyifikativman pi dousman. Youn ak yon mwatye a de fwa pi dousman espesyalman nan egzanp mwen an. Chaj la sou sèvè a se tou pi wo pase li te anvan aksidan an.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Ak kesyon an: "Kisa k ap pase nan baz la nan moman sa a?" Ak sitiyasyon sa a rive ak baz la. Sou tablo tranzaksyon an ou ka wè ke li te sispann epi pa gen reyèlman pa gen okenn tranzaksyon alontèm. Men, gwosè a nan siy la fatalman ogmante pandan aksidan an. E depi lè sa a yo pa diminye. Tan an mwayèn sou baz la te estabilize. Ak repons yo sanble ap vini ase nan yon vitès akseptab pou nou. Autovacuum a te vin pi aktif e li te kòmanse fè yon bagay ak siy la, paske li bezwen vann nan plis done.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Espesyalman, dapre plak tès la ak kont, kote nou chanje balans: tan an repons pou yon demann sanble yo te retounen nan nòmal. Men, an reyalite li se yon fwa ak yon mwatye pi wo.

Ak nan chaj la sou processeur a, nou wè ke chaj la sou processeur a pa te retounen nan valè ki nesesè anvan aksidan an. Ak rezon ki fè yo gen manti jisteman nan graf ki pi ba dwat la. Li ka wè ke yon sèten kantite memwa ke yo te fouye la. Sa vle di, pou jwenn liy ki nesesè yo, nou gaspiye resous yo nan sèvè baz done a pandan y ap klasman nan done initil. Kantite tranzaksyon pou chak segonn te estabilize.

An jeneral bon, men sitiyasyon an pi mal pase sa li te ye. Degradasyon baz done klè kòm yon konsekans aplikasyon nou an ki travay ak baz done sa a.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Epi pou w konprann sa k ap pase la, si w pa t nan rapò anvan an, kounye a ann pran yon ti teyori. Teyori sou pwosesis entèn la. Poukisa yon vakyòm machin ak sa li fè?

Literalman yon ti tan pou konpreyansyon. Nan kèk pwen nan tan nou gen yon tab. Nou gen ranje nan tablo a. Liy sa yo ka aktif, vivan, ak sa nou bezwen kounye a. Yo make an vèt nan foto a. Apre sa, gen liy mouri ki te deja travay deyò, yo te mete ajou, ak nouvo antre yo te parèt sou yo. Epi yo make yo ke yo pa enteresan ankò nan baz done a. Men, yo nan tablo a akòz yon karakteristik Postgres.

Poukisa ou bezwen yon vakyòm machin? Nan kèk pwen, otovakyòm lan vini, jwenn aksè nan baz done a epi mande li: "Tanpri, ban m idantite tranzaksyon ki pi ansyen ki louvri kounye a nan baz done a." Baz done a retounen id sa a. Ak otovakyòm nan, konte sou li, sòt nan liy ki nan tablo a. Men, si li wè ke kèk liy yo te chanje pa anpil tranzaksyon ki pi gran, Lè sa a, li gen dwa make yo kòm liy ke nou ka reitilize nan lavni nan ekri nouvo done la. Sa a se yon pwosesis background.

Nan moman sa a, nou kontinye travay ak baz done a epi kontinye fè kèk chanjman nan tab la. Ak sou liy sa yo, ke nou ka reitilize, nou ekri nouvo done. Se konsa, nou jwenn yon sik, sa vle di tout tan tout tan an kèk fin vye liy mouri parèt la, olye pou yo nou ekri liy nouvo ke nou bezwen. Epi sa a se yon eta nòmal pou PostgreSQL travay.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Kisa ki te pase pandan aksidan an? Ki jan pwosesis sa a te rive la?

Nou te gen yon siy nan kèk kondisyon, kèk vivan, kèk liy mouri. Vakyòm machin lan rive. Li te mande baz done a ki sa ki pi ansyen tranzaksyon nou an ak ki sa id li ye. Mwen te resevwa id sa a, ki ta ka plizyè èdtan de sa, petèt dis minit de sa. Sa depann de ki jan lou chaj ou genyen sou baz done ou a. Epi li te ale chèche liy ke li te kapab make kòm reitilize. Apre sa, mwen pa t 'jwenn liy sa yo nan tablo nou an.

Men, nan moman sa a nou kontinye travay ak tab la. Nou fè yon bagay ladan l, mete ajou li, chanje done yo. Kisa baz done a ta dwe fè nan moman sa a? Li pa gen okenn chwa men ajoute nouvo liy nan fen tab la ki egziste deja. Se konsa, gwosè tab nou an kòmanse anfle.

An reyalite, nou bezwen liy vèt pou travay. Men, pandan yon pwoblèm konsa, li sanble ke pousantaj la nan liy vèt yo trè ba nan tout tab la.

Men, lè nou egzekite yon rechèch, baz done a gen yo ale nan tout liy yo: tou de wouj ak vèt, jwenn liy ki vle a. Ak efè a nan gonfleman yon tab ak done initil yo rele "gonfle", ki tou manje espas disk nou an. Sonje byen, li te 2 MB, li te vin 300 MB? Koulye a, chanje megabyte nan gigaocte epi ou pral byen vit pèdi tout resous disk ou yo.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Ki konsekans ta ka genyen pou nou?

  • Nan egzanp mwen an, tab la ak endèks te grandi 150 fwa. Gen kèk nan kliyan nou yo te gen plis ka fatal lè yo tou senpleman te kòmanse kouri soti nan espas disk.
  • Gwosè tab yo tèt li p'ap janm diminye. Autovacuum nan kèk ka ka koupe ke tab la si gen sèlman liy mouri. Men, kòm gen wotasyon konstan, yon liy vèt ka friz nan fen a epi yo pa dwe mete ajou, pandan y ap tout lòt yo pral ekri yon kote nan kòmansman an nan plak la. Men, sa a se tankou yon evènman fasil ke tab ou a tèt li ap retresi nan gwosè, kidonk ou pa ta dwe espere pou li.
  • Baz done a bezwen sòt nan yon pakèt antye nan liy initil. Epi nou gaspiye resous disk, nou gaspiye resous processeur ak elektrisite.
  • Ak sa a dirèkteman afekte aplikasyon nou an, paske si nan kòmansman an nou te pase 10 milisgond sou demann lan, 10 milisgond sou kòd nou an, Lè sa a, pandan aksidan an nou te kòmanse pase yon segond sou demann lan ak 10 milisgond sou kòd la, sa vle di yon lòd mayitid nan pèfòmans aplikasyon an diminye. Epi lè aksidan an te rezoud, nou te kòmanse pase 20 milisgond sou yon demann, 10 milisgond sou yon kòd. Sa vle di ke nou toujou tonbe nan yon fwa ak yon mwatye nan pwodiktivite. Epi sa a se tout akòz yon tranzaksyon ki te jele, petèt nan fòt nou.
  • Ak kesyon an: "Ki jan nou ka jwenn tout bagay tounen?" Se konsa ke tout bagay anfòm ak nou ak demann vini osi vit ke anvan aksidan an.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Pou rezon sa a gen yon sik sèten nan travay ki te pote soti.

Premyèman, nou bezwen jwenn tab yo pwoblèm ki gonfle. Nou konprann ke nan kèk tab anrejistreman an pi aktif, nan lòt moun mwens aktif. E pou sa nou itilize ekstansyon an pgstattuple. Lè w enstale ekstansyon sa a, ou ka ekri demann ki pral ede w jwenn tab ki byen gonfle.

Yon fwa ou jwenn tab sa yo, ou bezwen konprese yo. Gen zouti deja pou sa. Nan konpayi nou an nou itilize twa zouti. Premye a se bati-an VACUUM FULL. Li mechan, piman bouk ak san pitye, men pafwa li trè itil. Pg_repack и pgcompacttable - Sa yo se sèvis piblik twazyèm pati pou konpresyon tab. Epi yo trete baz done a plis ak anpil atansyon.

Yo itilize yo depann sou sa ki pi bon pou ou. Men, mwen pral di ou sou sa a nan fen anpil. Bagay pwensipal lan se ke gen twa zouti. Gen anpil pou chwazi nan.

Apre nou fin korije tout bagay ak asire w ke tout bagay anfòm, nou dwe konnen ki jan yo anpeche sitiyasyon sa a nan lavni:

  • Li ka anpeche byen fasil. Ou bezwen kontwole dire sesyon yo sou sèvè Mèt la. Espesyalman sesyon danjere nan san fè anyen konsa nan eta tranzaksyon. Sa yo se moun ki jis louvri yon tranzaksyon, fè yon bagay epi kite, oswa tou senpleman pandye, te pèdi nan kòd la.
  • Epi pou ou menm, kòm devlopè, li enpòtan pou teste kòd ou a lè sitiyasyon sa yo rive. Li pa difisil pou fè. Sa a pral yon chèk itil. Ou pral evite yon gwo kantite pwoblèm "anfans" ki asosye ak tranzaksyon long.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Nan graf sa yo, mwen te vle montre w kouman siy la ak konpòtman baz done a te chanje apre mwen te pase nan siy ki gen VACUUM FULL nan ka sa a. Sa a se pa pwodiksyon pou mwen.

Gwosè tab la imedyatman tounen nan eta nòmal operasyon li yo nan yon koup de megabyte. Sa a pa te afekte anpil tan an repons mwayèn pou sèvè a.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Men, espesyalman pou siy tès nou an, kote nou mete ajou balans kont, nou wè tan an mwayèn repons pou yon demann pou mete ajou done nan siy la te redwi nan nivo anvan ijans. Resous yo konsome pa processeur a ranpli demann sa a tou tonbe nan nivo anvan aksidan. Ak graf ki pi ba dwat la montre ke kounye a nou jwenn egzakteman liy ke nou bezwen an touswit, san yo pa ale nan pil liy ki mouri ki te la anvan tab la te konprese. Ak tan an mwayèn demann rete nan apeprè menm nivo. Men, isit la mwen gen, olye, yon erè nan pyès ki nan konpitè mwen an.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Sa a se kote premye istwa a fini. Li se pi komen an. Epi li rive tout moun, kèlkeswa eksperyans kliyan an ak ki jan pwogramè yo kalifye. Pi bonè oswa pita sa rive.

Dezyèm istwa a, nan ki nou distribye chaj la ak optimize resous sèvè

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

  • Nou gentan grandi e nou vin nèg serye. Epi nou konprann ke nou gen yon kopi epi li ta bon pou nou balanse chaj la: ekri Mèt la, epi li nan kopi a. Epi anjeneral sitiyasyon sa a rive lè nou vle prepare kèk rapò oswa ETL. Ak biznis trè kontan sou sa. Li reyèlman vle yon varyete de rapò ak yon anpil nan analiz konplèks.
  • Rapò yo pran plizyè èdtan, paske analiz konplèks pa ka kalkile an milisgond. Nou menm, tankou nèg vanyan, ekri kòd. Nan aplikasyon an insertion nou fè anrejistreman an sou Mèt la, epi egzekite rapò yo sou kopi a.
  • Distribiye chaj la.
  • Tout bagay ap travay parfe. Nou gran.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Ak ki jan sitiyasyon sa a sanble? Espesyalman sou graf sa yo, mwen te ajoute tou dire tranzaksyon yo nan kopi a pou dire tranzaksyon an. Tout lòt graf yo refere sèlman a sèvè Mèt la.

Nan moman sa a, tablo rapò mwen an te grandi. Gen plis nan yo. Nou wè tan an mwayèn sèvè repons stab. Nou wè ke sou kopi a nou gen yon tranzaksyon ki dire lontan ki kouri pou 2 èdtan. Nou wè operasyon an trankil nan autovacuum a, ki trete liy mouri. Ak tout bagay anfòm ak nou.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Espesyalman, dapre plak teste a, nou kontinye mete ajou balans kont la. Epi nou gen tou yon tan repons ki estab pou demann, konsomasyon resous ki estab. Tout bagay anfòm ak nou.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Tout bagay anfòm jiskaske rapò sa yo kòmanse revoke akòz yon konfli ak replikasyon. Epi yo tire tounen nan entèval regilye.

Nou ale sou entènèt epi kòmanse li poukisa sa ap pase. E nou jwenn yon solisyon.

Premye solisyon an se ogmante latansi replikasyon an. Nou konnen ke rapò nou an kouri pou 3 èdtan. Nou mete reta replikasyon an sou 3 èdtan. Nou ap lanse tout bagay, men nou toujou kontinye gen pwoblèm ak rapò pafwa yo te anile.

Nou vle tout bagay yo dwe pafè. Nou monte pi lwen. Epi nou jwenn yon anviwònman fre sou entènèt la - hot_standby_feedback. Ann vire l. Hot_standby_feedback pèmèt nou kenbe otovakyòm nan sou Mèt la. Kidonk, nou konplètman debarase m de konfli replikasyon. Ak tout bagay mache byen pou nou ak rapò.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Ak sa k ap pase ak sèvè Master a nan moman sa a? Epi nou nan pwoblèm total ak sèvè Master la. Koulye a, nou ap wè graf yo lè mwen te pèmèt tou de paramèt sa yo. Epi nou wè ke sesyon an sou kopi nou an yon jan kanmenm te kòmanse enfliyanse sitiyasyon an sou sèvè a Mèt. Li gen yon efè paske li te kanpe otovakyòm ki efase liy ki mouri yo. Gwosè tab nou an te monte ankò. Tan an mwayèn egzekisyon demann atravè baz done a tou monte. Autovacuum a sere boulon moute yon ti kras.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Espesyalman, soti nan plak nou an, nou wè ke aktyalizasyon nan done sou li tou vole nan syèl la. Konsomasyon CPU te ogmante menm jan an anpil. Nou ap pase ankò nan yon gwo kantite mouri, liy initil. Ak tan an repons pou siy sa a ak kantite tranzaksyon yo te tonbe.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Ki sa l ap sanble si nou pa konnen de sa m t ap pale anvan?

  • Nou kòmanse chèche pwoblèm. Si nou te rankontre pwoblèm nan premye pati a, nou konnen ke sa a ka akòz yon tranzaksyon ki long epi ale nan Mèt la. Nou gen yon pwoblèm sou Mèt la. Sosis li. Li chofe, Mwayèn Chaj li se sou yon santèn.
  • Demann la yo ralanti, men nou pa wè okenn tranzaksyon ki dire lontan. Epi nou pa konprann sa ki nan pwoblèm nan. Nou pa konprann ki kote pou nou gade.
  • Nou tcheke ekipman sèvè. Petèt atak nou an te fè aksidan. Petèt baton memwa nou an boule. Wi, nenpòt bagay ka rive. Men non, serveurs yo nouvo, tout bagay ap mache byen.
  • Tout moun ap kouri: administratè, devlopè ak direktè a. Pa gen anyen ki ede.
  • Ak nan kèk pwen tout bagay toudenkou kòmanse korije tèt li.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Nan moman sa a, demann lan sou kopi nou an te trete epi kite. Nou te resevwa rapò a. Biznis toujou kontan. Kòm ou ka wè, siy nou an te grandi ankò epi li pa pral retresi. Sou graf ki gen sesyon yo, mwen te kite yon moso tranzaksyon long sa a soti nan yon kopi pou ou ka estime konbyen tan li pran jiskaske sitiyasyon an estabilize.

Sesyon an fini. Epi sèlman apre kèk tan sèvè a vini plis oswa mwens nan lòd. Ak tan an mwayèn repons pou demann sou sèvè Mèt la retounen nan nòmal. Paske, finalman, otovakyòm nan gen opòtinite pou netwaye epi make liy mouri sa yo. Epi li te kòmanse fè travay li. Ak ki jan vit li fè li, se konsa byen vit nou pral jwenn nan lòd.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Dapre tablèt la teste, kote nou mete ajou balans kont, nou wè egzakteman menm foto a. Tan an mwayèn aktyalizasyon kont tou piti piti nòmal. Resous yo konsome pa processeur a yo tou redwi. Ak kantite tranzaksyon pou chak segonn retounen nan nòmal. Men, ankò nou tounen nan nòmal, pa menm jan nou te anvan aksidan an.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Nan nenpòt ka, nou jwenn yon drawdown pèfòmans, tankou nan premye ka a, pa youn ak yon mwatye a de fwa, epi pafwa plis.

Nou sanble te fè tout bagay byen. Distribye chay la. Ekipman an pa san fè anyen konsa. Nou divize demann yo dapre lide nou, men toujou tout bagay te tounen mal.

  • Pa aktive hot_standby_feedback? Wi, li pa rekòmande pou vire li sou san rezon patikilyèman fò. Paske tòde sa a afekte dirèkteman sèvè Mèt la ak sispann operasyon an nan autovacuum la. Lè w pèmèt li sou kèk kopi epi bliye sou li, ou ka touye Mèt la epi jwenn gwo pwoblèm ak aplikasyon an.
  • Ogmante max_standby_streaming_delay? Wi, pou rapò sa a se vre. Si ou gen yon rapò twa èdtan epi ou pa vle li aksidan akòz konfli replikasyon, Lè sa a, tou senpleman ogmante reta a. Yon rapò alontèm pa janm mande pou done ki te rive nan baz done a kounye a. Si ou genyen li pou twa èdtan, Lè sa a, ou ap kouri li pou kèk peryòd done fin vye granmoun. Ak pou ou, si gen yon reta twa èdtan oswa yon reta sis èdtan pa pral fè okenn diferans, men ou pral resevwa rapò toujou epi yo pa pral gen okenn pwoblèm ak yo tonbe.
  • Natirèlman, ou bezwen kontwole sesyon long sou kopi, sitou si w deside pèmèt hot_standby_feedback sou yon kopi. Paske nenpòt bagay ka rive. Nou te bay devlopè a kopi sa a pou li te kapab teste demann yo. Li te ekri yon demann fou. Li te lanse li epi li te ale nan bwè te, epi nou jwenn Mèt la etabli. Oswa petèt nou mete move aplikasyon an ladan l. Sitiyasyon yo varye. Sesyon sou kopi yo dwe kontwole ak anpil atansyon menm jan ak sou Mèt la.
  • Men, si ou gen demann rapid ak long sou kopi, Lè sa a, nan ka sa a li pi bon divize yo distribye chaj la. Sa a se yon lyen ki mennen nan streaming_delay. Pou moun ki rapid, gen yon sèl kopi ak yon ti reta replikasyon. Pou demann rapò ki dire lontan, gen yon kopi ki ka retade pa 6 èdtan oswa yon jou. Sa a se yon sitiyasyon konplètman nòmal.

Nou elimine konsekans yo nan menm fason an:

  • Nou jwenn tab gonfleman.
  • Epi nou konprese li ak zouti ki pi pratik ki kostim nou.

Dezyèm istwa a fini isit la. Ann ale nan twazyèm istwa a.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Epitou byen komen pou nou nan ki nou fè migrasyon.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

  • Nenpòt pwodwi lojisyèl ap grandi. Kondisyon yo pou li yo ap chanje. Nan nenpòt ka, nou vle devlope. Epi li rive ke nou bezwen mete ajou done yo nan tablo a, sètadi kouri yon aktyalizasyon an tèm de migrasyon nou an pou nouvo fonksyonalite ke nou ap entwodwi kòm yon pati nan devlopman nou an.
  • Ansyen fòma done a pa satisfezan. Ann di kounye a nou ale nan dezyèm tab la, kote mwen gen tranzaksyon sou kont sa yo. Epi kite yo di ke yo te nan rubles, epi nou deside ogmante presizyon an epi fè li nan kopèk. Ak pou sa a nou bezwen fè yon aktyalizasyon: miltipliye jaden an ak kantite lajan tranzaksyon an pa yon santèn.
  • Nan monn jodi a, nou itilize zouti otomatik kontwòl vèsyon baz done. Ann di Liquibase. Nou anrejistre migrasyon nou an la. Nou teste li sou baz tès nou an. Tout bagay anfòm. Aktyalizasyon a ap pase. Li bloke travay pou yon ti tan, men nou jwenn done ajou. Epi nou ka lanse nouvo fonksyonalite sou sa a. Tout bagay te teste ak tcheke. Tout bagay te konfime.
  • Nou te fè travay planifye ak te pote soti migrasyon.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Isit la se migrasyon an ak aktyalizasyon a prezante devan ou. Depi sa yo se tranzaksyon kont mwen an, plak la te 15 GB. Epi depi nou mete ajou chak liy, nou double gwosè tab la ak aktyalizasyon a, paske nou reekri chak liy.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Pandan migrasyon an, nou pa t 'kapab fè anyen ak plak sa a, paske tout demann yo te nan keu epi tann jiskaske aktyalizasyon sa a te konplete. Men, isit la mwen vle atire atansyon ou sou nimewo yo ki sou aks vètikal la. Sa vle di, nou gen yon tan demann mwayèn anvan migrasyon apeprè 5 milisgond ak chaj processeur a, kantite operasyon blòk pou lekti memwa ki gen kapasite se mwens pase 7,5.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Nou te pote soti migrasyon an ak te gen pwoblèm ankò.

Migrasyon an te reyisi, men:

  • Ansyen fonksyonalite a kounye a pran plis tan pou konplete.
  • Tablo a te grandi nan gwosè ankò.
  • Chaj la sou sèvè a ankò te vin pi gran pase anvan.
  • Epi, nan kou, nou toujou brikolaj ak fonksyonalite a ki te travay byen, nou te amelyore li yon ti kras.

Epi sa a se ankò gonfleman, ki ankò kraze lavi nou.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Isit la mwen demontre ke tab la, tankou de ka anvan yo, pa pral retounen nan gwosè anvan li yo. Chaj sèvè mwayèn sanble adekwat.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Men, si nou vire sou tab la ak kont, nou pral wè ke tan an mwayèn demann double pou tab sa a. Chaj la sou processeur a ak kantite liy ki klase nan memwa sote pi wo a 7,5, men li te pi ba. Epi li sote 2 fwa nan ka a nan processeurs, 1,5 fwa nan ka a nan operasyon blòk, sa vle di nou te resevwa yon degradasyon nan pèfòmans sèvè. Ak kòm yon rezilta - degradasyon nan pèfòmans nan aplikasyon nou an. An menm tan an, kantite apèl yo rete apeprè nan menm nivo.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Ak bagay prensipal la isit la se konprann ki jan fè migrasyon sa yo kòrèkteman. Apre sa, yo bezwen fè. Nou fè migrasyon sa yo trè toujou.

  • Gwo migrasyon sa yo pa rive otomatikman. Yo dwe toujou anba kontwòl.
  • Sipèvizyon pa yon moun ki gen konesans obligatwa. Si ou gen yon DBA nan ekip ou a, Lè sa a, kite DBA a fè li. Se travay li. Si ou pa, kite moun ki gen plis eksperyans fè li, ki konnen ki jan yo travay ak baz done.
  • Yon nouvo chema baz done, menm si nou mete ajou yon kolòn, nou toujou prepare an etap, sa vle di davans anvan nouvo vèsyon aplikasyon an te woule:
  • Nouvo jaden yo ajoute nan ki nou pral anrejistre done yo mete ajou.
  • Nou transfere done ki soti nan ansyen jaden an nan nouvo jaden an nan ti pati. Poukisa nap fè sa? Premyèman, nou toujou kontwole pwosesis la nan pwosesis sa a. Nou konnen ke nou te deja transfere anpil lo epi nou gen anpil kite.
  • Ak dezyèm efè pozitif la se ke ant chak pakèt sa yo nou fèmen tranzaksyon an, louvri yon nouvo, e sa pèmèt otovakyòm nan travay dapre plak la, make liy mouri pou reutilize.
  • Pou liy ki pral parèt pandan aplikasyon an ap kouri (nou toujou gen ansyen aplikasyon an ap kouri), nou ajoute yon deklanche ki ekri nouvo valè nan nouvo jaden. Nan ka nou an, sa a se miltiplikasyon pa yon santèn nan ansyen valè a.
  • Si nou konplètman fè tèt di epi nou vle menm jaden an, Lè sa a, apre tout migrasyon yo fini ak anvan woule soti yon nouvo vèsyon aplikasyon an, nou tou senpleman chanje non jaden yo. Yo bay ansyen yo kèk non envante, ak nouvo jaden yo chanje non yo nan ansyen yo.
  • Epi sèlman apre sa nou lanse yon nouvo vèsyon aplikasyon an.

E an menm tan nou p ap jwenn yon gonfleman epi nou p ap soufri an tèm de pèfòmans.

Sa a se kote twazyèm istwa a fini.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

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

Epi, koulye a yon ti kras plis detay sou zouti yo ke mwen mansyone nan istwa a trè premye.

Anvan w chèche gonfleman, ou dwe enstale ekstansyon an pgstattuple.

Pou ou pa bezwen vini ak demann, nou te deja ekri demann sa yo nan travay nou an. Ou ka sèvi ak yo. Gen de demann isit la.

  • Premye a pran yon bon bout tan pou travay, men li pral montre w valè egzak gonfleman ki soti nan tab la.
  • Dezyèm nan travay pi vit epi li trè efikas lè ou bezwen byen vit evalye si gen yon gonfleman oswa ou pa dapre tablo a. Epi ou ta dwe konprann tou ke bloat toujou prezan nan yon tab Postgres. Sa a se yon karakteristik nan modèl MVCC li yo.
  • Ak 20% gonfle se nòmal pou tab nan pifò ka yo. Sa vle di, ou pa ta dwe enkyete ak konprese tab sa a.

Nou kalkile ki jan yo idantifye tab ki anfle ak done initil.

Koulye a, sou ki jan yo ranje gonfleman:

  • Si nou gen yon ti tablèt ak bon disk, se sa ki sou yon tablèt jiska yon gigaocte, li se byen posib yo sèvi ak VACUUM FULL. Li pral pran yon seri eksklizif nan men ou sou tab la pou kèk segonn ak oke, men li pral fè tout bagay byen vit ak sevè. Kisa VACUUM FULL fè? Li pran yon seri eksklizif sou tab la epi li reekri ranje vivan soti nan ansyen tab yo nan nouvo tab la. Epi nan fen li ranplase yo. Li efase ansyen fichye yo epi ranplase ansyen yo ak nouvo. Men, pou dire a nan travay li yo, li pran yon seri eksklizif sou tab la. Sa vle di ke ou pa ka fè anyen ak tablo sa a: ni ekri li, ni li nan li, ni modifye li. Ak VACUUM FULL mande plis espas disk pou ekri done yo.
  • Pwochen zouti pg_repack. Nan prensip li yo, li sanble anpil ak VACUUM FULL, paske li tou reekri done ki soti nan ansyen fichye nan nouvo yo epi ranplase yo nan tablo a. Men, an menm tan an, li pa pran yon seri eksklizif sou tab la nan kòmansman an anpil nan travay li, men li pran li sèlman nan moman sa a lè li deja gen done pare yo nan lòd yo ranplase dosye yo. Kondisyon resous disk li yo sanble ak sa yo ki nan VACUUM FULL. Ou bezwen plis espas disk, epi sa a pafwa kritik si ou gen tab terabyte. Epi li se byen processeur-grangou paske li aktivman travay ak I / O.
  • Twazyèm sèvis piblik la se pgcompacttable. Li fè plis atansyon ak resous yo paske li travay selon prensip yon ti kras diferan. Lide prensipal pgcompacttable se ke li deplase tout ranje vivan nan kòmansman tab la lè l sèvi avèk mizajou nan tablo a. Lè sa a, li kouri yon vakyòm sou tab sa a, paske nou konnen ke nou gen ranje vivan nan kòmansman an ak ranje mouri nan fen. Ak vakyòm nan tèt li koupe ke sa a, sa vle di li pa mande pou anpil espas disk adisyonèl. Ak an menm tan an, li ka toujou prese an tèm de resous.

Tout bagay ak zouti.

Erè tipik nan aplikasyon ki mennen nan gonfleman nan postgresql. Andrey Salnikov

Si ou jwenn sijè a gonfleman enteresan an tèm de fouye pi lwen andedan, isit la se kèk lyen itil:

Mwen te eseye plis montre yon istwa laterè pou devlopè yo, paske yo se kliyan dirèk nou yo nan baz done epi yo dwe konprann ki sa ak ki aksyon mennen nan. Mwen espere ke mwen te reyisi. Mèsi pou atansyon ou!

Kesyon ou yo

Mèsi pou rapò a! Ou te pale sou fason ou ka idantifye pwoblèm. Ki jan yo ka avèti yo? Sa vle di, mwen te gen yon sitiyasyon kote demann pandye pa sèlman paske yo te jwenn aksè nan kèk sèvis ekstèn. Sa yo te jis kèk rantre nan bwa. Te gen kèk ti, demann inofansif ki te pandye alantou pou yon jou, ak Lè sa a, te kòmanse fè kèk istwa san sans. Sa vle di, trè sanble ak sa ou dekri. Ki jan yo swiv sa a? Chita ak toujou ap gade ki demann ki kole? Ki jan yo ka anpeche sa a?

Nan ka sa a, sa a se yon travay pou administratè yo nan konpayi ou, pa nesesèman pou DBA a.

Mwen se yon administratè.

PostgreSQL gen yon vi ki rele pg_stat_activity ki montre demann ki pandye. Epi ou ka wè konbyen tan li pandye la.

Èske mwen oblije antre epi gade chak 5 minit?

Mete kanpe cron epi tcheke. Si ou gen yon demann alontèm, ekri yon lèt epi li se li. Sa vle di, ou pa bezwen gade ak je ou, li ka otomatize. Ou pral resevwa yon lèt, ou reyaji a li. Oswa ou ka tire otomatikman.

Èske gen kèk rezon evidan poukisa sa rive?

Mwen te lis kèk. Lòt egzanp ki pi konplèks. Epi ka gen yon konvèsasyon pou yon tan long.

Mèsi pou rapò a! Mwen te vle klarifye sou sèvis piblik pg_repack la. Si li pa fè yon seri eksklizif, lè sa a...

Li fè yon seri eksklizif.

... Lè sa a, mwen te kapab potansyèlman pèdi done. Èske aplikasyon mwen an pa ta dwe anrejistre anyen pandan tan sa a?

Non, li travay san pwoblèm ak tab la, sa vle di pg_repack premye transfere tout liy yo vivan ki egziste. Natirèlman, kèk kalite antre nan tab la rive la. Li jis voye ponytail sa a deyò.

Sa se, li aktyèlman fè li nan fen a?

Nan fen a, li pran yon seri eksklizif pou chanje dosye sa yo.

Èske li pral pi vit pase VACUUM FULL?

VACUUM FULL, le pli vit ke li te kòmanse, imedyatman te pran yon seri eksklizif. Epi jiskaske li fè tout bagay, li pap kite l ale. Epi pg_repack pran yon seri eksklizif sèlman nan moman ranplasman fichye a. Nan moman sa a ou pa pral ekri la, men done yo pa pral pèdi, tout bagay pral byen.

Bonjou! Ou te pale sou operasyon an nan yon vakyòm machin. Te gen yon graf ak selil anrejistreman wouj, jòn ak vèt. Sa vle di, jòn yo - li te make yo kòm efase. Ak kòm yon rezilta, yon bagay nouvo ka ekri nan yo?

Wi. Postgres pa efase liy yo. Li gen yon spesifik konsa. Si nou mete ajou yon liy, nou make ansyen an kòm efase. Id tranzaksyon an ki chanje liy sa a parèt la, epi nou ekri yon nouvo liy. Epi nou gen sesyon ki kapab potansyèlman li yo. Nan kèk pwen yo vin fin vye granmoun. Ak sans nan ki jan autovacuum travay la se ke li ale nan liy sa yo epi li make yo kòm nesesè. Epi ou ka recouvrir done la.

Mwen konprann. Men, se pa sa kesyon an se sou. Mwen pa t fini. Ann sipoze nou gen yon tab. Li gen jaden nan gwosè varyab. Men, si mwen eseye mete yon bagay nouvo, li ka tou senpleman pa anfòm nan selil la fin vye granmoun.

Non, nan nenpòt ka tout liy lan mete ajou la. Postgres gen de modèl depo done. Li chwazi nan kalite done yo. Gen done ki estoke dirèkteman nan tablo a, epi gen tou done tos. Sa yo se gwo kantite done: tèks, json. Yo estoke nan plak separe. Ak dapre tablèt sa yo, menm istwa a ak gonfleman rive, sa vle di tout bagay se menm bagay la. Yo jis nan lis separeman.

Mèsi pou rapò a! Èske li akseptab pou itilize demann delè deklarasyon pou limite dire?

Trè akseptab. Nou itilize sa a tout kote. Epi depi nou pa gen sèvis pwòp nou yo, nou bay sipò aleka, nou gen yon varyete de kliyan. Ak tout moun konplètman satisfè ak sa a. Sa vle di, nou gen travay cron ki tcheke. Se dire a nan sesyon yo tou senpleman dakò ak kliyan an, anvan sa nou pa dakò. Li ta ka yon minit, li ta ka 10 minit. Sa depann de chaj la sou baz la ak objektif li yo. Men, nou tout itilize pg_stat_activity.

Mèsi pou rapò a! Mwen ap eseye aplike rapò ou a nan aplikasyon mwen yo. Epi li sanble ke nou kòmanse yon tranzaksyon toupatou, epi byen klè ranpli li toupatou. Si gen kèk eksepsyon, Lè sa a, Rollback toujou rive. Apre sa, mwen te kòmanse reflechi. Apre yo tout, tranzaksyon an ka pa kòmanse klèman. Sa a se pwobableman yon allusion pou ti fi a. Si mwen jis mete ajou yon dosye, èske tranzaksyon an kòmanse nan PostgreSQL epi li fini sèlman lè koneksyon an dekonekte?

Si w ap pale kounye a sou nivo aplikasyon an, Lè sa a, li depann de chofè w ap itilize a, sou ORM ke yo te itilize a. Gen anpil paramèt la. Si ou gen oto komèt sou pèmèt, Lè sa a, yon tranzaksyon kòmanse la epi fèmen imedyatman.

Sa vle di, li fèmen imedyatman apre aktyalizasyon a?

Sa depann de paramèt yo. Mwen te nonmen yon sèl anviwònman. Sa a se oto komèt sou. Li se byen komen. Si li pèmèt, Lè sa a, tranzaksyon an te louvri epi fèmen. Sòf si ou te di klèman "kòmanse tranzaksyon" ak "fen tranzaksyon", men tou senpleman te lanse yon demann nan sesyon an.

Bonjou! Mèsi pou rapò a! Ann imajine ke nou gen yon baz done ki anfle ak anfle ak Lè sa a, espas ki la sou sèvè a fini. Èske gen zouti pou rezoud sitiyasyon sa a?

Espas ki sou sèvè a bezwen kontwole byen.

Pou egzanp, DBA a te ale pou te, te nan yon resort, elatriye.

Lè yon sistèm fichye kreye, omwen yon kalite espas backup kreye kote done yo pa ekri.

E si li konplètman anba zewo?

Se la yo rele li espas rezève, sa vle di li ka libere epi depann sou ki jan gwo li te kreye, ou jwenn espas gratis. Pa defo mwen pa konnen konbyen ki genyen. Ak nan yon lòt ka, delivre disk pou ke ou gen plas pou fè yon operasyon rekonstriksyon. Ou ka efase kèk tab ke ou garanti ou pa bezwen.

Èske gen lòt zouti?

Li toujou fè a lamen. Ak lokalman li vin klè sa ki pi bon yo fè la, paske kèk done se kritik ak kèk ki pa kritik. Ak pou chak baz done ak aplikasyon an ki travay ak li, li depann de biznis la. Li toujou deside lokalman.

Mèsi pou rapò a! Mwen gen de kesyon. Premyèman, ou te montre glisad ki te montre ke lè tranzaksyon yo kole, tou de gwosè tablespace la ak gwosè endèks la grandi. Ak pi lwen sou rapò a te gen yon pakèt sèvis piblik ki pake tablèt la. E endèks la?

Yo pake yo tou.

Men, vakyòm lan pa afekte endèks la?

Gen kèk travay ak yon endèks. Pou egzanp, pg_rapack, pgcompacttable. Vakyòm nan rkree endis yo epi afekte yo. Avèk VACUUM FULL lide a se ranplase tout bagay, sa vle di li travay ak tout moun.

E dezyenm kestyon. Mwen pa konprann poukisa rapò sou kopi depann anpil sou replikasyon an li menm. Li te sanble m 'ke rapò yo li, ak replikasyon se ekri.

Ki sa ki lakòz yon konfli replikasyon? Nou gen yon Mèt sou ki pwosesis pran plas. Nou gen yon vakyòm machin k ap pase. Ki sa yon autovacuum aktyèlman fè? Li koupe kèk ansyen liy. Si nan moman sa a nou gen yon demann sou kopi a ki li ansyen liy sa yo, ak sou Mèt la yon sitiyasyon ki te fèt ke autovacuum la make liy sa yo kòm posib pou ranplase, Lè sa a, nou ranplase yo. Epi nou te resevwa yon pake done, lè nou bezwen reekri liy sa yo ke demann lan bezwen sou kopi a, pwosesis replikasyon an ap tann pou delè ou konfigirasyon an. Apre sa, PostgreSQL pral deside sa ki pi enpòtan pou li. Ak replikasyon an pi enpòtan pou li pase demann lan, epi li pral tire demann lan nan lòd yo fè chanjman sa yo sou kopi a.

Andrey, mwen gen yon kesyon. Sa yo bèl graf ou te montre pandan prezantasyon an, èske sa yo se rezilta travay la nan yon kalite sèvis piblik nan ou a? Ki jan yo te fè graf yo?

Sa a se yon sèvis Okmèt.

Èske sa se yon pwodwi komèsyal?

Wi. Sa a se yon pwodwi komèsyal.

Sous: www.habr.com

Add nouvo kòmantè