Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Warbixintu waxay soo bandhigaysaa qaar ka mid ah hababka u oggolaanaya la soco waxqabadka su'aalaha SQL marka ay jiraan malaayiin ka mid ah maalintii, waxaana jira boqolaal adeegayaal PostgreSQL ah oo la kormeero.

Waa maxay xalal farsamo oo noo ogolaanaya inaan si wax ku ool ah uga baaraandegno mugga macluumaadkaas, sidee ayay tani u fududaynaysaa nolosha horumariyaha caadiga ah?


Yaa xiisaynaya? falanqaynta dhibaatooyinka gaarka ah iyo farsamooyinka kala duwan ee hagaajinta Su'aalaha SQL iyo xallinta mashaakilaadka DBA ee caadiga ah ee PostgreSQL - sidoo kale waad awoodaa akhri maqaallo taxane ah mowduucan.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)
Magacaygu waa Kirill Borovikov, aniga oo matalaya Shirkadda Tensor. Gaar ahaan, waxaan ku takhasusay la shaqaynta xogta macluumaadka ee shirkadeena.

Maanta waxaan kuu sheegi doonaa sida aan u wanaajino weydiimaha, marka aadan u baahnayn inaad "kala soocdo" waxqabadka hal su'aal, laakiin xalliso dhibaatada guud ahaan. Marka ay jiraan malaayiin codsiyo ah, oo aad u baahan tahay inaad hesho qaar hababka loo xalliyo dhibaatadan weyn.

Guud ahaan, Tensor milyan ka mid ah macaamiisheena waa VLSI waa codsigeena: shabakada bulshada ee shirkadaha, xalalka isgaadhsiinta fiidiyowga, qulqulka dukumeenti gudaha iyo dibedda, nidaamyada xisaabinta ee xisaabinta iyo bakhaarada,... Taasi waa, sida "mega-combine" ee maareynta ganacsiga isku dhafan, taas oo ay jiraan in ka badan 100 kala duwan. mashaariicda gudaha.

Si loo hubiyo in dhammaantood ay si caadi ah u shaqeeyaan oo ay u horumaraan, waxaan leenahay 10 xarumood oo horumarineed oo dalka oo dhan ah, oo ay ku yaalaan in ka badan 1000 horumariye.

Waxaan la shaqaynaynay PostgreSQL ilaa 2008 waxaana soo uruurinay xaddi badan oo ah waxa aan farsameyno - xogta macmiilka, tirakoobka, falanqaynta, xogta nidaamyada macluumaadka dibadda - in ka badan 400TB. Waxa jira ilaa 250 server oo wax soo saarka oo keliya ah, wadar ahaanna waxa jira ilaa 1000 kayd xogeed oo aanu la socono.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

SQL waa luqad cad. Ma qeexaysid "sida" wax u shaqeeyaan, laakiin "waxa" aad rabto inaad gaarto. DBMS si fiican ayey u taqaanaa sida loo sameeyo ku biir - sida loo xidho miisaskaaga, shuruudaha lagu soo rogi doono, waxa dhex mari doona tusmada, waxa aan...

Qaar ka mid ah DBMS-yada waxay aqbalaan tilmaamo: "Maya, ku xidh labadan miis sida safka ah," laakiin PostgreSQL ma samayn karo tan. Tani waa mawqifka miyirka leh ee horumariyeyaasha hormuudka ah: "Waxaan ka door bidi lahayn dhammayn-fududaha weydiinta intii aan u oggolaan lahayn horumariyayaashu inay isticmaalaan nooc tilmaamo ah."

Laakiin, inkastoo xaqiiqda ah in PostgreSQL aysan u oggolaan "dibadda" in ay is-xakameyso, waxay si fiican u oggolaaneysaa bal arag waxa ka dhex jira isagamarka aad socodsiiso su'aalahaaga, iyo meelaha ay dhibaato ka haysato.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Guud ahaan, waa maxay dhibaatooyinka caadiga ah ee horumariyaha [DBA] badanaa la yimaado? “Halkan waxaan ka buuxinay codsigii, iyo wax walba waa nala gaabiyaaWax walba waa soo laadlaadsan yihiin, wax baa dhacaya... Nooc dhibaato ah!”

Sababaha had iyo jeer waa isku mid:

  • Algorithm su'aal aan tayo lahayn
    Soo-saare: "Hadda waxaan siinayaa 10 miis oo SQL ah iyada oo loo sii marayo JOIN..." - oo wuxuu rajeynayaa in xaaladdiisu ay si mucjiso ah u noqon doonto mid si wax ku ool ah "loo xidho" oo uu wax walba si dhakhso ah u heli doono. Laakiin mucjisooyinku ma dhacaan, iyo nidaam kasta oo leh kala duwanaansho noocaas ah (10 miis oo mid ka mid ah FROM) ayaa had iyo jeer bixiya nooc qalad ah. [maqaal]
  • tirakoob aan khusayn
    Qodobkani aad buu u khuseeyaa gaar ahaan PostgreSQL, marka aad "ku shubtay" xog-ururin weyn oo ku saabsan server-ka, samee codsi, oo waxay "sexcanits" kaniinigaada. Sababtoo ah shalay waxaa ku jiray 10 diiwaan, maantana waxaa jira 10 milyan, laakiin PostgreSQL weli kama warqabin arrintan, waxaanan u baahanahay inaan u sheegno. [maqaal]
  • "ku xir" kheyraadka
    Waxaad ku rakibtay kayd weyn oo aad loo raran yahay server daciif ah oo aan lahayn disk ku filan, xusuusta, ama waxqabadka processor-ka. Taasina waa dhammaan ... Meel waxaa jira saqafka sare ee waxqabadka kaas oo aanad mar dambe boodi karin.
  • xannibid
    Tani waa dhibco adag, laakiin waxay aad ugu habboon yihiin weydiimaha kala duwan ee wax ka beddelka (GALI, CUSBOONAYSIIN, DELETE) - kani waa mawduuc weyn oo gooni ah.

Helitaanka qorshe

...Oo wax kasta oo kale annagu u baahan qorshe! Waxaan u baahanahay inaan aragno waxa ka dhacaya gudaha serverka.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Qorshaha fulinta weydiinta ee PostgreSQL waa geed ka mid ah algorithm fulinta weydiinta ee matalaadda qoraalka. Sida saxda ah waa algorithm-ka, natiijada falanqaynta qorshayuhu, ayaa la ogaaday inuu yahay kan ugu waxtarka badan.

Node kasta oo geed waa hawlgal: dib u soo celinta xogta miis ama tusaha, dhisida khariidad yar, ku biirista laba miis, ku biirista, isgoysyada, ama ka reebida xulashooyinka. Fulinta su'aasha waxay ka mid tahay in la dhex maro noodhka geedkan.

Si aad u hesho qorshaha weydiinta, habka ugu fudud waa in la fuliyo bayaanka EXPLAIN. Si aad ula socoto dhammaan sifooyinka dhabta ah, taas oo ah, in dhab ahaantii la fuliyo su'aal ku saabsan saldhigga - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Qaybta xun: markaad socodsiiso, waxay ku dhacdaa "halkan iyo hadda", markaa waxay ku habboon tahay oo kaliya hagaajinta degaanka. Haddii aad qaadato server aad u raran oo ku hoos jira qulqulka xog ee isbedbeddelaya, oo aad aragto: "Oh! Halkan waxaan ku leenahay dil aayar ahxia codsi." Nus saac, saacad ka hor - intaad ordaysay oo aad codsigan ka helayso logudyada, dib ugu soo celinta serverka, dhammaan xogtaada iyo tirakoobka ayaa isbedelay. Waxaad u socodsiisaa si aad u saxdo - oo si degdeg ah ayay u socotaa! Oo ma fahmi kartid sababta, sababta waxay ahayd si tartiib ah.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Si loo fahmo waxa dhacay wakhtigan xaadirka ah markii codsiga lagu fuliyay server-ka, dadka caqliga leh ayaa qoray auto_explain module. Waxay ku jirtaa ku dhawaad ​​dhammaan qaybinta PostgreSQL ee ugu caansan, waxaana si fudud loogu hawlgelin karaa faylka qaabeynta.

Haddii ay ogaato in codsiga qaar uu soconayo in ka badan xadka aad u sheegtay, way sameynaysaa "Snaphot" ee qorshaha codsigan oo ay ku wada qoraan buugga.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Wax walba hadda waxay u muuqdaan inay wanaagsan yihiin, waxaan tagnaa loggia oo aan ku aragnaa halkaas... [maro qoraal ah]. Laakiin waxba kama sheegi karno, marka laga reebo xaqiiqda ah inay tahay qorshe aad u wanaagsan sababtoo ah waxay qaadatay 11ms in la fuliyo.

Wax kastaa waxay u muuqdaan inay fiican yihiin - laakiin ma jiraan wax cad oo dhab ahaantii dhacay. Marka laga reebo wakhtiga guud, dhab ahaantii waxba ma aragno. Sababtoo ah fiirinta "wanka" sida qoraalka cad guud ahaan maaha mid muuqaal ah.

Laakiin xitaa haddii aysan muuqan, xitaa haddii aysan ku habboonayn, waxaa jira dhibaatooyin kale oo aasaasi ah:

  • Noodka ayaa tilmaamaya wadarta kheyraadka geedka hoose oo dhan hoostiisa. Taasi waa, kaliya ma ogaan kartid inta wakhtiga lagu qaatay Scan Tuska gaarka ah haddii ay jirto xaalad buul ah oo hoosteeda ah. Waa inaan si firfircoon u eegnaa inay jiraan "carruur" iyo doorsoomayaal shuruudaysan, CTE-yada gudaha - oo aan ka jarno dhammaan "maskaxdayada".
  • Qodobka labaad: wakhtiga lagu tilmaamay budada waa hal node waqti fulinta. Haddii noodhkan loo fuliyay natiijo ahaan, tusaale ahaan, wareeg ah iyada oo loo marayo diiwaannada miiska dhowr jeer, ka dibna tirada wareegyada - wareegyada noodhkan - waxay kordhisaa qorshaha. Laakiin wakhtiga fulinta atomiga laftiisa ayaa ah sidii hore marka loo eego qorshaha. Taasi waa, si aad u fahamto inta ay noodhkan guud ahaan la sameeyay, waxaad u baahan tahay inaad hal shay ku dhufato mid kale - mar labaad, "madaxaaga."

Xaaladahan oo kale, faham "Waa kuma xiriirka ugu liita?" ku dhawaad ​​wax aan macquul aheyn. Sidaa darteed, xitaa horumarinta laftoodu waxay ku qoraan "buugga" taas "Fahamka qorshe waa farshaxan ay tahay in la barto, waayo-aragnimo...".

Laakiin waxaan leenahay 1000 horumariye, mana u gudbin kartid khibradan mid kasta oo iyaga ka mid ah. Aniga, adiga, wuu garanayaa, laakiin qof halkaas jooga ma yaqaan. Waxaa laga yaabaa inuu baran doono, ama maya, laakiin wuxuu u baahan yahay inuu hadda shaqeeyo - oo halkee ayuu khibraddan ka heli lahaa?

Aragtida qorshe

Sidaa darteed, waxaan ogaanay in si wax looga qabto dhibaatooyinkaas aan u baahanahay muuqaal wanaagsan ee qorshaha. [maqaal]

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Waxaan markii hore u gudubnay "suuqa" - aan eegno internetka si aan u aragno waxa xitaa jira.

Laakiin waxaa soo baxday in ay jiraan wax aad u yar oo "nool" xalal kuwaas oo soo koraya ama ka yar - macno ahaan, kaliya hal: sharax.depesz.com by Hubert Lubaczewski. Markaad geliso goobta "quudinta" matalaadda qoraalka ee qorshaha, waxay ku tusinaysaa miis ay ku jiraan xogta la kala saaray:

  • node waqtigeeda habaynta
  • wakhtiga guud ee geedka hoose oo dhan
  • tirada diiwaannada la soo saaray ee la filayey tirokoob ahaan
  • jirka node laftiisa

Adeegani waxa kale oo uu awood u leeyahay in uu wadaago kaydka isku xidhka Qorshahaagii ayaad ku dhex tuurtay oo tidhi: "Hey, Vasya, waa kan isku xidhka, wax baa meeshaas ka khaldan."

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Laakiin sidoo kale waxaa jira dhibaatooyin yaryar.

Marka hore, tiro aad u badan oo ah "koobi-paste". Waxaad qaadataa qayb ka mid ah logga, ku dheji halkaas, iyo mar kale, iyo mar kale.

Marka labaad, aan la falanqeyn tirada xogta la akhriyay - isla kaydiyeyaasha soo saara EXPLAIN (ANALYZE, BUFFERS), kuma aragno halkan. Isagu si fudud ma garanayo sida loo kala furfuro, u fahmo oo ula shaqeeyo. Marka aad akhrinayso xog badan oo aad ogaato in laga yaabo inaad si khaldan u qoondaysay diskka iyo kaydka xusuusta, macluumaadkani waa mid aad muhiim u ah.

Qodobka saddexaad ee taban waa horumarka aadka u liita ee mashruucan. Ballanqaadyadu aad bay u yar yihiin, way fiican tahay haddii lixdii biloodba mar, koodhkana uu ku yaal Perl.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Laakiin tani waa dhammaan "lyrics", si uun baan ula noolaan karnaa kan, laakiin waxaa jira hal shay oo si weyn nooga leexiyay adeeggan. Kuwani waa khaladaad ku jira falanqaynta Muujinta Shaxda Guud (CTE) iyo noodhka firfircoon ee kala duwan sida InitPlan/SubPlan.

Haddii aad aaminsan tahay sawirkan, markaa wadarta wakhtiga fulinta ee noode kasta oo gaar ah ayaa ka weyn wadarta wakhtiga fulinta codsiga oo dhan. Way fududahay - wakhtiga jiilka CTE-da lagama jarin CTE Scan node. Sidaa darteed, hadda ma garanayno jawaabta saxda ah ee muddada baaritaanka CTE lafteedu qaadatay.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Dabadeed waxaanu garwaaqsanay in la gaadhay wakhtigii aan qori lahayn - hurray! Horumariye kastaa wuxuu dhahaa: "Hadda waxaan qori doonnaa keenna, aad bay u fududahay!"

Waxaan soo qaadannay xirmo caadi ah oo loogu talagalay adeegyada shabakadda: xudunta ku saleysan Node.js + Express, loo isticmaalo Bootstrap iyo D3.js jaantusyada quruxda badan. Filashooyinkayaguna si buuxda ayaa loo caddeeyey - waxaan helnay tusaalihii ugu horreeyay 2 toddobaad gudahood:

  • falanqeeye qorshe gaar ah
    Taasi waa, hadda waxaan kala saari karnaa qorshe kasta kuwa ay soo saartay PostgreSQL.
  • falanqaynta saxda ah ee qanjidhada firfircoon - CTE Scan, InitPlan, Qorshe-hoosaad
  • falanqaynta qaybinta kaydka - meesha laga akhriyo boggaga xogta laga soo bilaabo xusuusta, meesha laga soo galo kaydka maxaliga ah, halka laga soo qaado diskka
  • helay cad
    Si aan loo "qodin" waxaas oo dhan ee log, laakiin si aad u aragto "xiriirka ugu liita" isla markiiba sawirka.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Waxaan helnay wax sidan oo kale ah, oo ay ku jiraan muujinta syntax. Laakiin sida caadiga ah horumariyayaasheenu kuma shaqeeyaan matalaad dhammaystiran ee qorshaha, laakiin leh mid ka gaaban. Ka dib oo dhan, waxaan horey u soo saarnay dhammaan tirooyinka oo ku tuurnay bidix iyo midig, dhexdana waxaan ka tagnay oo kaliya xariiqda koowaad, nooca noodu waa: CTE Scan, CTE Gene ama Seq Scan sida ku cad calaamadda.

Tani waa matalaadda la soo gaabiyay ee aan ugu yeerno template qorshe.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Maxaa kale oo ku habboon lahaa? Way ku habboonaan lahayd in la arko saamiga wakhtigayaga guud loo qoondeeyay noodhka - oo kaliya "ku dheji" dhinaca shaxda pie.

Waxaan farta ku fiiqeynaa noodhka oo aragnaa - waxay soo baxday in Seq Scan uu qaatay wax ka yar rubuc wadarta wakhtiga, inta soo hartayna 3/4 waxaa qaaday CTE Scan. Naxdin! Tani waa qoraal yar oo ku saabsan "heerka dabka" ee CTE Scan haddii aad si firfircoon ugu isticmaasho su'aalahaaga. Aad uma degdegsana - way ka hooseeyaan xitaa iskaanka miiska caadiga ah. [maqaal] [maqaal]

Laakiin sida caadiga ah jaantusyada noocan oo kale ah waa kuwo aad u xiiso badan, aad u adag, marka aan isla markiiba tilmaamno qayb oo aan aragno, tusaale ahaan, in ka badan kala badh wakhtiga Seq Scan qaar ka mid ah "cunay". Waxaa intaa dheer, waxaa jiray nooc ka mid ah Filter gudaha, rikoodho badan ayaa la tuuray si waafaqsan ... Waxaad si toos ah u tuuri kartaa sawirkan horumarinta oo waxaad tidhaahdaa: "Vasya, wax walba waa kuu xun yihiin halkan! Bal qiyaas, bal eeg - waxbaa khaldan!

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Dabcan, waxaa jiray qaar ka mid ah "rakes" ku lug lahaa.

Waxa ugu horreeya ee aan la kulannay waxay ahayd dhibaatada wareegga. Wakhtiga noodhka shakhsi ahaaneed ee qorshaha waxa lagu tilmaamay sax ahaan 1 μs. Marka tirada wareegyada noodu ay dhaafto, tusaale ahaan, 1000 - ka dib fulinta PostgreSQL ayaa loo qaybiyay "si sax ah", ka dib marka dib loo xisaabiyo waxaan helnaa wadarta waqtiga "meel u dhaxaysa 0.95ms iyo 1.05ms". Marka ay tiradu gasho ilbiriqsiyo-ilbiriqsi, taasi waa caadi, laakiin marka ay hore u tahay [milli] ilbiriqsi, waa inaad xisaabtan ku dartaa macluumaadkan marka aad "fureyso" agabka qanjidhada qorshaha "yaa cunay intee le'eg"

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Qodobka labaad, oo aad u adag, waa qaybinta kheyraadka (qalabkaas) oo u dhexeeya noodhadhka firfircoon. Tani waxay nagu kacday 2da toddobaad ee ugu horreeya tusaalaha iyo 4 toddobaad oo kale.

Aad bay u fududahay in la helo dhibaatada noocan oo kale ah - waxaanu samaynaa CTE waxaana loo malaynayaa in aan wax ku akhrino. Dhab ahaantii, PostgreSQL waa "caqli" oo si toos ah waxba ugama akhrin doono halkaas. Dabadeedna waxaynu ka qaadanaynaa rikoodhkii ugu horreeyay, oo boqol iyo kii horeba isla CTE-da.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Waxaan eegnaa qorshaha oo aan fahamsanahay - waa wax lala yaabo, waxaan haynaa 3 kayd (bogag xogeed) "lagu cunay" Seq Scan, 1 dheeraad ah CTE Scan, iyo 2 kale oo ah CTE Scan labaad. Taasi waa, haddii aan si fudud wax walba u soo koobno, waxaan heli doonnaa 6, laakiin kaniiniga waxaan akhrineynaa kaliya 3! CTE Scan meelna kama akhriyo, laakiin waxay si toos ah ula shaqaysaa xusuusta habka. Taasi waa, wax si cad u khaldan halkan!

Dhab ahaantii, waxaa soo baxday in halkan ay ku yaalliin dhammaan 3-da bog ee xogta laga codsaday Seq Scan, marka hore 1 ayaa la waydiiyay 1aad CTE Scan, ka dibna 2nd, iyo 2 kale ayaa loo akhriyay. Taasi waa, wadar ahaan. 3 bog ayaa la akhriyay xogta, ma aha 6.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Oo sawirkani wuxuu noo horseeday fahamka in fulinta qorshaha uusan ahayn geed, laakiin si fudud nooc ka mid ah garaafyada acyclic. Oo waxaan helnay jaantus kan oo kale ah, si aan u fahamno "waxa ka yimid halkee markii hore." Taasi waa, halkan waxaan ka abuurnay CTE ka pg_class, oo waydiisanay laba jeer, ku dhawaad ​​​​dhammaan waqtigayagu wuxuu ku qaatay laanta markii aan waydiisanay mar 2aad. Waxaa cad in akhrinta gelitaanka 101aad ay aad uga qaalisan tahay akhrinta gelitaanka 1aad ee kiniinka.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Cabbaar ayaanu neefsannay. Waxay yiraahdeen: "Hadda, Neo, waad taqaan kung fu! Hadda waayo-aragnimadayadu waxay ku habboon tahay shaashaddaada. Hadda waad isticmaali kartaa." [maqaal]

Isku-darka Log

1000ka horumariye eeyada ayaa neefsaday neef nasasho leh. Laakiin waxaan fahamsanahay in aan haysano oo kaliya boqolaal ka mid ah server-yada "dagaalka", iyo dhammaan "koobi-koobi" ee qaybta horumariyayaashu ma aha mid ku habboon. Waxaan garwaaqsanay in aan nafteena aruurinay.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Guud ahaan, waxaa jira module caadi ah oo ururin kara tirakoobyada, si kastaba ha ahaatee, waxay sidoo kale u baahan tahay in la dhaqaajiyo qaabeynta - tani module pg_stat_statements. Laakiin naguma uu habboonayn.

Marka hore, waxay ku meelaysaa su'aalo isku mid ah iyadoo la isticmaalayo nidaamyo kala duwan oo isku mid ah xogta QueryIds kala duwan. Taasi waa, haddii aad marka hore sameyso SET search_path = '01'; SELECT * FROM user LIMIT 1;ka dibna SET search_path = '02'; iyo codsi isku mid ah, markaa tirakoobka cutubkani wuxuu lahaan doonaa diiwaanno kala duwan, mana awoodi doono inaan ururiyo tirakoobka guud gaar ahaan macnaha guud ee codsigan, iyada oo aan tixgelineynin qorshayaasha.

Qodobka labaad ee inaga diiday isticmaalkiisa ayaa ah qorshe la'aan. Taasi waa, ma jiro qorshe, waxaa jira oo kaliya codsiga laftiisa. Waxaan aragnaa waxa gaabinayey, laakiin ma fahmin sababta. Oo halkan waxaan ku soo laabaneynaa dhibaatada xogta xogta si degdeg ah isu beddelaysa.

Iyo daqiiqada ugu dambeysa - la'aanta "xaqiiqda". Taasi waa, kama hadli kartid tusaale gaar ah oo fulinta weydiinta - ma jiro, kaliya waxaa jira tirokoob la isku daray. In kasta oo ay suurtagal tahay in tan laga shaqeeyo, haddana aad bay u adag tahay.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Sidaa darteed, waxaan go'aansanay inaan la dagaalanno nuqul-koobidda oo aan bilownay qoraal ururiye.

Ururiyahu waxa uu ku xidhaa SSH, waxa uu xidhidh aamin ah la sameeyaa serfarka oo wata kaydka xogta isaga oo isticmaalaya shahaado tail -F "ku dheggan" ee ku jira faylka log. Haddaba fadhigan Waxaan helnaa "muraayad" dhamaystiran oo dhan faylka log, kaas oo server-ku soo saaro. Culayska ku jira server-ka laftiisa ayaa ah mid aad u yar, sababtoo ah waxba kuma kala soocno, waxaan kaliya muraayad u nahay taraafikada.

Maadaama aan horayba u bilownay qorista is dhexgalka ee Node.js, waxaan sii wadnay inaan ku qorno aruuriyaha dhexdiisa. Tignoolajiyadanina lafteedu waxay xaq u leedahay, sababtoo ah aad bay ugu habboon tahay in la isticmaalo JavaScript si loogu shaqeeyo xogta qoraalka daciifka ah, taas oo ah log. Iyo kaabayaasha Node.js laftiisa sida madal dhabarka ah ayaa kuu oggolaanaysa inaad si fudud oo habboon ula shaqeyso isku xirka shabakada, iyo runtii xog kasta oo xog ah.

Sidaa darteed, waxaan "fidinnaa" laba xiriiriye: kan ugu horreeya ee "dhegeysan" log laftiisa oo aan u qaadno nafteena, iyo tan labaad si aan u waydiino saldhigga. "Laakin loggu wuxuu muujinayaa in calaamadda oid 123 ay xanniban tahay," laakiin tani macnaheedu maaha horumariyaha, wayna fiicnaan lahayd in la waydiiyo xogta, "Waa maxay OID = 123 si kastaba?" Oo sidaas daraaddeed waxaan si xilliyo ah weydiiyo saldhigga waxa aynaan weli ka ogayn nafteena.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

"Waxaa jira hal shay oo kaliya oo aadan xisaabta ku darin, waxaa jira nooc ka mid ah shinni-maroodiga oo kale ah!..." Waxaan bilownay horumarinta nidaamkan markii aan rabnay inaan la soconno 10 server. Fahamkeena ugu xasaasisan, oo ay ka dhasheen dhibaatooyin ay adagtahay in wax laga qabto. Laakiin inta lagu guda jiro rubuci hore, waxaan helnay boqol si loo kormeero - sababtoo ah nidaamku wuu shaqeeyay, qof kastaa wuu rabay, qof kastaa wuu raaxaystay.

Waxaas oo dhan waxay u baahan yihiin in lagu daro, socodka xogtu waa mid weyn oo firfircoon. Dhab ahaantii, waxa aan la soconno, waxa aan la macaamili karno, waa waxa aan isticmaalno. Waxaan sidoo kale u isticmaalnaa PostgreSQL sida kaydinta xogta. Mana jiraan wax ka dhaqso badan in lagu "ku shubo" xogta dhexdeeda marka loo eego hawlwadeenka COPY Weli ma aha.

Laakiin si fudud "ku shubidda" xogta runtii maaha tignoolajiyadayada. Sababtoo ah haddii aad haysato ku dhawaad ​​​​50k codsi ilbiriqsi kasta boqol server, markaa tani waxay dhalin doontaa 100-150GB ee logs maalintii. Sidaa darteed, waxay ahayd inaan si taxadar leh u "gooyno" saldhigga.

Marka hore, waan sameynay qaybsanaan maalintii, sababtoo ah, guud ahaan, qofna ma xiisaynayo xidhiidhka ka dhexeeya maalmaha. Maxay ku kala duwan yihiin waxa aad shalay haysay, haddii caawa aad soo saartay nooc cusub oo arjiga - iyo haddaba qaar ka mid ah tirokoobyo cusub.

Marka labaad, waxaan barannay (waa la qasbay) aad iyo aad u degdeg ah in la qoro isticmaalaya COPY. Taasi waa, kaliya maaha COPYwaayo wuu ka dheereeyaa INSERT, iyo xitaa dhakhso badan.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Qodobka saddexaad - waa inaan iska daa kiciyeyaasha, siday u kala horreeyaan, iyo furayaasha shisheeye. Taasi waa, ma lihin daacadnimada tixraaca gabi ahaanba. Maxaa yeelay, haddii aad haysatid miis ay ku jiraan labo FK, oo aad ku tiraahdo qaab-dhismeedka database-ka "halkan waxaa ku yaal diiwaanka diiwaanka ee FK, tusaale ahaan, koox rikoodh ah," ka dib markaad geliso, PostgreSQL ma jirto wax ka haray oo aan ahayn sidii loo qaadan lahaa oo si daacad ah loogu samayn lahaa SELECT 1 FROM master_fk1_table WHERE ... Aqoonsiga aad isku dayayso inaad geliso - kaliya si aad u hubiso in diiwaankani yaallo, inaadan "jabin" furahan shisheeye markaad geliso.

Halkii laga heli lahaa hal diiwaan oo miiska bartilmaameedka ah iyo tusmooyinkiisa, waxaan ka helnaa faa'iidada dheeriga ah ee akhrinta dhammaan jaantusyada ay tilmaamayso. Laakiin uma baahnid tan gabi ahaanba - shaqadeenu waa in aan duubno sida ugu badan ee suurtogalka ah iyo sida ugu dhakhsaha badan ee suurtogalka ah iyada oo la adeegsanayo culeyska ugu yar. Markaa FK - hoos!

Qodobka xiga waa isku-dar iyo xashiish. Markii hore, waxaan ku hirgelinay xogta macluumaadka - ka dib oo dhan, way ku habboon tahay isla markiiba, marka rikoodhku yimaado, ku samee nooc ka mid ah kiniinka "oo lagu daray hal" midigta kicinta. Hagaag, way ku habboon tahay, laakiin isla shay xun - waxaad gelisaa hal rikoodh, laakiin waxaa lagu qasbay inaad akhrido oo aad wax kale ka qorto miis kale. Intaa waxaa dheer, ma aha oo kaliya inaad wax akhrido oo qorto, waxaad sidoo kale sameysaa mar kasta.

Hadda ka soo qaad inaad haysatid miis aad si fudud u tirinayso tirada codsiyada soo martay martigeliyaha gaarka ah: +1, +1, +1, ..., +1. Adiguna, mabda 'ahaan, uma baahnid tan - dhammaan waa suurtagal wadarta xusuusta ku saabsan ururiyaha oo hal mar ugu soo dir database-ka +10.

Haa, haddii ay jiraan dhibaatooyin qaar, daacadnimadaada macquulka ah ayaa laga yaabaa inay "kala go'do", laakiin tani waa kiis aan macquul ahayn - sababtoo ah waxaad leedahay server caadi ah, wuxuu leeyahay batari koontaroolaha, waxaad haysataa log macaamil ganacsi, log on the nidaamka file... Guud ahaan, ma u qalantaa. Luminta wax soo saarka ee aad ka hesho kiciyayaasha ordaya/FK maaha mid u qalma kharashka aad gasho.

Waxa la mid ah xashiishada. Codsi gaar ah ayaa kuu duulaya, waxaad ka xisaabinaysaa aqoonsi gaar ah kaydka kaydka, u qor kaydka xogta ka dibna qof walba u sheeg. Wax walba waa hagaagsan yihiin ilaa, waqtiga duubista, qof labaad ayaa kuu imaanaya kaas oo raba inuu duubo wax la mid ah - oo aad xannibto, tani waa horeba xun. Sidaa darteed, haddii aad u wareejin karto jiilka qaar ka mid ah aqoonsiga macmiilka (marka loo eego xogta xogta), way fiicantahay inaad tan sameyso.

Way ku fiicnayd inaan MD5 ka isticmaalno qoraalka - codsi, qorshe, qaab,... Waxaan ku xisaabinaynaa dhinaca ururiyaha, oo "ku shub" aqoonsiga diyaarsan ee kaydka. Dhererka MD5 iyo qaybinta maalinlaha ah ayaa noo ogolaanaysa in aynaan ka welwelin shilalka suurtagalka ah.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Laakin si aan waxan oo dhan dhaqso ugu duubno, waxaan u baahnay in aan wax ka bedelno habka duubista laftiisa.

Sidee baad inta badan u qortaa xogta? Waxaan haynaa nooc ka mid ah xog-ururinta, waxaanu u kala qaybinay dhawr jadwal, ka dibna koobi-qaadi - marka hore galitaanka koowaad, ka dibna ta labaad, galay ta saddexaad. si isdaba joog ah. Aan fiicnayn Si degdeg ah ma loo samayn karaa? Karaa!

Si tan loo sameeyo, waa ku filan oo kaliya in la kala gooyo qulqulka kuwaas oo isbarbar socda midba midka kale. Waxaa soo baxday in aan hayno khaladaad, codsiyo, qaab-dhismeedka, xannibaadaha, ... duulista dunta kala duwan - waxaanan u qornaa dhammaan si siman. Ku filan tan kanaalka COPY si joogto ah ugu fur miis kasta oo bartilmaameedka ah.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Taasi waa, xagga ururiyaha had iyo jeer waxaa jira durdur, kaas oo aan ku qori karo xogta aan u baahanahay. Laakin si database-ku u arko xogtan, oo qofna aanu ugu dhegtaagnayn sugitaanka xogtan in la qoro, COPY waa in la hakiyaa waqtiyo gaar ah. Annaga, muddada ugu waxtarka badan waxay ahayd qiyaastii 100ms - waanu xidhnay oo isla markiiba mar kale u furnaa isla miiska. Oo haddii aynaan ku filnayn hal socodka inta lagu jiro meelaha ugu sarreeya, markaa waxaan samaynaa isku-dubarid ilaa xad go'an.

Intaa waxaa dheer, waxaan ogaanay in muuqaalka culeyska noocaas ah, isku-dar kasta, marka diiwaannada lagu ururiyo dufcad, ay shar u tahay. Xumaan Classic waa INSERT ... VALUES iyo 1000 kale oo diiwaan. Sababtoo ah markaa waxaad haysataa qoraalka ugu sarreeya ee warbaahinta, iyo qof kasta oo kale oo isku dayaya inuu wax ku qoro diskka ayaa sugaya.

Si aad uga takhalusto cilladaha noocaas ah, si fudud ha isku darin waxba, haba yaraatee ha isku dayin. Iyo haddii bakhtiinta saxanka ay dhacdo (nasiib wanaag, Stream API ee Node.js ayaa kuu oggolaanaysa inaad ogaato) - dib u dhig xidhiidhkan. Marka aad hesho dhacdo in ay xor tahay mar kale, ka soo qor safka la ururiyey. Iyo inta ay mashquul tahay, ka soo qaad midka xiga ee bilaashka ah barkadda oo u qor.

Kahor intaanan soo bandhigin habkan duubista xogta, waxaan haysanay ku dhawaad ​​​​4K qor ops, sidaas ayaananu culeyska u yareynay 4 jeer. Hadda waxay koreen 6 jeer oo kale sababtoo ah xog-ururin cusub oo la kormeeray - ilaa 100MB/s. Hadda waxaan ku kaydinay diiwaannada 3dii bilood ee ugu dambeeyay mug dhan 10-15TB, annagoo rajaynayna in saddex bilood gudahood horumariye kasta uu awoodo inuu xalliyo dhibaato kasta.

Waan fahamsanahay dhibaatooyinka

Laakiin si fudud u ururinta xogtan oo dhan waa mid wanaagsan, faa'iido leh, ku habboon, laakiin kuma filna - waxay u baahan tahay in la fahmo. Sababtoo ah kuwani waa malaayiin qorshayaal oo kala duwan maalintii.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Laakin malaayiin lama maarayn karo, waa in aan marka hore samaynaa "kayar". Iyo, ugu horreyntii, waxaad u baahan tahay inaad go'aansato sida aad u habayn doonto tan "ka yar".

Waxaan soo saarnay saddex qodob oo muhiim ah:

  • yaa diray codsigan
    Taasi waa, codsigee ayuu "ka yimid": interface web, backend, nidaamka lacag bixinta ama wax kale.
  • halkaas oo way dhacday
    Waa maxay server-ka gaarka ah? Sababtoo ah haddii aad haysato dhowr server oo hal codsi ah, oo si lama filaan ah mid ka mid ah "nacasnimo" (sababtoo ah "diskigu waa qudhun", "xusuusta oo daatay", dhibaato kale), markaa waxaad u baahan tahay inaad si gaar ah wax uga qabato serverka.
  • sida dhibaatadu si uun bay isu muujisay

Si loo fahmo "yaa" codsi noo soo diray, waxaanu isticmaalnaa qalab caadi ah - dejinta doorsoome kalfadhi: SET application_name = '{bl-host}:{bl-method}'; - Waxaan u dirnaa magaca martigeliyaha macquulka ah ee ganacsiga kaas oo codsigu ka imanayo, iyo magaca habka ama codsiga bilaabay.

Ka dib markii aan ka gudubno "milkiilaha" codsiga, waa in lagu soo saaraa log - tan waxaan u habeyneynaa doorsoomaha log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Kuwa xiisaynaya, malaha eeg buug-gacmeedkamaxaa laga wadaa. Waxaa soo baxday in aan ku aragno log:

  • время
  • habka iyo aqoonsiga macaamil ganacsi
  • magaca database
  • IP-ga qofka soo diray codsigan
  • iyo habka magaca

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Kadib waxaan ogaanay in aysan aad u xiiso badaneyn in la eego isku xirnaanta hal codsi oo ka dhexeeya server-yada kala duwan. Inta badan ma aha in aad haysato xaalad uu hal codsi halkan iyo halkaas si isku mid ah isugu xidho. Laakiin xitaa haddii ay isku mid tahay, fiiri mid ka mid ah server-yadan.

Markaa waa kan goynta "hal server - hal maalin" waxaa noo soo baxday in ay nagu filan tahay falanqayn kasta.

Qaybta falanqaynta koowaad waa isku mid "Sample" - qaab la soo gaabiyey oo ah soo jeedinta qorshaha, oo laga saaray dhammaan tilmaamayaasha tirada. Goynta labaad waa codsiga ama habka, gooynta saddexaadna waa noodhka qorshaha gaarka ah ee noo keenay dhibaatooyin.

Markii aan ka guurnay tusaalooyin gaar ah una guurnay qaab-dhismeedka, waxaan helnay laba faa'iidooyin hal mar:

  • hoos u dhac badan oo ku yimid tirada walxaha si loo gorfeeyo
    Waa inaan ku falanqeynno dhibaatada kumanaan su'aalo ama qorshayaal ah, laakiin aan ku falanqeyno daraasiin qaab-dhismeedka.
  • waqtiga
    Taasi waa, adoo soo koobaya "xaqiiqda" gudaha qayb gaar ah, waxaad muujin kartaa muuqaalkooda inta lagu jiro maalinta. Oo halkan waxaad fahmi kartaa in haddii aad leedahay nooc ka mid ah qaab-dhismeedka dhacaya, tusaale ahaan, hal mar saacaddii, laakiin waa in ay dhacdo hal mar maalintii, waa in aad ka fikirto waxa khaldamay - cidda keentay iyo sababta, laga yaabaa in ay tahay halkan. ma aha. Kani waa hab kale oo aan tiro ahayn, muuqaal keliya, oo ah habka falanqaynta.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Hababka soo haray waxay ku saleysan yihiin tilmaamayaasha aan ka soo saarno qorshaha: inta jeer ee qaabkan oo kale dhacay, wadarta iyo celceliska waqtiga, inta xogta laga akhriyay saxanka, iyo inta laga soo qaatay xusuusta...

Sababtoo ah, tusaale ahaan, waxaad u timid bogga falanqaynta ee martigeliyaha, fiiri - wax ayaa bilaabaya in wax badan lagu akhriyo diskka. Saxanka ku jira server-ka ma xamili karo - yaa wax ka akhriya?

Oo waxaad ku kala sooci kartaa tiir kasta oo aad go'aan ka gaari kartaa waxa aad hadda la macaamili doonto - culeyska ku jira processor-ka ama diskka, ama tirada guud ee codsiyada soo saaray nooc cusub oo arjiga.
[muxaadaro muuqaal ah]

Isla markiiba waxaad arki kartaa codsiyo kala duwan oo la socda template isku mid ah codsi sida SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... Oo waxaad la yaaban tahay sababta habayntu u akhrinayso isticmaalaha haddii aanu la falgelin isaga.

Habka ka soo horjeeda waa in isla markiiba laga arko codsiga waxa uu qabanayo. Tusaale ahaan, xaga hore waa kan, kan, kan, iyo kan saacadiiba mar (wakhtigu wuu caawiyaa). Su'aashuna waxay isla markiiba soo baxaysaa: waxay u muuqataa in aanay ahayn shaqada horudhac in ay wax qabato saacaddiiba hal mar ...

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Muddo ka dib, waxaan ogaanay in ay naga maqan tahay isku-darka statistics by noodes qorshe. Waxaan ka soocay qorshooyinka kaliya kuwa noodhka ah ee wax ku sameeya xogta miisaska laftooda (ku akhri/ku qoraan index ama ha ku qorin). Dhab ahaantii, hal dhinac oo kaliya ayaa lagu daray marka loo eego sawirkii hore - Immisa diiwaan ayaa noo keenay?, iyo inta la tuuray (Safka laga saaray Filter).

Ma haysatid tusaha ku habboon saxanka, waxaad codsi u dirtaa, way duulaysaa tusaha, waxay ku dhacdaa Seq Scan ... waxaad sifaysay dhammaan diiwaannada marka laga reebo hal. Maxaad ugu baahan tahay 100M diiwaanno la sifeeyay maalintii?

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Markaan falanqeynay dhammaan qorshooyinka nood by noode, waxaan ogaanay inay jiraan qaab-dhismeedyo caadi ah oo qorshayaasha ah kuwaas oo ay u badan tahay inay u muuqdaan kuwo laga shakiyo. Oo way fiicnaan lahayd inaad u sheegto horumariyaha: "Saaxiib, halkan marka hore waxaad akhridaa index, ka dibna kala sooc, ka dibna gooyaa" - sida caadiga ah, waxaa jira hal rikoodh.

Qof kasta oo su'aalo soo qoray ayaa laga yaabaa inuu la kulmay qaabkan: "Isii dalabka ugu dambeeya ee Vasya, taariikhdeeda." Oo haddii aadan haysan tusaha taariikhda, ama aysan jirin taariikh ku jirta tusaha aad isticmaashay, markaa waxaad ku tallaabso isla “qaadis” .

Laakiin waxaan ognahay in tani ay tahay "qaadis" - markaa sababta aadan isla markiiba u sheegin horumariyaha waxa ay tahay inuu sameeyo. Sidaa darteed, marka la furayo qorshaha hadda, horumariyaheenu isla markiiba wuxuu arkaa sawir qurux badan oo leh talooyin, halkaas oo ay isla markiiba u sheegaan: "Waxaad dhibaato ku haysaa halkan iyo halkaas, laakiin waxaa lagu xalliyaa habkan iyo habka."

Taasina waxay keentay in khibraddii loo baahnaa si loo xalliyo mashaakil bilowgii iyo hadda aad hoos ugu dhacday. Tani waa nooca qalabka aan haysano.

Hagaajinta badan ee weydiimaha PostgreSQL. Kirill Borovikov (Tensor)

Source: www.habr.com

Add a comment