Yon apwòch endistriyèl pou ajiste PostgreSQL: eksperyans ak baz done." Nikolay Samokhvalov

Mwen sijere ou li transkripsyon rapò Nikolai Samokhvalov "Apwòch endistriyèl pou ajiste PostgreSQL: eksperyans sou baz done"

Shared_buffers = 25% - èske se yon anpil oswa yon ti kras? Oswa jis dwa? Ki jan ou fè konnen si sa a - olye demode - rekòmandasyon apwopriye nan ka patikilye ou a?

Li lè yo apwoche pwoblèm nan nan chwazi paramèt postgresql.conf "tankou yon granmoun." Pa avèk èd avèg "tuners oto" oswa konsèy demode nan atik ak blog, men ki baze sou:

  1. Eksperyans estrikteman verifye sou baz done, te fè otomatikman, nan gwo kantite ak nan kondisyon ki pi pre ke posib nan "konba" yo,
  2. konpreyansyon pwofon sou karakteristik DBMS ak OS.

Sèvi ak Nancy CLI (https://gitlab.com/postgres.ai/nancy), nou pral gade nan yon egzanp espesifik - notwa shared_buffers yo - nan diferan sitiyasyon, nan diferan pwojè epi eseye konnen ki jan yo chwazi anviwònman an pi bon pou enfrastrikti nou an, baz done ak chaj.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nou pral pale sou eksperyans ak baz done. Sa a se yon istwa ki dire yon ti kras plis pase sis mwa.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Yon ti kras sou mwen. Eksperyans ak Postgres pou plis pase 14 ane. Yon kantite konpayi rezo sosyal yo te fonde. Postgres te itilize tout kote.

Epitou gwoup RuPostgres sou Meetup, 2yèm plas nan mond lan. Nou tou dousman ap apwoche 2 moun. RuPostgres.org.

Ak nan PC nan konferans divès kalite, ki gen ladan Highload, mwen responsab pou baz done, an patikilye Postgres depi nan kòmansman an.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak nan kèk ane ki sot pase yo, mwen te rekòmanse pratik konsiltasyon Postgres mwen an 11 zòn tan soti isit la.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Men, lè mwen te fè sa kèk ane de sa, mwen te gen yon ti repo nan travay manyèl aktif ak Postgres, pwobableman depi 2010. Mwen te etone kijan woutin travay yon DBA te chanje, ak konbyen travay manyèl toujou bezwen itilize. Apre sa, mwen imedyatman te panse ke yon bagay te mal isit la, mwen bezwen otomatize plis nan tout bagay.

Epi depi li te tout aleka, pi fò nan kliyan yo te nan nwaj yo. Ak anpil te deja otomatize, evidamman. Plis sou sa pita. Sa vle di, tout bagay sa yo te lakòz lide ke ta dwe gen yon kantite zouti, sa vle di, kèk kalite platfòm ki pral otomatize prèske tout aksyon DBA pou ke yon gwo kantite baz done ka jere.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Rapò sa a p ap gen ladan l:

  • "Bal ajan" ak deklarasyon tankou - mete 8 GB oswa 25% shared_buffers epi w ap anfòm. Pa pral gen anpil bagay sou shared_buffers.
  • Hardcore "innards".

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Kisa ki pral rive?

  • Pral gen prensip optimize ke nou aplike epi devlope. Pral gen tout kalite lide ki parèt sou wout la ak divès zouti ke nou kreye pi fò nan Open Source, sa vle di nou fè baz la nan Open Source. Anplis, nou gen tikè, tout kominikasyon se pratikman Open Source. Ou ka wè sa n ap fè kounye a, sa ki pral nan pwochen lage a, elatriye.
  • Ap gen tou kèk eksperyans nan sèvi ak prensip sa yo, zouti sa yo nan yon kantite konpayi: soti nan ti startups nan gwo konpayi yo.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ki jan tout bagay sa yo ap devlope?

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Premyèman, travay prensipal yon DBA, anplis asire kreyasyon ka, deplwaman sovgad, elatriye, se jwenn bouche ak optimize pèfòmans.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Koulye a, li nan mete kanpe tankou sa a. Nou gade siveyans la, nou wè yon bagay, men nou manke kèk detay. Nou kòmanse fouye plis ak anpil atansyon, anjeneral ak men nou, epi konprann kisa pou fè ak li yon fason oswa yon lòt.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

E gen de apwòch. Pg_stat_statements se solisyon default pou idantifye demann dousman. Ak analiz de mòso bwa Postgres lè l sèvi avèk pgBadger.

Chak apwòch gen dezavantaj grav. Nan premye apwòch la, nou te jete tout paramèt yo. Men, si nou wè gwoup yo SELECT * FROM tab kote kolòn ki egal a "?" oswa "$" depi Postgres 10. Nou pa konnen si sa a se yon eskanè endèks oswa yon eskanè seq. Sa depann anpil de paramèt la. Si ou ranplase yon valè raman rankontre la, li pral yon eskanè endèks. Si ou ranplase yon valè ki okipe 90% nan tab la, sek eskanè a pral evidan, paske Postgres konnen estatistik yo. Epi sa a se yon gwo dezavantaj nan pg_stat_statements, byenke gen kèk travay sou pye.

Pi gwo dezavantaj nan analiz log se ke ou pa kapab peye "log_min_duration_statement = 0" kòm yon règ. Epi nou pral pale sou sa tou. An konsekans, ou pa wè foto an antye. Ak kèk rechèch, ki trè vit, ka konsome yon gwo kantite resous, men ou pa pral wè li paske li se pi ba pase papòt ou a.

Ki jan DBA yo rezoud pwoblèm yo jwenn yo?

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Pou egzanp, nou jwenn kèk pwoblèm. Ki sa ki anjeneral fè? Si ou se yon pwomotè, Lè sa a, ou pral fè yon bagay sou kèk egzanp ki pa menm gwosè a. Si ou se yon DBA, Lè sa a, ou gen sèn. Epi gen sèlman youn. Apre sa, li te sis mwa dèyè. Epi ou panse ke ou pral ale nan pwodiksyon an. E menm DBA ki gen eksperyans Lè sa a, tcheke nan pwodiksyon, sou yon kopi. Epi li rive ke yo kreye yon endèks tanporè, asire w ke li ede, lage li epi bay devlopè yo pou yo ka mete li nan dosye migrasyon yo. Sa a se kalite istwa san sans sa a k ap pase kounye a. Epi sa a se yon pwoblèm.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

  • Tune konfigirasyon.
  • Optimize seri endèks yo.
  • Chanje rechèch SQL nan tèt li (sa a se metòd ki pi difisil).
  • Ajoute kapasite (fason ki pi fasil nan pifò ka yo).

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Gen anpil bagay k ap pase ak bagay sa yo. Gen anpil manch nan Postgres. Gen anpil bagay pou konnen. Gen anpil endis nan Postgres, gras ak òganizatè konferans sa a tou. Ak tout bagay sa yo dwe konnen, e se sa ki fè moun ki pa DBA yo santi tankou DBA yo ap pratike maji nwa. Sa vle di, ou bezwen etidye pou 10 ane yo kòmanse konprann tout bagay sa yo nòmalman.

Apre sa, mwen se yon konbatan kont maji nwa sa a. Mwen vle fè tout bagay pou ke gen teknoloji, epi pa gen okenn entwisyon nan tout bagay sa yo.

Egzanp lavi reyèl

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Mwen te obsève sa a nan omwen de pwojè, ki gen ladan pwòp mwen an. Yon lòt pòs blog di nou ke yon valè de 1 pou default_statistict_target bon. Oke, ann eseye li nan pwodiksyon an.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak isit la nou yo, lè l sèvi avèk zouti nou an de ane pita, avèk èd nan eksperyans sou baz done yo ke nou ap pale de jodi a, nou ka konpare sa ki te ak sa ki te vin.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Epi pou sa nou bezwen kreye yon eksperyans. Li konsiste de kat pati.

  • Premye a se anviwònman an. Nou bezwen yon pyès ki nan konpitè. Apre sa, lè mwen vin nan kèk konpayi epi siyen yon kontra, mwen di yo ban mwen pyès ki nan konpitè menm jan ak nan pwodiksyon an. Pou chak Masters ou yo, mwen bezwen omwen yon pyès ki nan konpitè tankou sa a. Swa sa a se yon egzanp machin vityèl nan Amazon oswa Google, oswa mwen bezwen egzakteman menm moso pyès ki nan konpitè. Sa vle di, mwen vle rkree anviwònman an. Ak nan konsèp nan anviwònman nou enkli vèsyon an pi gwo nan Postgres.
  • Dezyèm pati a se objè rechèch nou an. Sa a se yon baz done. Li ka kreye nan plizyè fason. Mwen pral montre w kouman.
  • Twazyèm pati a se chaj la. Sa a se moman ki pi difisil.
  • Ak katriyèm pati a se sa nou tcheke, sa vle di ki sa nou pral konpare ak ki sa. Ann di nou ka chanje youn oswa plis paramèt nan konfigirasyon an, oswa nou ka kreye yon endèks, elatriye.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nou ap lanse yon eksperyans. Men pg_stat_statements. Sou bò gòch la se sa ki te pase. Sou bò dwat la - sa ki te pase.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Sou bò gòch default_statistics_target = 100, sou bò dwat = 1 000. Nou wè ke sa te ede nou. An jeneral, tout bagay te vin pi bon pa 8%.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Men, si nou desann, pral gen gwoup demann soti nan pgBadger oswa nan pg_stat_statements. Gen de opsyon. Nou pral wè ke kèk demann te tonbe nan 88%. Ak isit la vini apwòch la jeni. Nou ka fouye pi lwen anndan paske nou mande poukisa li te plonje. Ou bezwen konprann sa ki te pase ak estatistik yo. Poukisa plis bokit nan estatistik mennen nan pi mal rezilta.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Oswa nou pa ka fouye, men fè "ALTER TABLE ... ALTER COLUMN" epi retounen 100 bokit tounen nan estatistik kolòn sa a. Lè sa a, ak yon lòt eksperyans nou ka asire w ke patch sa a te ede. Tout. Sa a se yon apwòch jeni ki ede nou wè gwo foto a ak pran desizyon ki baze sou done olye ke sou entwisyon.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Yon koup nan egzanp ki soti nan lòt zòn. Gen tès CI nan tès pou plizyè ane. E pa gen okenn pwojè nan bon lide li ta viv san tès otomatik yo.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nan lòt endistri yo: nan avyasyon, nan endistri otomobil, lè nou teste aerodinamik, nou gen tou opòtinite pou fè eksperyans. Nou pa pral lanse yon bagay ki soti nan yon desen dirèkteman nan espas, oswa nou pa pral imedyatman pran kèk machin sou track la. Pou egzanp, gen yon tinèl van.

Nou ka tire konklizyon nan obsèvasyon lòt endistri yo.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Premyèman, nou gen yon anviwònman espesyal. Li se tou pre pwodiksyon, men se pa fèmen. Karakteristik prensipal li se ke li ta dwe bon mache, repete ak otomatize ke posib. Epi tou dwe gen zouti espesyal pou fè analiz detaye.

Gen plis chans, lè nou lanse yon avyon epi vole, nou gen mwens opòtinite pou etidye chak milimèt sifas zèl la pase nou genyen nan yon tinèl van. Nou gen plis zouti dyagnostik. Nou kapab gen mwayen pou pote plis bagay lou ke nou pa gen mwayen pou mete nan yon avyon nan lè a. Menm jan ak Postgres. Nou ka, nan kèk ka, pèmèt enregistrement plen rechèch pandan eksperyans yo. Epi nou pa vle fè sa nan pwodiksyon an. Nou ka menm planifye pou pèmèt sa a lè l sèvi avèk auto_explain.

Ak jan mwen te di, yon wo nivo de automatisation vle di nou peze bouton an epi repete. Sa a se ki jan li ta dwe, se konsa ke gen yon anpil nan eksperimantasyon, se konsa ke li se sou kouran.

Nancy CLI - fondasyon "laboratwa baz done"

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Se konsa nou te fè bagay sa a. Sa vle di, mwen te pale sou lide sa yo nan mwa jen, prèske yon ane de sa. Epi nou deja genyen sa yo rele Nancy CLI nan Open Source. Sa a se fondasyon an pou bati yon laboratwa baz done.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nancy — Li nan Open Source, sou Gitlab. Ou ka di li, ou ka eseye li. Mwen bay yon lyen nan glisad yo. Ou ka klike sou li epi li pral la ede nan tout respè.

Natirèlman, gen yon anpil toujou sou devlopman. Gen anpil lide la. Men, sa a se yon bagay nou itilize prèske chak jou. Men, lè nou gen yon lide - poukisa se li ke lè nou efase 40 liy, li tout vini desann nan IO, Lè sa a, nou ka fè yon eksperyans epi gade nan plis detay yo konprann sa k ap pase ak Lè sa a, eseye ranje li sou ale la. Sa vle di, nou ap fè yon eksperyans. Pou egzanp, nou ajiste yon bagay epi wè sa k ap pase nan fen an. Epi nou pa fè sa nan pwodiksyon an. Sa a se sans nan lide a.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ki kote sa a ka travay? Sa a ka travay lokalman, sa vle di ou ka fè li nenpòt kote, ou ka menm kouri li sou yon MacBook. Nou bezwen yon docker, ann ale. Se tout. Ou ka kouri li nan kèk egzanp sou yon pyès ki nan konpitè, oswa nan yon machin vityèl, nenpòt kote.

Epi gen tou opòtinite pou kouri adistans nan Amazon nan Enstans EC2, nan tach. Epi sa a se yon opòtinite trè fre. Pa egzanp, yè nou te fè plis pase 500 eksperyans sou egzanp i3, kòmanse ak pi piti a epi fini ak i3-16-xlarge. Ak 500 eksperyans koute nou $64. Chak te dire 15 minit. Sa vle di, akòz lefèt ke tach yo itilize la, li trè bon mache - yon rabè 70%, bòdwo Amazon pou chak segonn. Ou ka fè anpil. Ou ka fè rechèch reyèl.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak twa gwo vèsyon Postgres yo sipòte. Li pa tèlman difisil pou fini kèk ansyen yo ak nouvo vèsyon an 12yèm tou.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nou ka defini yon objè nan twa fason. Sa a:

  • Fichye pil fatra/sql.
  • Fason prensipal la se klonaj anyè PGDATA a. Kòm yon règ, li se pran nan sèvè a backup. Si ou gen sovgad nòmal binè, ou ka fè klon soti nan la. Si ou gen nwaj, Lè sa a, yon biwo nwaj tankou Amazon ak Google pral fè sa pou ou. Sa a se fason ki pi enpòtan yo klonaj pwodiksyon reyèl. Men ki jan nou devlope.
  • Ak dènye metòd la apwopriye pou rechèch lè ou vle konprann ki jan yon bagay ap travay nan Postgres. Sa a se pgbench. Ou ka jenere lè l sèvi avèk pgbench. Se jis yon opsyon "db-pgbench". Ou di l ki echèl. Ak tout bagay pral pwodwi nan nwaj la, jan sa di.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak chaj:

  • Nou ka egzekite chaj la nan yon sèl fil SQL. Sa a se fason ki pi primitif.
  • Epi nou ka imite chaj la. Epi nou ka imite li premye nan tout fason sa a. Nou bezwen kolekte tout mòso bwa yo. Epi li fè mal. Mwen pral montre w poukisa. Ak lè l sèvi avèk pgreplay nou jwe, ki se bati nan Nancy.
  • Oswa yon lòt opsyon. Sa yo rele chay navèt la, ki nou fè ak yon sèten kantite efò. Analize chaj aktyèl nou an sou sistèm konba a, nou retire gwoup yo pi wo nan demann. Ak lè l sèvi avèk pgbench nou ka imite chaj sa a nan laboratwa a.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

  • Swa nou dwe fè kèk kalite SQL, sa vle di nou tcheke kèk kalite migrasyon, kreye yon endèks la, egzekite ANALAZE la. Epi nou gade sa ki te pase anvan vakyòm lan ak apre vakyòm lan. An jeneral, nenpòt SQL.
  • Swa nou chanje youn oswa plis paramèt nan konfigirasyon an. Nou ka di nou tcheke, pou egzanp, 100 valè nan Amazon pou baz done teraocte nou an. Epi nan kèk èdtan ou pral gen rezilta a. Kòm yon règ, li pral pran ou plizyè èdtan deplwaye yon baz done terabyte. Men, gen yon patch nan devlopman, nou gen yon seri posib, sa vle di ou ka toujou itilize menm pgdata sou menm sèvè a epi tcheke. Postgres pral rekòmanse epi kachèt yo pral reset. Epi ou ka kondwi chay la.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

  • Yon anyè rive ak yon pakèt fichye diferan, kòmanse nan snapshots pgeta***. Ak bagay ki pi enteresan an se pg_stat_statements, pg_stat_kcacke. Sa yo se de ekstansyon ki analize demann. Ak pg_stat_bgwriter gen non sèlman estatistik pgwriter, men tou sou pòs ak fason backend yo tèt yo deplase tanpon sal. Epi li se tout enteresan yo wè. Pa egzanp, lè nou mete sou pye shared_buffers, li trè enteresan pou wè konbyen tout moun ranplase.
  • Jounal Postgres yo ap rive tou. De mòso bwa - yon boutèy demi lit preparasyon ak yon boutèy demi lit lèktur chaj.
  • Yon karakteristik relativman nouvo se FlameGraphs.
  • Epitou, si ou te itilize opsyon pgreplay oswa pgbench pou jwe chaj la, Lè sa a, pwodiksyon yo pral natif natal. Epi ou pral wè latansi ak TPS. Li pral posib yo konprann ki jan yo te wè li.
  • Enfòmasyon sistèm.
  • CPU debaz ak chèk IO. Sa a se plis pou egzanp EC2 nan Amazon, lè ou vle lanse 100 sikonstans ki idantik nan yon fil epi kouri 100 diferan kouri la, Lè sa a, ou pral gen 10 eksperyans. Epi ou bezwen asire w ke ou pa rankontre yon egzanp defo ki deja ap oprime pa yon moun. Gen lòt ki aktif sou pyès ki nan konpitè sa a epi ou gen ti resous ki rete. Li pi bon pou jete rezilta sa yo. Ak èd sysbench soti nan Alexey Kopytov, nou fè plizyè chèk kout ki pral vini epi yo ka konpare ak lòt moun, sa vle di ou pral konprann ki jan CPU a konpòte yo ak ki jan IO la konpòte.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ki difikilte teknik yo baze sou egzanp diferan konpayi yo?

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ann di nou vle repete chaj reyèl la lè l sèvi avèk mòso bwa. Li se yon bon lide si li ekri sou Open Source pgreplay. Nou itilize li. Men, pou li travay byen, ou dwe pèmèt anrejistreman plen rechèch ak paramèt ak distribisyon.

Gen kèk konplikasyon ak dire ak timestamp. Nou pral vide tout kwizin sa a. Kesyon prensipal la se si ou kapab peye li oswa ou pa?

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

https://gist.github.com/NikolayS/08d9b7b4845371d03e195a8d8df43408

Pwoblèm lan se ke li ka pa disponib. Premye a tout, ou dwe konprann ki kouran yo pral ekri nan boutèy la. Si w gen pg_stat_statements, ou ka itilize rechèch sa a (lyen an ap disponib nan glisad yo) pou w konprann apeprè konbyen byte yo pral ekri pa segonn.

Nou gade longè demann lan. Nou ap neglije lefèt ke pa gen okenn paramèt, men nou konnen longè demann lan epi nou konnen konbyen fwa pa segonn li te egzekite. Nan fason sa a nou ka estime apeprè konbyen bytes pou chak segonn. Nou ka fè yon erè de fwa plis, men nou pral definitivman konprann lòd la nan fason sa a.

Nou ka wè ke 802 fwa pa segonn demann sa a egzekite. Epi nou wè ke bytes_pa sec - 300 kB / s yo pral ekri plis oswa mwens. Epi, kòm yon règ, nou ka peye tankou yon koule.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Men! Reyalite a se ke gen diferan sistèm antre. Ak default moun se anjeneral "syslog".

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Men, si ou gen syslog, Lè sa a, ou ka gen yon foto tankou sa a. Nou pral pran pgbench, pèmèt anrejistreman rechèch epi wè sa k ap pase.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

San yo pa antre - sa a se kolòn sou bò gòch la. Nou te resevwa 161 TPS. Avèk syslog - sa a se nan Ubuntu 000 sou Amazon, nou jwenn 16.04 TPS. Men, si nou chanje nan de lòt metòd antre, Lè sa a, sitiyasyon an se pi bon. Sa vle di, nou te espere li tonbe, men se pa nan menm limit la.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak sou CentOS 7, nan ki journald patisipe tou, vire mòso bwa nan yon fòma binè pou rechèch fasil, elatriye, Lè sa a, se yon kochma la, nou lage 44 fwa nan TPS.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak sa a se sa moun ap viv ak. Epi souvan nan konpayi yo, espesyalman gwo, sa a se trè difisil chanje. Si ou ka jwenn lwen syslog, tanpri ale lwen li.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

  • Evalye IOPS ak ekri koule.
  • Tcheke sistèm anrejistreman ou a.
  • Si chay projetée a twò gwo, konsidere pran echantiyon.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nou gen pg_stat_statements. Kòm mwen te di, li dwe la. Epi nou ka pran epi dekri chak gwoup demann nan yon fason espesyal nan yon dosye. Lè sa a, nou ka itilize yon karakteristik trè pratik nan pgbench - sa a se kapasite nan insert plizyè dosye lè l sèvi avèk opsyon "-f".

Li konprann anpil nan "-f". Epi ou ka di ak èd nan "@" nan fen a ki pataje chak dosye ta dwe genyen. Sa vle di, nou ka di fè sa nan 10% nan ka yo, ak sa a nan 20%. Apre sa, sa ap mennen nou pi pre sa nou wè nan pwodiksyon an.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ki jan nou pral konprann sa nou genyen nan pwodiksyon an? Ki pataje ak ki jan? Sa a se yon ti jan sou kote. Nou gen yon lòt pwodwi postgres-checkup. Epitou yon baz nan Open Source. Apre sa, nou ap aktivman devlope li.

Li te fèt pou rezon yon ti kras diferan. Pou rezon ke siveyans pa ase. Sa vle di, ou vini, gade nan baz la, gade nan pwoblèm ki egziste. Epi, kòm yon règ, ou fè yon health_check. Si ou se yon DBA ki gen eksperyans, lè sa a ou fè health_check. Nou gade nan itilizasyon endèks, elatriye. Si ou gen OKmeter, Lè sa a, gwo. Sa a se siveyans fre pou Postgres. OKmeter.io - tanpri enstale li, tout bagay fèt trè byen la. Li peye.

Si ou pa gen youn, Lè sa a, anjeneral ou pa gen anpil. Nan siveyans, anjeneral gen CPU, IO, ak Lè sa a, ak rezèvasyon, ak sa a tout. E nou bezwen plis. Nou bezwen wè ki jan autovacuum a travay, ki jan pòs la ap travay, nan io nou bezwen separe pòs la soti nan bgwriter la ak nan backends yo, elatriye.

Pwoblèm lan se ke lè ou ede yon gwo konpayi, yo pa ka aplike yon bagay byen vit. Yo pa ka achte byen vit OKmeter. Petèt yo pral achte li nan sis mwa. Yo pa ka byen vit delivre kèk pakè.

Epi nou te vini ak lide ke nou bezwen yon zouti espesyal ki pa mande pou yo enstale anyen, sa vle di ou pa bezwen enstale anyen nan pwodiksyon an. Enstale li sou laptop ou, oswa sou yon sèvè obsèvasyon kote ou pral kouri li. Apre sa, li pral analize yon anpil nan bagay sa yo: sistèm nan fonksyone, sistèm nan dosye, ak Postgres tèt li, fè kèk demann limyè ki ka kouri dirèkteman nan pwodiksyon epi pa gen anyen pral echwe.

Nou rele li Postgres-checkup. An tèm medikal, sa a se yon chèk sante regilye. Si se tematik otomobil, se tankou antretyen. Ou fè antretyen sou machin ou chak sis mwa oswa yon ane, tou depann de mak la. Ou fè antretyen pou baz ou a? Sa vle di, èske ou fè rechèch pwofon regilyèman? Li dwe fèt. Si ou fè sovgad, Lè sa a, fè yon tchèkòp, sa a pa mwens enpòtan.

Epi nou gen yon zouti konsa. Li te kòmanse aktivman parèt sèlman apeprè twa mwa de sa. Li toujou jèn, men gen anpil la.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Kolekte gwoup demann ki pi "enfliyan" yo - rapò K003 nan Postgres-checkup

Epi gen yon gwoup rapò K. Twa rapò jiskaprezan. Epi gen tankou yon rapò K003. Gen tèt la soti nan pg_stat_statements, klase pa total_time.

Lè nou klase gwoup demann pa total_time, nan tèt la nou wè gwoup ki chaje sistèm nou an plis, sa vle di konsome plis resous. Poukisa mwen bay non gwoup demann yo? Paske nou jete paramèt yo. Sa yo pa demann ankò, men gwoup demann, sa vle di yo abstrè.

Men, si nou optimize soti anwo jouk anba, nou pral aleje resous nou yo ak retade moman sa a lè nou bezwen ajou. Sa a se yon trè bon fason pou ekonomize lajan.

Petèt sa a se pa yon fason trè bon pran swen itilizatè yo, paske nou ka pa wè ka ki ra, men trè anmèdan kote yon moun tann 15 segonn. An total, yo tèlman ra ke nou pa wè yo, men nou ap fè fas ak resous yo.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Kisa ki te pase nan tablo sa a? Nou pran de snapshots. Postgres_checkup ap ba ou yon delta pou chak metrik: total-time, apèl, ranje, shared_blks_read, elatriye. Se li, delta a te kalkile. Gwo pwoblèm ak pg_stat_statements se ke li pa sonje lè li te reset. Si pg_stat_database sonje, lè sa a pg_stat_statements pa sonje. Ou wè gen yon kantite 1, men nou pa konnen ki kote nou konte.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Ak isit la nou konnen, isit la nou gen de snapshots. Nou konnen delta a nan ka sa a te 56 segonn. Yon espas trè kout. Ranje pa total_time. Lè sa a, nou ka diferansye, sa vle di nou divize tout mezi pa dire. Si nou divize chak metrik pa dire, n ap gen kantite apèl pou chak segonn.

Apre sa, total_time pa segonn se metrik pi renmen mwen an. Li mezire an segonn, pa segonn, sa vle di konbyen segonn li te pran sistèm nou an pou egzekite gwoup demann sa a pou chak segonn. Si ou wè plis pase yon segonn pa segonn la, sa vle di ou te oblije bay plis pase yon nwayo. Sa a se yon metrik trè bon. Ou ka konprann ke zanmi sa a, pou egzanp, bezwen omwen twa nwayo.

Sa a se konesans nou an, mwen pa janm wè anyen tankou li nenpòt kote. Tanpri sonje - sa a se yon bagay trè senp - dezyèm pou chak segonn. Pafwa, lè CPU ou a 100%, Lè sa a, yon demi èdtan pou chak segonn, se sa ki, ou te pase yon demi èdtan fè jis demann sa a.

Apre sa, nou wè ranje pou chak segonn. Nou konnen konbyen ranje pa segonn li te retounen.

Apre sa, gen tou yon bagay enteresan. Konbyen shared_buffers nou li pa segonn nan shared_buffers li menm. Frape yo te deja la, epi nou te pran ranje yo nan kachèt sistèm operasyon an oswa nan disk la. Premye opsyon a se vit, ak dezyèm lan ka oswa pa ka rapid, tou depann de sitiyasyon an.

E dezyenm fason diferansyer se divize kantite demann dan sa group. Nan dezyèm kolòn nan w ap toujou gen yon sèl requête divize pa requête. Apre sa, li enteresan - konbyen milisgond nan demann sa a. Nou konnen ki jan rechèch sa a konpòte an mwayèn. Yo te mande 101 milisgond pou chak demann. Sa a se metrik tradisyonèl nou bezwen konprann.

Konbyen ranje chak demann te retounen an mwayèn? Nou wè 8 gwoup sa a retounen. An mwayèn, konbyen yo te pran nan kachèt la ak li. Nou wè ke tout bagay se kachèt joliman. Frape solid pou premye gwoup la.

Ak katriyèm substring nan chak liy se ki pousantaj nan total la. Nou gen apèl. Ann di 1 000 000. E nou ka konprann ki kontribisyon gwoup sa a fè. Nou wè ke nan ka sa a premye gwoup la kontribye mwens pase 0,01%. Sa vle di, li tèlman dousman ke nou pa wè li nan foto an jeneral. Ak dezyèm gwoup la se 5% sou apèl yo. Sa vle di, 5% nan tout apèl yo se dezyèm gwoup la.

Total_time tou enteresan. Nou te pase 14% nan tan total travay nou sou premye gwoup demann yo. Ak pou dezyèm lan - 11%, elatriye.

Mwen pa pral antre nan detay, men gen sibtilite la. Nou montre yon erè nan tèt la, paske lè nou konpare, snapshots ka flote, se sa ki, kèk demann ka tonbe epi yo pa ka prezan nan dezyèm youn nan, pandan ke kèk nouvo ka parèt. Epi la nou kalkile erè a. Si ou wè 0, Lè sa a, sa a bon. Pa gen okenn erè. Si to erè a se jiska 20%, li nan OK.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Lè sa a, nou retounen nan sijè nou an. Nou bezwen fabrike kantite travay la. Nou pran li depi anwo jouk anba epi ale jiskaske nou rive nan 80% oswa 90%. Anjeneral sa a se 10-20 gwoup. Epi nou fè dosye pou pgbench. Nou itilize o aza la. Pafwa sa a, malerezman, pa travay deyò. Ak nan Postgres 12 pral gen plis opòtinite pou itilize apwòch sa a.

Lè sa a, nou jwenn 80-90% nan total_time nan fason sa a. Kisa mwen ta dwe mete apre "@"? Nou gade nan apèl yo, gade nan ki kantite enterè gen ak konprann ke nou dwe anpil enterè isit la. Soti nan pousantaj sa yo nou ka konprann ki jan yo balanse chak nan dosye yo. Apre sa, nou itilize pgbench epi ale nan travay.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Nou gen tou K001 ak K002.

K001 se yon gwo fisèl ak kat substrings. Sa a se yon karakteristik tout chaj nou an. Gade dezyèm kolòn ak dezyèm subrow. Nou wè ke apeprè yon segonn ak yon mwatye pou chak segonn, sa vle di si gen de nwayo, Lè sa a, li pral bon. Pral gen apeprè 75% kapasite. Epi li pral travay tankou sa a. Si nou gen 10 nwayo, Lè sa a, nou pral jeneralman kalm. Nan fason sa a nou ka evalye resous yo.

K002 se sa mwen rele klas rechèch, sa vle di SELECT, INSERT, UPDATE, DELETE. Epi separeman SELECT POU MIZAJOU, paske li se yon seri.

Ak isit la nou ka konkli ke SELECT se lektè òdinè - 82% nan tout apèl, men an menm tan an - 74% nan total_time. Sa vle di, yo rele yo anpil, men konsome mwens resous.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Epi nou retounen nan kesyon an: "Ki jan nou ka chwazi bon shared_buffers yo?" Mwen obsève ke pifò referans yo baze sou lide a - ann wè ki sa debi a pral, sa vle di ki sa debi a pral ye. Li anjeneral mezire nan TPS oswa QPS.

Epi nou eseye peze soti kòm anpil tranzaksyon pou chak segonn ke posib nan machin nan lè l sèvi avèk paramèt akor. Isit la se egzakteman 311 pou chak segonn pou chwazi.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Men, pèsonn pa kondwi nan travay epi tounen lakay ou a tout vitès. Sa a se komik. Menm jan ak baz done. Nou pa oblije kondwi a tout vitès, e pèsonn pa fè sa. Pèsonn pa viv nan pwodiksyon, ki gen 100% CPU. Malgre ke, petèt yon moun ap viv, men sa a pa bon.

Lide a se ke nou anjeneral kondwi nan 20 pousan nan kapasite, de preferans pa plis pase 50%. Epi nou eseye optimize tan repons pou itilizatè nou yo pi wo a tout. Sa vle di, nou dwe vire bouton nou yo pou ke gen yon latansi minimòm nan vitès 20%, kondisyonèl. Sa a se yon lide ke nou menm tou nou eseye itilize nan eksperyans nou yo.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Epi finalman, rekòmandasyon:

  • Asire w ou fè laboratwa baz done.
  • Si sa posib, fè li sou demann pou li dewoulman pou yon ti tan - jwe epi jete li. Si ou gen nyaj, Lè sa a, sa a ale san yo pa di, sa vle di gen anpil kanpe.
  • Fè kirye. Men, si yon bagay ki mal, Lè sa a, tcheke ak eksperyans ki jan li konpòte li. Nancy ka itilize pou fòme tèt ou pou tcheke ki jan baz la fonksyone.
  • Ak vize pou tan an repons minimòm.
  • Epi ou pa bezwen pè sous Postgres. Lè w ap travay ak sous, ou dwe konnen angle. Gen anpil kòmantè la, tout bagay yo eksplike.
  • Epi tcheke sante baz done a regilyèman, omwen yon fwa chak twa mwa, manyèlman, oswa Postgres-checkup.

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Kesyon ou yo

Mèsi anpil! Yon bagay trè enteresan.

De moso.

Wi, de moso. Sèlman mwen pa t byen konprann. Lè Nancy ak mwen travay, èske nou ka ajiste sèlman yon paramèt oswa yon gwoup antye?

Nou gen yon paramèt delta konfigirasyon. Ou ka vire la otan ke ou vle nan yon fwa. Men, ou bezwen konprann ke lè ou chanje anpil bagay, ou ka tire konklizyon yo mal.

Wi. Poukisa mwen te mande? Paske li difisil pou fè eksperyans lè ou gen yon sèl paramèt. Ou sere boulon li, wè ki jan li fonksyone. Mwen mete l deyò. Lè sa a, ou kòmanse pwochen an.

Ou ka sere boulon li an menm tan an, men li depann de sitiyasyon an, nan kou. Men, li pi bon pou teste yon sèl lide. Nou te gen yon lide yè. Nou te gen yon sitiyasyon trè pre. Te gen de konfigirasyon. Epi nou pa t ka konprann poukisa te gen yon gwo diferans. Ak lide a leve ke ou bezwen sèvi ak dikotomi yo nan lòd yo toujou konprann epi jwenn ki diferans ki genyen. Ou ka imedyatman fè mwatye nan paramèt yo menm, Lè sa a, yon ka, elatriye Tout bagay fleksib.

E gen yon lòt kesyon. Pwojè a se jèn epi devlope. Dokiman an deja pare, èske gen yon deskripsyon detaye?

Mwen espesyalman te fè yon lyen la a deskripsyon paramèt yo. Li la. Men, anpil bagay poko la. M ap chèche moun ki gen menm lide. Apre sa, mwen jwenn yo lè mwen fè. Sa a se trè fre. Yon moun deja ap travay avè m ', yon moun te ede ak fè yon bagay la. Men, si w enterese nan sijè sa a, bay fidbak sou sa ki manke.

Yon fwa nou bati laboratwa a, petèt pral gen fidbak. Ann wè. Mèsi!

Bonjou! Mèsi pou rapò a! Mwen te wè ke gen Amazon sipò. Èske gen nenpòt plan pou sipòte GSP?

Bon kesyon. Nou te kòmanse fè li. Epi nou te jele li pou kounye a paske nou vle ekonomize lajan. Sa vle di, gen sipò lè l sèvi avèk kouri sou localhost. Ou ka kreye yon egzanp tèt ou epi travay lokalman. An pasan, se sa nou fè. Mwen fè sa nan Getlab, la nan GSP. Men, nou pa wè pwen nan fè jis òkestrasyon sa yo ankò, paske Google pa gen tach bon mache. Genyen ??? ka, men yo gen limit. Premyèman, yo toujou gen sèlman yon rabè 70% epi ou pa ka jwe ak pri a la. Sou tach yo, nou ogmante pri a pa 5-10% pou diminye chans pou yo choute ou. Sa vle di, ou sove tach, men yo ka pran lwen ou nenpòt ki lè. Si ou òf yon ti kras pi wo pase lòt moun fè, ou pral touye pita. Google gen espesifikasyon konplètman diferan. Epi gen yon lòt limit trè move - yo sèlman ap viv pou 24 èdtan. E pafwa nou vle fè yon eksperyans pou 5 jou. Men, ou ka fè sa nan tach; tach pafwa dire pou mwa.

Bonjou! Mèsi pou rapò a! Ou mansyone checkup. Ki jan ou kalkile erè stat_statements?

Trè bon kesyon. Mwen ka montre w ak di w an detay. Nan ti bout tan, nou gade ki jan seri gwoup demann lan te flote: konbyen yo te tonbe ak konbyen nouvo yo te parèt. Lè sa a, nou gade nan de metrik: total_time ak apèl, kidonk gen de erè. Epi nou gade kontribisyon gwoup k ap flote yo. Gen de sougwoup: moun ki te ale ak moun ki te rive. Ann wè ki kontribisyon yo genyen nan foto an jeneral.

Èske ou pa pè ke li pral vire la de oswa twa fwa pandan tan ki genyen ant snapshots?

Sa vle di, èske yo te anrejistre ankò oswa kisa?

Pou egzanp, demann sa a te deja preempted yon fwa, Lè sa a, li te vini epi li te preempted ankò, Lè sa a, li te vini ankò epi li te preempted ankò. Epi ou kalkile yon bagay isit la, epi ki kote li tout?

Bon kesyon, nou pral oblije gade.

Mwen te fè yon bagay ki sanble. Li te pi senp, nan kou, mwen te fè li pou kont li. Men, mwen te oblije reset, reset stat_statements ak konnen nan moman an nan snapshot la ke te gen mwens pase yon sèten fraksyon, ki toujou pa t 'rive nan plafon an nan konbyen stat_statements te kapab akimile la. Ak konpreyansyon mwen an se ke, gen plis chans, pa gen anyen ki te deplase.

Wi Wi.

Men, mwen pa konprann ki jan lòt bagay fè li fiable.

Malerezman, mwen pa sonje egzakteman si nou itilize tèks la rechèch la oswa queryid ak pg_stat_statements epi konsantre sou li. Si nou konsantre sou queryid, Lè sa a, nan teyori nou ap konpare bagay ki konparab.

Non, li ka fòse soti plizyè fwa ant snapshots epi vini ankò.

Ak menm id la?

Wi.

Nou pral etidye sa. Bon kesyon. Nou bezwen etidye li. Men, pou kounye a, sa nou wè se swa ekri 0...

Sa a se, nan kou, yon ka ki ra, men mwen te choke lè mwen te jwenn ke stat_statemetns ka deplase la.

Kapab genyen anpil bagay nan Pg_stat_statements. Nou te rankontre lefèt ke si ou gen track_utility = on, Lè sa a, ansanm ou yo ap swiv tou.

Wi nan kou.

Men, si ou gen java ibènasyon, ki se o aza, Lè sa a, tab la hash kòmanse yo sitiye la. Epi le pli vit ke ou fèmen yon aplikasyon trè chaje, ou fini ak 50-100 gwoup. Ak tout bagay se plis oswa mwens ki estab la. Youn nan fason pou konbat sa a se ogmante pg_stat_statements.max.

Wi, men ou bezwen konnen konbyen. Ak yon jan kanmenm nou bezwen kenbe yon je sou li. Se sa mwen fè. Sa vle di, mwen gen pg_stat_statements.max. Apre sa, mwen wè ke nan moman an nan snapshot la mwen pa t 'rive nan 70%. Oke, donk nou pa pèdi anyen. Ann reset. Epi nou sove ankò. Si pwochen snapshot la mwens pase 70, lè sa a gen plis chans ou pa pèdi anyen ankò.

Wi. Defo a se kounye a 5, 000. Ak sa a se ase pou anpil moun.

Anjeneral wi.

Videyo:

PS Nan pwòp non mwen, mwen pral ajoute ke si Postgres gen done konfidansyèl epi li pa ka enkli nan anviwònman tès la, Lè sa a, ou ka itilize PostgreSQL Anonymizer. Konplo a se apeprè jan sa a:

Apwòch endistriyèl nan akor PostgreSQL: eksperyans sou baz done." Nikolay Samokhvalov

Sous: www.habr.com

Add nouvo kòmantè