Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Ir-rapport jippreżenta xi approċċi li jippermettu jimmonitorja l-prestazzjoni tal-mistoqsijiet SQL meta jkun hemm miljuni minnhom kuljum, u hemm mijiet ta 'servers PostgreSQL sorveljati.

Liema soluzzjonijiet tekniċi jippermettulna nipproċessaw b'mod effiċjenti tali volum ta 'informazzjoni, u dan kif jagħmel il-ħajja ta' żviluppatur ordinarju aktar faċli?


Min hu interessat? analiżi ta 'problemi speċifiċi u tekniki varji ta' ottimizzazzjoni Mistoqsijiet SQL u soluzzjoni ta 'problemi DBA tipiċi f'PostgreSQL - tista' wkoll aqra sensiela ta’ artikli fuq dan is-suġġett.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)
Jisimni Kirill Borovikov, nirrappreżenta Kumpanija Tensor. Speċifikament, nispeċjalizza fil-ħidma ma 'databases fil-kumpanija tagħna.

Illum ser ngħidlek kif ottimizzaw il-mistoqsijiet, meta ma jkollokx bżonn li "tagħżel" il-prestazzjoni ta 'mistoqsija waħda, iżda ssolvi l-problema b'mod massiv. Meta jkun hemm miljuni ta 'talbiet, u għandek bżonn issib xi wħud approċċi għas-soluzzjoni din il-problema kbira.

B'mod ġenerali, Tensor għal miljun tal-klijenti tagħna huwa VLSI hija l-applikazzjoni tagħna: netwerk soċjali korporattiv, soluzzjonijiet għall-komunikazzjoni bil-vidjo, għall-fluss tad-dokumenti interni u esterni, sistemi ta 'kontabilità għall-kontabilità u mħażen,... Jiġifieri, tali "mega-combine" għall-ġestjoni integrata tan-negozju, li fiha hemm aktar minn 100 differenti proġetti interni.

Biex niżguraw li kollha jaħdmu u jiżviluppaw b’mod normali, għandna 10 ċentri ta’ żvilupp madwar il-pajjiż, b’aktar fihom 1000 żviluppatur.

Ilna naħdmu ma’ PostgreSQL mill-2008 u akkumulajna ammont kbir ta’ dak li nipproċessaw - dejta tal-klijenti, statistika, analitika, dejta minn sistemi ta’ informazzjoni esterni - aktar minn 400TB. Hemm madwar 250 server fil-produzzjoni biss, u b'kollox hemm madwar 1000 server ta 'database li aħna nissorveljaw.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

SQL hija lingwa dikjarattiva. Inti tiddeskrivi mhux "kif" xi ħaġa għandha taħdem, iżda "x'" trid tikseb. Id-DBMS jaf aħjar kif tagħmel JOIN - kif tgħaqqad it-tabelli tiegħek, liema kundizzjonijiet timponi, x'se jgħaddi mill-indiċi, x'mhux se...

Xi DBMSs jaċċettaw ħjiel: "Le, qabbad dawn iż-żewġ tabelli f'tali kju," iżda PostgreSQL ma jistax jagħmel dan. Din hija l-pożizzjoni konxja tal-iżviluppaturi ewlenin: "Aħna nippreferu nispiċċaw il-query optimizer milli nħallu lill-iżviluppaturi jużaw xi tip ta 'ħjiel."

Iżda, minkejja l-fatt li PostgreSQL ma jippermettix li "barra" jikkontrolla lilu nnifsu, jippermetti perfettament ara x'qed jiġri ġewwa fihmeta tmexxi l-mistoqsija tiegħek, u fejn qed ikollha problemi.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

B'mod ġenerali, liema problemi klassiċi normalment jiġi żviluppatur [għal DBA]? “Hawn issodisfajna t-talba, u kollox bil-mod magħna, kollox imdendel, qed jiġri xi ħaġa... Xi tip ta’ nkwiet!”

Ir-raġunijiet huma kważi dejjem l-istess:

  • algoritmu ta' mistoqsija ineffiċjenti
    Żviluppatur: "Issa qed nagħtih 10 tabelli f'SQL permezz ta' JOIN..." - u jistenna li l-kundizzjonijiet tiegħu mirakolużment ikunu effettivament "maħlula" u hu se jikseb kollox malajr. Iżda l-mirakli ma jseħħux, u kwalunkwe sistema b'tali varjabilità (10 tabelli f'wieħed MILL-) dejjem tagħti xi tip ta 'żball. [artikolu]
  • statistika skaduta
    Dan il-punt huwa rilevanti ħafna speċifikament għal PostgreSQL, meta "tferra" sett ta 'dejta kbir fuq is-server, tagħmel talba, u "sexcanits" il-pillola tiegħek. Minħabba li lbieraħ kien hemm 10 rekords fiha, u llum hemm 10 miljun, iżda PostgreSQL għadu mhux konxju ta 'dan, u għandna bżonn ngħidulu dwaru. [artikolu]
  • "plagg" fuq ir-riżorsi
    Installajt database kbira u mgħobbija ħafna fuq server dgħajjef li m'għandux biżżejjed disk, memorja, jew prestazzjoni tal-proċessur. U dak kollu... X'imkien hemm limitu ta 'prestazzjoni li fuqu ma tistax taqbeż aktar.
  • imblukkar
    Dan huwa punt diffiċli, iżda huma l-aktar rilevanti għal diversi mistoqsijiet ta 'modifika (DĦALLA, AĠĠORNAMENTI, ĦASSAR) - dan huwa suġġett kbir separat.

Jkollna pjan

...U għal kull ħaġa oħra aħna bżonn pjan! Irridu naraw x'qed jiġri ġewwa s-server.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Pjan ta 'eżekuzzjoni ta' mistoqsija għal PostgreSQL huwa siġra tal-algoritmu ta 'eżekuzzjoni ta' mistoqsija fir-rappreżentazzjoni tat-test. Huwa preċiżament l-algoritmu li, bħala riżultat ta 'analiżi mill-pjanifikatur, instab li kien l-aktar effettiv.

Kull node tas-siġra hija operazzjoni: irkuprar ta 'dejta minn tabella jew indiċi, bini ta' bitmap, tgħaqqad żewġ tabelli, tgħaqqad, jaqsam, jew teskludi selezzjonijiet. L-eżekuzzjoni ta' mistoqsija tinvolvi l-mixi min-nodi ta' din is-siġra.

Biex tikseb il-pjan ta 'mistoqsija, l-eħfef mod huwa li tesegwixxi d-dikjarazzjoni EXPLAIN. Biex tikseb l-attributi reali kollha, jiġifieri, biex fil-fatt tesegwixxi mistoqsija fuq il-bażi - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Il-parti ħażina: meta tmexxiha, jiġri "hawn u issa", għalhekk huwa adattat biss għal debugging lokali. Jekk tieħu server mgħobbi ħafna li huwa taħt fluss qawwi ta 'bidliet fid-dejta, u tara: "Oh! Hawnhekk għandna eżekuzzjoni bil-modXia talba." Nofs siegħa, siegħa ilu - waqt li kont qed taħdem u ġġib din it-talba mir-zkuk, ġġibha lura fis-server, id-dataset kollu tiegħek u l-istatistika nbidlu. Tmexxiha biex tiddibaggja - u taħdem malajr! U ma tistax tifhem għaliex, għaliex kien bil-mod.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Sabiex wieħed jifhem x'ġara eżattament fil-mument meta t-talba ġiet eżegwita fuq is-server, nies intelliġenti kitbu modulu auto_explain. Huwa preżenti fi kważi l-aktar distribuzzjonijiet PostgreSQL komuni kollha, u jista 'sempliċement jiġi attivat fil-fajl tal-konfigurazzjoni.

Jekk tirrealizza li xi talba qed taħdem itwal mil-limitu li għedtilha, tagħmel “snapshot” tal-pjan ta’ din it-talba u tiktebhom flimkien fil-ġurnal.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Kollox jidher li hu tajjeb issa, immorru fil-log u naraw hemm... [test footcloth]. Imma ma nistgħu ngħidu xejn dwarha, minbarra l-fatt li huwa pjan eċċellenti għax ħa 11ms biex twettaq.

Jidher li kollox huwa tajjeb – imma xejn mhu ċar x’ġara fil-fatt. Apparti l-ħin ġenerali, ma tantx naraw xejn. Minħabba li tħares lejn tali "ħaruf" ta 'test sempliċi ġeneralment mhux viżwali.

Imma anki jekk ma jkunx ovvju, anki jekk huwa inkonvenjenti, hemm problemi aktar fundamentali:

  • In-nodu jindika somma tar-riżorsi tas-subtree kollha taħtu. Jiġifieri, ma tistax sempliċement issir taf kemm inqatta’ ħin fuq dan l-Iskan tal-Indiċi partikolari jekk ikun hemm xi kundizzjoni mnaqqsa taħtha. Irridu nħarsu dinamikament biex naraw jekk hemmx "tfal" u varjabbli kondizzjonali, CTEs ġewwa - u nnaqqsu dan kollu "f'moħħna".
  • It-tieni punt: il-ħin li huwa indikat fuq in-node huwa ħin ta 'eżekuzzjoni ta' nodu wieħed. Jekk dan in-node ġie esegwit bħala riżultat ta ', pereżempju, loop through table records diversi drabi, allura n-numru ta' loops-ċikli ta 'dan in-node-żidiet fil-pjan. Iżda l-ħin ta 'eżekuzzjoni atomika innifsu jibqa' l-istess f'termini ta 'pjan. Jiġifieri, sabiex tifhem kemm dam dan in-node twettaq b'kollox, għandek bżonn timmultiplika ħaġa waħda b'oħra - għal darb'oħra, "f'rasek."

F'sitwazzjonijiet bħal dawn, ifhem "Min hija l-iktar ħolqa dgħajfa?" kważi impossibbli. Għalhekk, anke l-iżviluppaturi nfushom jiktbu fil-"manwal" li "Li nifhmu pjan hija arti li trid titgħallem, tesperjenza...".

Imma għandna 1000 żviluppatur, u ma tistax twassal din l-esperjenza lil kull wieħed minnhom. Jien, int, hu naf, imma xi ħadd hemmhekk m'għadux jaf. Forsi se jitgħallem, jew forsi le, iżda għandu bżonn jaħdem issa - u minn fejn jieħu din l-esperjenza?

Viżwalizzazzjoni tal-pjan

Għalhekk, indunajna li biex nittrattaw dawn il-problemi, għandna bżonn viżwalizzazzjoni tajba tal-pjan. [artiklu]

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

L-ewwel morna "mis-suq" - ejja nħarsu fuq l-Internet biex naraw dak li jeżisti.

Iżda rriżulta li hemm ftit soluzzjonijiet relattivament "ħajjin" li qed jiżviluppaw xi ftit jew wisq - litteralment, waħda biss: spjega.depesz.com minn Hubert Lubaczewski. Meta ddaħħal fil-qasam "għalf" rappreżentazzjoni tat-test tal-pjan, turik tabella bid-dejta parsed:

  • ħin tal-ipproċessar tan-node stess
  • ħin totali għas-subsiġra kollha
  • numru ta’ rekords li ġew irkuprati li kienu statistikament mistennija
  • il-korp tan-node innifsu

Dan is-servizz għandu wkoll il-kapaċità li jaqsam arkivju ta' links. Tefgħet il-pjan tiegħek hemmhekk u għedt: "Ħej, Vasya, hawn link, hemm xi ħaġa ħażina."

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Iżda hemm ukoll problemi żgħar.

L-ewwelnett, ammont kbir ta '"copy-paste". Tieħu biċċa taz-zkuk, waħħalha hemmhekk, u għal darb'oħra, u għal darb'oħra.

It-tieni, il- l-ebda analiżi tal-ammont ta' data moqrija — l-istess buffers li joħorġu EXPLAIN (ANALYZE, BUFFERS), aħna ma narawhx hawn. Sempliċement ma jafx kif iżarmahom, jifhimhom u jaħdem magħhom. Meta tkun qed taqra ħafna dejta u tirrealizza li tista' tkun qed talloka ħażin id-diska u l-cache tal-memorja, din l-informazzjoni hija importanti ħafna.

It-tielet punt negattiv huwa l-iżvilupp dgħajjef ħafna ta’ dan il-proġett. Il-kommessi huma żgħar ħafna, huwa tajjeb jekk darba kull sitt xhur, u l-kodiċi huwa fil-Perl.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Iżda dan kollu huwa "lirika", nistgħu b'xi mod ngħixu ma 'dan, iżda hemm ħaġa waħda li tbiegħdetna ħafna minn dan is-servizz. Dawn huma żbalji fl-analiżi tal-Common Table Expression (CTE) u diversi nodi dinamiċi bħal InitPlan/SubPlan.

Jekk temmen din l-istampa, allura l-ħin totali ta 'eżekuzzjoni ta' kull node individwali huwa akbar mill-ħin ta 'eżekuzzjoni totali tat-talba kollha. Huwa sempliċi - il-ħin tal-ġenerazzjoni ta' dan is-CTE ma ġiex imnaqqas min-node tal-Iskanjar CTE. Għalhekk, m'għadniex nafu t-tweġiba korretta għal kemm dam l-iskannjar CTE innifsu.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Imbagħad indunajna li kien wasal iż-żmien li niktbu tagħna stess - hurrah! Kull żviluppatur jgħid: "Issa se niktbu tagħna, se jkun super faċli!"

Ħadna munzell tipiku għas-servizzi tal-web: qalba bbażata fuq Node.js + Express, użajna Bootstrap u D3.js għal dijagrammi sbieħ. U l-aspettattivi tagħna kienu ġġustifikati bis-sħiħ - irċevejna l-ewwel prototip f'ġimgħatejn:

  • parser tal-pjan tad-dwana
    Jiġifieri, issa nistgħu naqraw kwalunkwe pjan minn dawk iġġenerati minn PostgreSQL.
  • analiżi korretta ta 'nodi dinamiċi - CTE Scan, InitPlan, SubPlan
  • analiżi tad-distribuzzjoni tal-buffers - fejn il-paġni tad-dejta jinqraw mill-memorja, fejn mill-cache lokali, fejn mid-disk
  • kisbu ċarezza
    Sabiex ma "tħaffer" dan kollu fil-ġurnal, iżda biex tara l-"iktar rabta dgħajfa" minnufih fl-istampa.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Sirna xi ħaġa bħal din, bl-enfasi tas-sintassi inkluża. Iżda ġeneralment l-iżviluppaturi tagħna m'għadhomx jaħdmu b'rappreżentazzjoni sħiħa tal-pjan, iżda b'waħda iqsar. Wara kollox, aħna diġà parsed in-numri kollha u threwhom xellug u lemin, u fin-nofs ħallejna biss l-ewwel linja, x'tip ta 'node huwa: CTE Scan, ġenerazzjoni CTE jew Seq Scan skond xi sinjal.

Din hija r-rappreżentazzjoni mqassra li nsejħu mudell tal-pjan.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

X'iktar ikun konvenjenti? Ikun konvenjenti li naraw liema sehem tal-ħin totali tagħna huwa allokat għal liema nodu - u sempliċement "twaħħlu" mal-ġenb grafika tat-torta.

Nippuntaw lejn in-nodu u naraw - jirriżulta li Seq Scan ħa inqas minn kwart tal-ħin totali, u l-bqija 3/4 ittieħdet minn CTE Scan. Orrur! Din hija nota żgħira dwar ir-"rata ta 'nar" ta' CTE Scan jekk tużahom b'mod attiv fil-mistoqsijiet tiegħek. Mhumiex veloċi ħafna - huma inferjuri anke għall-iskannjar regolari tal-mejda. [artiklu] [artiklu]

Iżda ġeneralment dijagrammi bħal dawn huma aktar interessanti, aktar kumplessi, meta nippuntaw immedjatament lejn segment u naraw, per eżempju, li aktar minn nofs il-ħin xi Seq Scan "tielu". Barra minn hekk, kien hemm xi tip ta 'Filtru ġewwa, ħafna rekords ġew mormija skond dan... Tista' tarmi din l-istampa direttament lill-iżviluppatur u tgħid: "Vasya, kollox huwa ħażin hawn għalik! Ara, ara – xi ħaġa ħażina!”

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Naturalment, kien hemm xi "rakes" involuti.

L-ewwel ħaġa li ltqajna magħhom kienet il-problema tal-arrotondament. Il-ħin ta 'kull nodu individwali fil-pjan huwa indikat bi preċiżjoni ta' 1 μs. U meta n-numru ta 'ċikli tan-nodi jaqbeż, pereżempju, 1000 - wara l-eżekuzzjoni PostgreSQL diviż "b'eżattezza", allura meta nikkalkulaw lura nġibu l-ħin totali "x'imkien bejn 0.95ms u 1.05ms". Meta l-għadd imur għal mikrosekondi, dan huwa tajjeb, iżda meta jkun diġà [milli] sekondi, trid tqis din l-informazzjoni meta "tħoll" riżorsi għan-nodi tal-pjan "min ikkunsma kemm".

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

It-tieni punt, aktar kumpless, huwa d-distribuzzjoni tar-riżorsi (dawk il-buffers) fost in-nodi dinamiċi. Dan swielna l-ewwel ġimgħatejn tal-prototip flimkien ma '2 ġimgħat oħra.

Huwa pjuttost faċli li tikseb din it-tip ta 'problema - nagħmlu CTE u suppost naqraw xi ħaġa fiha. Fil-fatt, PostgreSQL huwa "intelliġenti" u mhu se jaqra xejn direttament hemmhekk. Imbagħad nieħdu l-ewwel rekord minnha, u lilha l-mija u l-ewwel waħda mill-istess CTE.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Inħarsu lejn il-pjan u nifhmu - hija stramba, għandna 3 buffers (paġni tad-dejta) "ikkonsmati" f'Seq Scan, 1 aktar f'CTE Scan, u 2 oħra fit-tieni CTE Scan. Jiġifieri jekk sempliċement niġbru kollox, se nġibu 6, iżda mit-tablet naqraw biss 3! CTE Scan ma jaqra xejn minn kullimkien, iżda jaħdem direttament mal-memorja tal-proċess. Jiġifieri, hawn xi ħaġa ċara ħażina!

Fil-fatt jirriżulta li hawn dawk it-3 paġni ta’ data kollha li ġew mitluba minn Seq Scan, l-ewwel 1 talab għall-1st CTE Scan, u mbagħad it-2, u 2 oħra inqrawlu, Jiġifieri total ta’ Inqraw dejta 3 paġni, mhux 6.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

U din l-istampa wasslitna biex nifhmu li l-eżekuzzjoni ta 'pjan m'għadhiex siġra, iżda sempliċement xi tip ta' graff aċikliku. U ksibna dijagramma bħal din, sabiex nifhmu "x'kien ġej minn fejn fl-ewwel lok." Jiġifieri, hawnhekk ħloqna CTE minn pg_class, u tlabna għaliha darbtejn, u kważi l-ħin kollu tagħna qattgħu fuq il-fergħa meta tlabna għalih it-2 darba. Huwa ċar li l-qari tal-101 ​​daħla jiswa ħafna iktar milli sempliċement il-qari tal-1 daħla mit-tablet.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Aħna nefgħu għal ftit żmien. Huma qalu: “Issa, Neo, taf il-kung fu! Issa l-esperjenza tagħna hija dritt fuq l-iskrin tiegħek. Issa tista’ tużah.” [artiklu]

Konsolidazzjoni taz-zkuk

L-1000 żviluppatur tagħna ħadu daqqa ta’ nifs. Imma fhimna li għandna biss mijiet ta 'servers ta' "ġlieda kontra", u dan kollu "copy-paste" min-naħa ta 'l-iżviluppaturi m'huwa xejn konvenjenti. Indunajna li kellna niġbruha aħna stess.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

B'mod ġenerali, hemm modulu standard li jista 'jiġbor statistika, madankollu, jeħtieġ ukoll li jiġi attivat fil-konfigurazzjoni - dan modulu pg_stat_statements. Imma ma kienx tajjeb lilna.

L-ewwelnett, jassenja lill-istess mistoqsijiet billi juża skemi differenti fl-istess database QueryIds differenti. Jiġifieri, jekk l-ewwel tagħmel SET search_path = '01'; SELECT * FROM user LIMIT 1;u allura SET search_path = '02'; u l-istess talba, allura l-istatistika ta 'dan il-modulu se jkollha rekords differenti, u ma nkunx kapaċi niġbor statistika ġenerali speċifikament fil-kuntest ta' dan il-profil ta 'talba, mingħajr ma nikkunsidra l-iskemi.

It-tieni punt li żammna milli nużawh huwa nuqqas ta’ pjanijiet. Jiġifieri m'hemm l-ebda pjan, hemm biss it-talba nnifisha. Naraw x’kien qed jonqos, imma ma nifhmux għalfejn. U hawn nerġgħu lura għall-problema ta 'sett tad-dejta li qed jinbidel malajr.

U l-aħħar mument - nuqqas ta' "fatti". Jiġifieri, ma tistax tindirizza każ speċifiku ta 'eżekuzzjoni ta' mistoqsija - m'hemm xejn, hemm biss statistika aggregata. Għalkemm huwa possibbli li taħdem ma 'dan, huwa sempliċiment diffiċli ħafna.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Għalhekk, iddeċidejna li niġġieldu l-copy-paste u bdejna niktbu kollettur.

Il-kollettur jgħaqqad permezz ta 'SSH, jistabbilixxi konnessjoni sigura mas-server mad-database bl-użu ta' ċertifikat, u tail -F "jitwaħħal" miegħu fil-fajl tal-ġurnal. Allura f'din is-sessjoni niksbu "mera" kompluta tal-fajl tal-ġurnal kollu, li jiġġenera s-server. It-tagħbija fuq is-server innifsu hija minima, għaliex aħna ma naqilbu xejn hemmhekk, aħna biss nirriflettu t-traffiku.

Peress li konna diġà bdejna nikteb l-interface f'Node.js, komplejna niktbu l-kollettur fiha. U din it-teknoloġija ġġustifikat lilha nnifisha, minħabba li huwa konvenjenti ħafna li tuża JavaScript biex taħdem b'dejta tat-test ifformattjata dgħajjef, li hija l-ġurnal. U l-infrastruttura Node.js nnifisha bħala pjattaforma backend tippermettilek taħdem faċilment u b'mod konvenjenti b'konnessjonijiet tan-netwerk, u tabilħaqq ma 'kwalunkwe fluss ta' data.

Għaldaqstant, aħna "niġġebbdu" żewġ konnessjonijiet: l-ewwel biex "tisma" l-ġurnal innifsu u teħodha lilna nfusna, u t-tieni biex perjodikament tistaqsi l-bażi. "Imma l-ġurnal juri li s-sinjal b'oid 123 huwa mblukkat," iżda dan ma jfissirx xejn għall-iżviluppatur, u jkun sabiħ li tistaqsi lid-database, "X'inhu OID = 123 xorta waħda?" U għalhekk perjodikament nistaqsu lill-bażi dak li għadna ma nafux dwarna nfusna.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

"Hemm ħaġa waħda biss li ma ħadtx in kunsiderazzjoni, hemm speċi ta 'naħal bħal iljunfant!..." Bdejna niżviluppaw din is-sistema meta ridna nissorveljaw 10 servers. L-aktar kritiku fil-fehim tagħna, fejn qamu xi problemi li kienu diffiċli biex jiġu ttrattati. Iżda matul l-ewwel kwart, irċevejna mija għall-monitoraġġ - għax is-sistema ħadmet, kulħadd riedha, kulħadd kien komdu.

Dan kollu jeħtieġ li jiġi miżjud, il-fluss tad-dejta huwa kbir u attiv. Fil-fatt, dak li nissorveljaw, dak li nistgħu nittrattaw, huwa dak li nużaw. Aħna nużaw ukoll PostgreSQL bħala ħażna tad-dejta. U xejn mhu aktar mgħaġġel biex "tferra" dejta fiha mill-operatur COPY Mhux għal issa.

Imma sempliċement "tferra" dejta mhix verament it-teknoloġija tagħna. Minħabba li jekk għandek madwar 50k talba kull sekonda fuq mitt server, allura dan jiġġenera 100-150GB ta 'zkuk kuljum. Għalhekk, kellna "taqtgħu" bir-reqqa l-bażi.

L-ewwelnett, għamilna qsim bil-ġurnata, għaliex, b'mod ġenerali, ħadd mhu interessat fil-korrelazzjoni bejn il-ġranet. X'differenza tagħmel dak li kellek ilbieraħ, jekk illejla ħarġet verżjoni ġdida tal-applikazzjoni - u diġà xi statistika ġdida.

It-tieni, tgħallimna (konna sfurzati) ħafna, malajr ħafna biex tikteb bl-użu COPY. Jiġifieri, mhux biss COPYgħax hu aktar mgħaġġel minn INSERT, u saħansitra aktar malajr.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

It-tielet punt - kelli jabbandunaw triggers, rispettivament, u ċwievet barranin. Jiġifieri, m'għandna l-ebda integrità referenzjali. Għax jekk għandek tabella li għandha par FKs, u tgħid fl-istruttura tad-database li "hawn rekord ta' log li huwa referenzjat minn FK, pereżempju, għal grupp ta' rekords," allura meta daħħalha, PostgreSQL fadallu xejn ħlief kif teħodha u tagħmlu onestament SELECT 1 FROM master_fk1_table WHERE ... bl-identifikatur li qed tipprova ddaħħal - biss biex tivverifika li dan ir-rekord huwa preżenti hemmhekk, li ma "tkissirx" din iċ-Ċavetta Barranija bl-inserzjoni tiegħek.

Minflok rekord wieħed għat-tabella fil-mira u l-indiċi tagħha, aħna nieħdu l-benefiċċju miżjud tal-qari mit-tabelli kollha li tirreferi għalihom. Imma dan m'għandniex bżonn xejn - il-kompitu tagħna huwa li nirreġistraw kemm jista 'jkun u malajr kemm jista' jkun bl-inqas tagħbija. Allura FK - isfel!

Il-punt li jmiss huwa l-aggregazzjoni u l-hashing. Inizjalment, implimentajnahom fid-database - wara kollox, huwa konvenjenti li immedjatament, meta jasal rekord, tagħmel dan f'xi tip ta 'pillola "plus wieħed" dritt fil-grillu. Ukoll, huwa konvenjenti, iżda l-istess ħaġa ħażina - inti daħħal rekord wieħed, iżda sfurzat taqra u tikteb xi ħaġa oħra minn tabella oħra. Barra minn hekk, mhux biss taqra u tikteb, tagħmilha wkoll kull darba.

Issa immaġina li għandek tabella li fiha sempliċement tgħodd in-numru ta’ talbiet li għaddew minn ospitanti speċifiku: +1, +1, +1, ..., +1. U int, fil-prinċipju, m'għandekx bżonn dan - kollox huwa possibbli somma fil-memorja fuq il-kollettur u tibgħat lill-database f'daqqa waħda +10.

Iva, f'każ ta 'xi problemi, l-integrità loġika tiegħek tista' "taqa' barra", iżda dan huwa każ kważi mhux realistiku - minħabba li għandek server normali, għandha batterija fil-kontrollur, għandek reġistru tat-tranżazzjonijiet, log fuq il- sistema ta 'fajls... B'mod ġenerali, mhux worth it. It-telf ta 'produttività li tikseb mit-tħaddim ta' triggers/FK ma jiswax l-ispiża li ġġarrab.

Huwa l-istess mal-hashing. Ċerta talba itir lilek, tikkalkula ċertu identifikatur minnha fid-database, tiktebha fid-database u mbagħad tgħidha lil kulħadd. Kollox tajjeb sakemm, fil-ħin tar-reġistrazzjoni, tiġi għandek it-tieni persuna li trid tirrekordja l-istess ħaġa - u tiġi mblukkata, u dan diġà huwa ħażin. Għalhekk, jekk tista 'tittrasferixxi l-ġenerazzjoni ta' xi IDs lill-klijent (relattivament mad-database), huwa aħjar li tagħmel dan.

Kienet perfetta għalina li nużaw MD5 mit-test - talba, pjan, mudell,... Aħna nikkalkulawha fuq in-naħa tal-kollettur, u "ferra" l-ID lesta fid-database. It-tul ta 'MD5 u l-qsim ta' kuljum jippermettulna ma ninkwetawx dwar ħabtiet possibbli.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Iżda sabiex nirreġistra dan kollu malajr, kellna bżonn li timmodifika l-proċedura ta 'reġistrazzjoni nnifisha.

Kif normalment tikteb id-data? Għandna xi tip ta 'sett tad-dejta, naqsmuh f'diversi tabelli, u mbagħad KOpjawh - l-ewwel fl-ewwel, imbagħad fit-tieni, fit-tielet... Huwa inkonvenjenti, għax jidher li qed niktbu fluss tad-dejta wieħed fi tliet passi sekwenzjali. Spjaċevoli. Jista 'jsir aktar malajr? Jista!

Biex tagħmel dan, huwa biżżejjed li tiddekomponi dawn il-flussi b'mod parallel ma 'xulxin. Jirriżulta li għandna żbalji, talbiet, mudelli, imblukkar, ... jtiru f'ħjut separati - u niktbu dan kollu b'mod parallel. Biżżejjed għal dan żomm kanal KOPJA kontinwament miftuħ għal kull tabella ta 'mira individwali.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Jiġifieri fil-kollettur dejjem hemm nixxiegħa, li fiha nista' nikteb id-dejta li għandi bżonn. Imma sabiex id-database tara din id-data, u xi ħadd ma jeħelx jistenna li din id-data tinkiteb, KOPJA għandha tiġi interrotta f'ċerti intervalli. Għalina, l-iktar perjodu effettiv kien ta 'madwar 100ms - nagħlquh u immedjatament niftħu mill-ġdid għall-istess tabella. U jekk ma jkollniex biżżejjed fluss wieħed matul xi quċċata, allura nagħmlu ġbir sa ċertu limitu.

Barra minn hekk, sibna li għal tali profil ta 'tagħbija, kwalunkwe aggregazzjoni, meta r-rekords jinġabru f'lottijiet, hija ħażina. Il-ħażen klassiku huwa INSERT ... VALUES u aktar 1000 rekord. Għax f'dak il-punt għandek write peak fuq il-midja, u kull min jipprova jikteb xi ħaġa fuq id-diska se jkun qed jistenna.

Biex teħles minn dawn l-anomaliji, sempliċement ma aggregax xejn, ma buffer xejn. U jekk iseħħ il-buffering għad-disk (fortunatament, l-API Stream f'Node.js jippermettilek issir taf) - tipposponi din il-konnessjoni. Meta tirċievi avveniment li huwa ħieles mill-ġdid, ikteb lilha mill-kju akkumulat. U waqt li jkun okkupat, ħu dak li jmiss b'xejn mill-pool u ikteb lilha.

Qabel ma nintroduċu dan l-approċċ għar-reġistrazzjoni tad-dejta, kellna bejn wieħed u ieħor 4K write ops, u b'dan il-mod naqqasna t-tagħbija b'4 darbiet. Issa kibru 6 darbiet oħra minħabba databases ġodda mmonitorjati - sa 100MB/s. U issa naħżnu zkuk għall-aħħar 3 xhur f'volum ta 'madwar 10-15TB, bit-tama li fi tliet xhur biss kwalunkwe żviluppatur ikun jista' jsolvi kwalunkwe problema.

Aħna nifhmu l-problemi

Iżda sempliċement il-ġbir ta 'din id-dejta kollha huwa tajjeb, utli, rilevanti, iżda mhux biżżejjed - jeħtieġ li jinftiehem. Minħabba li dawn huma miljuni ta 'pjanijiet differenti kuljum.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Iżda miljuni mhumiex maniġġabbli, l-ewwel irridu nagħmlu "iżgħar". U, l-ewwelnett, trid tiddeċiedi kif se torganizza din il-ħaġa "iżgħar".

Aħna identifikajna tliet punti ewlenin:

  • min bagħtet din it-talba
    Jiġifieri, minn liema applikazzjoni "waslet": interface tal-web, backend, sistema ta 'ħlas jew xi ħaġa oħra.
  • fejn ġrat
    Fuq liema server speċifiku? Għax jekk għandek diversi servers taħt applikazzjoni waħda, u f'daqqa waħda waħda "jmur stupidu" (minħabba li d-"disk huwa immuffat", "memorja leaked", xi problema oħra), allura għandek bżonn tindirizza speċifikament is-server.
  • kif il-problema mmanifesta ruħha b'xi mod jew ieħor

Biex nifhmu "min" bgħatilna talba, nużaw għodda standard - nissettjaw varjabbli tas-sessjoni: SET application_name = '{bl-host}:{bl-method}'; — aħna nibagħtu l-isem tal-host tal-loġika tan-negozju li minnu tkun ġejja t-talba, u l-isem tal-metodu jew l-applikazzjoni li bdietha.

Wara li ngħaddu s-"sid" tat-talba, din għandha toħroġ fil-ġurnal - għal dan aħna kkonfiguraw il-varjabbli log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Għal dawk interessati, forsi ħares fil-manwalxi jfisser dan kollu. Jirriżulta li naraw fil-ġurnal:

  • ħin
  • identifikaturi tal-proċess u tat-tranżazzjoni
  • isem tad-database
  • IP tal-persuna li bagħtet din it-talba
  • u l-isem tal-metodu

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Imbagħad indunajna li mhuwiex interessanti ħafna li nħarsu lejn il-korrelazzjoni għal talba waħda bejn servers differenti. Mhux ta 'spiss li jkollok sitwazzjoni fejn applikazzjoni waħda tingħalaq b'mod ugwali hawn u hemm. Imma anki jekk huwa l-istess, ħares lejn kwalunkwe minn dawn is-servers.

Allura hawn il-qatgħa "server wieħed - jum wieħed" irriżulta li kien biżżejjed għalina għal kull analiżi.

L-ewwel taqsima analitika hija l-istess "kampjun" - forma mqassra ta' preżentazzjoni tal-pjan, imneħħija mill-indikaturi numeriċi kollha. It-tieni qatgħa hija l-applikazzjoni jew il-metodu, u t-tielet qatgħa hija n-nodu tal-pjan speċifiku li kkawżalna problemi.

Meta mxejna minn każijiet speċifiċi għal mudelli, ksibna żewġ vantaġġi f'daqqa:

  • tnaqqis multiplu fin-numru ta 'oġġetti għall-analiżi
    Irridu nanalizzaw il-problema mhux aktar b'eluf ta 'mistoqsijiet jew pjanijiet, iżda b'għexieren ta' mudelli.
  • timeline
    Jiġifieri, billi tiġbor fil-qosor il-"fatti" f'ċerta taqsima, tista 'turi d-dehra tagħhom matul il-ġurnata. U hawn tista 'tifhem li jekk għandek xi tip ta' mudell li jiġri, pereżempju, darba fis-siegħa, iżda għandu jiġri darba kuljum, għandek taħseb dwar dak li mar ħażin - min ikkawżah u għaliex, forsi għandu jkun hawn m'għandux. Dan huwa metodu ieħor ta' analiżi mhux numeriku, purament viżwali.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Il-metodi li fadal huma bbażati fuq l-indikaturi li niġbdu mill-pjan: kemm-il darba seħħ mudell bħal dan, iż-żmien totali u medju, kemm inqrat dejta mid-diska, u kemm mill-memorja...

Minħabba li, pereżempju, tasal għall-paġna analitika għall-host, ara - xi ħaġa qed tibda taqra wisq fuq id-diska. Id-diska fuq is-server ma tistax tieħu ħsiebha - min jaqra minnha?

U tista 'tissortja minn kwalunkwe kolonna u tiddeċiedi x'se tittratta bħalissa - it-tagħbija fuq il-proċessur jew id-diska, jew in-numru totali ta' talbiet... Aħna għamilnaha, ħares lejn dawk "fuq", iffissajna u ħarġet verżjoni ġdida tal-applikazzjoni.
[taħdita bil-vidjo]

U immedjatament tista 'tara applikazzjonijiet differenti li jiġu mal-istess mudell minn talba bħal SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, ipproċessar... U tistaqsi għaliex l-ipproċessar jaqra lill-utent jekk ma jinteraġixxix miegħu.

Il-mod oppost huwa li immedjatament tara mill-applikazzjoni dak li tagħmel. Pereżempju, il-frontend huwa dan, dan, dan, u dan darba fis-siegħa (il-kronoloġija tgħin). U immedjatament tqum il-mistoqsija: jidher li mhux xogħol il-frontend li tagħmel xi ħaġa darba fis-siegħa...

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Wara xi żmien, indunajna li ma kellniex l-aggregati statistika minn nodi tal-pjan. Aħna iżolati mill-pjanijiet biss dawk in-nodi li jagħmlu xi ħaġa bid-dejta tat-tabelli nfushom (jaqrawhom / iktbuhom bl-indiċi jew le). Fil-fatt, aspett wieħed biss huwa miżjud relattiv għall-istampa ta 'qabel - kemm rekords ġabilna dan in-node?, u kemm ġew mormija (Ringieli Imneħħija mill-Filtru).

M'għandekx indiċi adattat fuq il-pjanċa, tagħmel talba għaliha, itir mill-indiċi, taqa 'f'Seq Scan... inti ffiltrajt ir-rekords kollha ħlief wieħed. Għaliex għandek bżonn 100M rekords iffiltrati kuljum? Mhux aħjar li tirrumbla l-indiċi?

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Wara li analizzajna l-pjanijiet kollha nodu b'nodu, indunajna li hemm xi strutturi tipiċi fil-pjanijiet li x'aktarx jidhru suspettużi. U jkun sabiħ li tgħid lill-iżviluppatur: "Ħabib, hawn l-ewwel taqra bl-indiċi, imbagħad issortja, u mbagħad maqtugħa" - bħala regola, hemm rekord wieħed.

Kull min kiteb mistoqsijiet x'aktarx iltaqa' ma' dan il-mudell: "Agħtini l-aħħar ordni għal Vasya, id-data tagħha." U jekk ma jkollokx indiċi skond id-data, jew m'hemm l-ebda data fl-indiċi li użajt, allura inti ser pass fuq eżattament l-istess "rake".

Imma nafu li dan huwa "rake" - allura għaliex ma tgħidx immedjatament lill-iżviluppatur x'għandu jagħmel. Għaldaqstant, meta jiftaħ pjan issa, l-iżviluppatur tagħna immedjatament jara stampa sabiħa bi suġġerimenti, fejn immedjatament jgħidulu: "Għandek problemi hawn u hemm, iżda huma solvuti b'dan u b'dak il-mod."

Bħala riżultat, l-ammont ta 'esperjenza li kien meħtieġ biex issolvi l-problemi fil-bidu u issa naqas b'mod sinifikanti. Dan huwa t-tip ta 'għodda li għandna.

Ottimizzazzjoni bl-ingrossa ta' mistoqsijiet PostgreSQL. Kirill Borovikov (Tensor)

Sors: www.habr.com

Żid kumment