Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Cuireann an tuarascáil roinnt cur chuige i láthair a cheadaíonn monatóireacht a dhéanamh ar fheidhmíocht fiosrúcháin SQL nuair a bhíonn na milliúin acu in aghaidh an lae, agus tá na céadta freastalaithe PostgreSQL monatóireacht orthu.

Cad iad na réitigh theicniúla a ligeann dúinn méid faisnéise den sórt sin a phróiseáil go héifeachtach, agus conas a dhéanann sé seo saol gnáthfhorbróra níos éasca?


Cé a bhfuil suim aige? anailís ar fhadhbanna sonracha agus teicnící éagsúla leas iomlán a bhaint Ceisteanna SQL agus fadhbanna tipiciúil DBA a réiteach i PostgreSQL - is féidir leat freisin léamh sraith alt ar an ábhar seo.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)
Kirill Borovikov is ainm dom, is ionann mise Cuideachta teannasóra. Go sonrach, speisialtóireacht mé ag obair le bunachair shonraí inár gcuideachta.

Inseoidh mé duit inniu conas a dhéanfaimid fiosrúcháin a bharrfheabhsú, nuair nach gá duit “piocadh as a chéile” a dhéanamh ar fheidhmíocht aon cheiste amháin, ach an fhadhb a réiteach en masse. Nuair a bhíonn na milliúin na n-iarratas, agus is gá duit a fháil ar roinnt cur chuige maidir le réiteach an fhadhb mhór seo.

Go ginearálta, tá Tensor le haghaidh milliún dár gcliaint Is é VLSI ár n-iarratas: líonra sóisialta corparáideach, réitigh físchumarsáide, do shreabhadh doiciméad inmheánach agus seachtrach, córais chuntasaíochta do chuntasaíocht agus stórais,... Is é sin, “mega-comhcheangail” den sórt sin le haghaidh bainistíochta gnó comhtháite, ina bhfuil níos mó ná 100 difriúil tionscadail inmheánacha.

Chun a chinntiú go n-oibríonn agus go bhforbróidh siad go léir de ghnáth, tá 10 n-ionad forbartha againn ar fud na tíre, agus níos mó acu iontu 1000 forbróirí.

Táimid ag obair le PostgreSQL ó 2008 i leith agus tá cuid mhór den méid a phróiseálaimid carntha againn - sonraí cliant, sonraí staidrimh, anailíse, sonraí ó chórais faisnéise seachtracha - níos mó ná 400TB. Tá thart ar 250 freastalaí i dtáirgeadh amháin, agus san iomlán tá thart ar 1000 freastalaí bunachar sonraí a ndéanaimid monatóireacht orthu.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Is teanga dhearbhaithe é SQL. Déanann tú cur síos ní “conas” ar cheart do rud éigin oibriú, ach “cad” ba mhaith leat a bhaint amach. Tá a fhios níos fearr ag an DBMS conas JOIN a dhéanamh - conas do tháblaí a nascadh, cad iad na coinníollacha le forchur, cad a rachaidh tríd an innéacs, cad nach ...

Glacann roinnt DBMS le leideanna: “Ní hea, ceangail an dá tábla seo i scuaine dá leithéid,” ach ní féidir le PostgreSQL é seo a dhéanamh. Seo é seasamh comhfhiosach na bhforbróirí mór le rá: “B’fhearr linn an t-uasmhéadaitheoir iarratais a chríochnú ná ligean d’fhorbróirí leideanna de chineál éigin a úsáid.”

Ach, in ainneoin nach ligeann PostgreSQL don “lasmuigh” é féin a rialú, ceadaíonn sé go foirfe féach cad atá ar siúl laistigh dónuair a ritheann tú do cheist, agus nuair a bhíonn fadhbanna aige.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Go ginearálta, cad iad na fadhbanna clasaiceacha a thagann le forbróir [go DBA] de ghnáth? “Seo chomhlíonamar an t-iarratas, agus tá gach rud mall linn, tá gach rud ar crochadh, tá rud éigin ag tarlú... Trioblóid de shaghas éigin!”

Tá na cúiseanna beagnach i gcónaí mar an gcéanna:

  • algartam fiosrúcháin neamhéifeachtach
    Forbróir: “Anois tá mé ag tabhairt 10 táblaí dó i SQL trí JOIN...” - agus tá sé ag súil go mbeidh a choinníollacha “neamhcheangailte” go míorúilteach agus gheobhaidh sé gach rud go tapa. Ach ní tharlaíonn míorúiltí, agus tugann aon chóras le héagsúlacht den sórt sin (10 táblaí i gceann FROM) earráid de chineál éigin i gcónaí. [airteagal]
  • staitisticí nach mbaineann le hábhar
    Tá an pointe seo an-ábhartha go sonrach do PostgreSQL, nuair a “doirt tú” tacar sonraí mór ar an bhfreastalaí, iarratas a dhéanamh, agus déanann sé “sexcanits” do tháibléad. Toisc go raibh 10 dtaifead ann inné, agus inniu tá 10 milliún ann, ach níl PostgreSQL fós ar an eolas faoi seo, agus ní mór dúinn é a insint faoi. [airteagal]
  • "breiseán" ar acmhainní
    Tá bunachar sonraí mór luchtaithe agat ar fhreastalaí lag nach bhfuil go leor feidhmíochta diosca, cuimhne nó próiseálaí aige. Agus sin uile... Áit éigin tá uasteorainn feidhmíochta os a chionn nach féidir leat léim a thuilleadh.
  • ag blocáil
    Is pointe deacair é seo, ach tá siad an-ábhartha le haghaidh fiosruithe modhnuithe éagsúla (INSERT, Update, DELETE) - is ábhar mór ar leith é seo.

Ag fáil plean

...Agus do gach rud eile againn plean de dhíth! Ní mór dúinn a fheiceáil cad atá ag tarlú taobh istigh den fhreastalaí.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Is crann den algartam feidhmithe fiosrúcháin i léiriú téacs é plean feidhmithe fiosrúcháin do PostgreSQL. Is é an t-algartam go beacht a fuarthas, mar thoradh ar anailís a rinne an pleanálaí, a bheith ar an gceann is éifeachtaí.

Is oibríocht é gach nód crann: sonraí a aisghabháil ó thábla nó ó innéacs, ag tógáil léarscáil ghiotán, ag nascadh dhá thábla, ag nascadh, ag trasnú, nó ag eisiamh roghnúcháin. Is éard atá i gceist le fiosrúchán a dhéanamh ná siúl trí nóid an chrainn seo.

Chun an plean fiosrúcháin a fháil, is é an bealach is éasca an ráiteas a fhorghníomhú EXPLAIN. Chun a fháil le gach tréithe fíor, is é sin, a fhorghníomhú i ndáiríre ceist ar an mbonn - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

An chuid dona: nuair a ritheann tú é, tarlaíonn sé "anseo agus anois", mar sin níl sé oiriúnach ach le haghaidh dífhabhtaithe áitiúla. Má ghlacann tú freastalaí an-lódáilte atá faoi shreabhadh láidir athruithe sonraí, agus má fheiceann tú: “Ó! Anseo ní mór dúinn a fhorghníomhú mallXia iarratas." Leath uair an chloig, uair an chloig ó shin - agus tú ag rith agus ag fáil an iarratais seo ó na logaí, á thabhairt ar ais chuig an bhfreastalaí, d'athraigh do thacair sonraí iomlán agus staitisticí. Ritheann tú é chun dífhabhtaithe - agus ritheann sé go tapa! Agus ní féidir leat a thuiscint cén fáth, cén fáth bhí go mall.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

D'fhonn tuiscint a fháil ar cad a tharla go díreach i láthair na huaire nuair a fhorghníomhaíodh an t-iarratas ar an bhfreastalaí, scríobh daoine cliste modúl auto_explain. Tá sé i láthair i mbeagnach gach dáiltí PostgreSQL is coitianta, agus is féidir é a ghníomhachtú go simplí sa chomhad cumraíochta.

Má thuigeann sé go bhfuil iarratas éigin ag rith níos faide ná an teorainn a d'inis tú dó, déanann sé amhlaidh “pictiúr” de phlean an iarratais seo agus scríobhann sé le chéile iad sa loga.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Is cosúil go bhfuil gach rud ceart go leor anois, téann muid go dtí an logáil isteach agus feicimid ann... [text footcloth]. Ach ní féidir linn aon rud a rá faoi, ach amháin gur plean iontach é mar gur thóg sé 11ms le cur i gcrích.

Is cosúil go bhfuil gach rud go breá - ach níl aon rud soiléir cad a tharla i ndáiríre. Seachas an t-am ginearálta, ní fheicimid rud ar bith i ndáiríre. Toisc nach bhfuil breathnú ar a leithéid de “uan” de ghnáth-théacs radharcach go hiondúil.

Ach fiú mura bhfuil sé soiléir, fiú má tá sé deacair, tá fadhbanna níos bunúsaí ann:

  • Léiríonn an nód suim na n-acmhainní an subtree ar fad faoi ​​dó. Is é sin le rá, ní féidir leat a fháil amach cé mhéad ama a caitheadh ​​ar an Scanadh Innéacs áirithe seo má tá riocht neadaithe éigin faoi. Ní mór dúinn breathnú go dinimiciúil féachaint an bhfuil “leanaí” agus athróga coinníollach, CTEanna taobh istigh - agus é seo go léir a dhealú “inár n-intinn”.
  • An dara pointe: is é an t-am a léirítear ar an nód am forghníomhaithe nód singil. Má rinneadh an nód seo a fhorghníomhú mar thoradh ar, mar shampla, lúb trí thaifid tábla arís agus arís eile, ansin méadaíonn líon na lúb - timthriallta an nód seo - sa phlean. Ach tá an t-am forghníomhaithe adamhach féin mar a chéile i dtéarmaí plean. Is é sin, chun a thuiscint cé chomh fada agus a rinneadh an nód seo san iomlán, ní mór duit rud amháin a iolrú faoi cheann eile - arís, "i do cheann."

I gcásanna den sórt sin, tuig "Cé hé an nasc is laige?" beagnach dodhéanta. Mar sin, scríobhann fiú na forbróirí iad féin sa “lámhleabhar” sin “Is ealaín é plean a thuiscint nach mór a fhoghlaim, taithí a fháil...”.

Ach tá 1000 forbróir againn, agus ní féidir leat an taithí seo a chur in iúl do gach ceann acu. Mise, tusa, tá a fhios aige, ach níl a fhios ag duine éigin thall ansin a thuilleadh. B'fhéidir go bhfoghlaimeoidh sé, nó b'fhéidir nach mbeidh, ach caithfidh sé oibriú anois - agus cá bhfaigheadh ​​sé an t-eispéireas seo?

Pleanáil léirshamhlú

Dá bhrí sin, thuig muid gur gá dúinn chun déileáil leis na fadhbanna seo léirshamhlú maith ar an bplean. [alt]

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Chuaigh muid "tríd an margadh" ar dtús - breathnaímis ar an Idirlíon féachaint cad atá ann fiú.

Ach d'éirigh sé amach nach bhfuil ach fíorbheagán réitigh "beo" atá ag forbairt a bheag nó a mhór - go litriúil, níl ach ceann amháin: mínigh.depesz.com le Hubert Lubaczewski. Nuair a chuireann tú isteach sa réimse “beatha” léiriú téacs den phlean, taispeánann sé tábla duit leis na sonraí parsáilte:

  • am próiseála an nód féin
  • am iomlán don fhochrann iomlán
  • líon na dtaifead a fuarthas agus a rabhthas ag súil leo go staitistiúil
  • an comhlacht nód féin

Tá an cumas ag an tseirbhís seo freisin cartlann naisc a roinnt. Chaith tú do phlean isteach ansin agus dúirt: "Hey, Vasya, seo nasc, tá rud éigin mícheart ann."

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ach tá fadhbanna beaga ann freisin.

Ar an gcéad dul síos, méid ollmhór “cóip-ghreamú”. Glacann tú píosa den log, greamaigh isteach ann, agus arís, agus arís.

Dara, an gan aon anailís a dhéanamh ar an méid sonraí a léitear — na maoláin chéanna a aschuirtear EXPLAIN (ANALYZE, BUFFERS), ní fheicimid anseo é. Níl a fhios aige conas iad a dhíchóimeáil, iad a thuiscint agus oibriú leo. Agus tú ag léamh go leor sonraí agus go dtuigeann tú go mb'fhéidir go bhfuil tú ag mí-leithdháileadh an diosca agus an taisce chuimhne, tá an fhaisnéis seo an-tábhachtach.

Is é an tríú pointe diúltach ná forbairt an-lag an tionscadail seo. Tá na gealltanais an-bheag, is maith más rud é uair amháin gach sé mhí, agus tá an cód i Perl.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ach is “liricí” é seo go léir, d’fhéadfaimis maireachtáil leis seo ar bhealach éigin, ach tá rud amháin ann a d’iompaigh go mór orainn ón tseirbhís seo. Is earráidí iad seo san anailís ar Slonn Tábla Coiteann (CTE) agus nóid dhinimiciúla éagsúla ar nós InitPlan/SubPlan.

Má chreideann tú an pictiúr seo, ansin is mó am forghníomhaithe iomlán gach nód aonair ná am forghníomhaithe iomlán an iarratais ar fad. Tá sé simplí - níor baineadh am giniúna an CTE seo ón nód Scan CTE. Mar sin, níl an freagra ceart ar eolas againn a thuilleadh maidir le cé chomh fada agus a thóg an scanadh CTE féin.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ansin thuig muid go raibh sé in am ár gcuid féin a scríobh - hurray! Deir gach forbróir: "Anois scríobhfaimid ár gceann féin, beidh sé thar a bheith éasca!"

Ghlacamar stack tipiciúil le haghaidh seirbhísí gréasáin: croí bunaithe ar Node.js + Express, úsáid Bootstrap agus D3.js le haghaidh léaráidí áille. Agus bhí údar maith lenár n-ionchais - fuair muid an chéad fhréamhshamhail i 2 sheachtain:

  • parsálaí plean saincheaptha
    Is é sin, anois is féidir linn aon phlean a pharsáil uathu siúd a ghineann PostgreSQL.
  • anailís cheart ar nóid dhinimiciúla - Scanadh CTE, InitPlan, Fophlean
  • anailís ar dháileadh maoláin - áit a léitear leathanaigh sonraí ón gcuimhne, cén áit ón taisce áitiúil, cén áit ón diosca
  • fuair soiléireacht
    Ionas nach “tochailt” seo go léir sa loga, ach chun an “nasc is laige” a fheiceáil láithreach sa phictiúr.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Fuair ​​​​muid rud mar seo, agus béim ar chomhréir san áireamh. Ach de ghnáth ní oibríonn ár bhforbróirí a thuilleadh le léiriú iomlán ar an bplean, ach le ceann níos giorra. Tar éis an tsaoil, tá na huimhreacha go léir parsáilte againn cheana féin agus iad a chaitheamh ar chlé agus ar dheis, agus sa lár níor fhág muid ach an chéad líne, cén cineál nód atá ann: CTE Scan, giniúint CTE nó Seq Scan de réir comhartha éigin.

Is é seo an léiriú giorraithe a dtugaimid teimpléad plean.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Cad eile a bheadh ​​áisiúil? Bheadh ​​sé áisiúil a fheiceáil cén sciar dár n-am iomlán a dháiltear ar an nód sin - agus gan ach é a “greamaigh” den taobh píchairt.

Dírímid ar an nód agus feicimid - tharla sé gur ghlac Seq Scan níos lú ná an ceathrú cuid den am iomlán, agus ghlac CTE Scan an 3/4 eile. Uafás! Is nóta beag é seo faoin “ráta dóiteáin” de CTE Scan má úsáideann tú iad go gníomhach i do cheisteanna. Níl siad an-tapa - tá siad inferior fiú i scanadh tábla rialta. [alt] [alt]

Ach de ghnáth bíonn léaráidí den sórt sin níos suimiúla, níos casta, nuair a dhíríonn muid láithreach ar mhír agus feicimid, mar shampla, gur “ith níos mó ná leath an ama a d’ith roinnt Seq Scan”. Ina theannta sin, bhí Scagaire de shaghas éigin taobh istigh, caitheadh ​​a lán taifead dá réir... Is féidir leat an pictiúr seo a chaitheamh go díreach chuig an bhforbróir agus a rá: “Vasya, tá gach rud go dona anseo duit! Fíoraigh é, féach - tá rud éigin mícheart!"

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ar ndóigh, bhí roinnt “rácaí” i gceist.

Ba é an chéad rud ar tháinig muid trasna air ná fadhb an shlánaithe. Léirítear am gach nód aonair sa phlean le cruinneas 1 μs. Agus nuair a sháraíonn líon na dtimthriallta nód, mar shampla, 1000 - tar éis é a fhorghníomhú roinn PostgreSQL “laistigh de chruinneas”, ansin nuair a bhíonn ais á ríomh faighte againn an t-am iomlán “áit éigin idir 0.95ms agus 1.05ms”. Nuair a théann an comhaireamh go dtí micreasoicindí, tá sé sin ceart go leor, ach nuair atá sé [milli] soicind cheana féin, caithfidh tú an fhaisnéis seo a chur san áireamh agus acmhainní á “scagadh” le nóid an phlean “cé a d’ídigh cé mhéad”.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Is é an dara pointe, níos casta, ná dáileadh acmhainní (na maoláin sin) i measc nóid dhinimiciúla. Chosain sé seo an chéad 2 sheachtain den fhréamhshamhail dúinn chomh maith le 4 seachtaine eile.

Tá sé éasca go leor fadhb den chineál seo a fháil - déanaimid CTE agus is dóigh go léifimid rud éigin ann. Go deimhin, tá PostgreSQL “cliste” agus ní léifidh sé aon rud go díreach ansin. Ansin tógann muid an chéad taifead uaidh, agus chuige sin an chéad agus an chéad taifead ón CTE céanna.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Breathnaímid ar an bplean agus tuigimid - tá sé aisteach, tá 3 mhaolán (leathanaigh sonraí) “ídithe” againn i Seq Scan, 1 níos mó i CTE Scan, agus 2 eile sa dara Scan CTE. Is é sin, má dhéanaimid suim iomlán, gheobhaidh muid 6, ach ón táibléad ní léim ach 3! Ní léann CTE Scan aon rud ó áit ar bith, ach oibríonn sé go díreach le cuimhne an phróisis. Is é sin, tá rud éigin mícheart go soiléir anseo!

Go deimhin, is cosúil go bhfuil anseo na 3 leathanach sonraí sin go léir a iarradh ó Seq Scan, d'iarr an chéad 1 scanadh CTE, agus ansin léadh an 1ú, agus 2 eile dó. Is é sin, iomlán de Léadh sonraí 2 leathanach, ní 3.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Agus thug an pictiúr seo an tuiscint dúinn nach crann a thuilleadh é plean a chur i gcrích, ach go simplí de shaghas éigin de ghraif thimthriallach. Agus fuair muid léaráid mar seo, ionas go dtuigimid "cad as a tháinig ar an gcéad dul síos." Is é sin, chruthaigh muid CTE ó pg_class anseo, agus d'iarr muid é faoi dhó, agus caitheadh ​​beagnach ár gcuid ama ar fad ar an mbrainse nuair a d'iarr muid é an dara huair. Is léir go bhfuil sé i bhfad níos costasaí an 2ú iontráil a léamh ná an 101ú iontráil ón táibléad a léamh.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Exhaled muid ar feadh tamaill. Dúirt siad: “Anois, Neo, tá a fhios agat kung fu! Anois tá ár dtaithí ceart ar do scáileán. Anois is féidir leat é a úsáid." [alt]

Comhdhlúthú logáil

Bhí osna faoisimh ag ár 1000 forbróir. Ach thuig muid nach bhfuil againn ach na céadta "comhraic" freastalaithe, agus nach bhfuil seo go léir "cóip-greamaigh" ar thaobh na forbróirí áisiúil ar chor ar bith. Thuigeamar go raibh orainn féin é a bhailiú.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Go ginearálta, tá modúl caighdeánach ann ar féidir staitisticí a bhailiú, áfach, ní mór é a chur i ngníomh freisin sa chumraíocht - seo modúl pg_stat_ráitis. Ach ní raibh sé oiriúnach dúinn.

Ar an gcéad dul síos, sannann sé do na ceisteanna céanna ag baint úsáide as scéimeanna éagsúla laistigh den bhunachar sonraí céanna QueryIds éagsúla. Is é sin, má dhéanann tú ar dtús SET search_path = '01'; SELECT * FROM user LIMIT 1;agus ansin SET search_path = '02'; agus an iarraidh chéanna, ansin beidh taifid éagsúla ar staitisticí an mhodúil seo, agus ní bheidh mé in ann staitisticí ginearálta a bhailiú go sonrach i gcomhthéacs phróifíl an iarratais seo, gan na scéimeanna a chur san áireamh.

Is é an dara pointe a chuir cosc ​​orainn é a úsáid easpa pleananna. Is é sin, níl aon phlean ann, níl ann ach an t-iarratas féin. Feicimid cad a bhí ag moilliú, ach ní thuigimid cén fáth. Agus anseo filleann muid ar an bhfadhb a bhaineann le tacar sonraí atá ag athrú go tapa.

Agus an nóiméad deireanach - easpa "facts". Is é sin le rá, ní féidir leat dul i ngleic le cás sonrach de chur i gcrích fiosrúcháin - níl aon cheann ann, níl ann ach staitisticí comhiomlána. Cé gur féidir oibriú leis seo, níl sé ach an-deacair.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Mar sin, shocraigh muid dul i ngleic le cóip-ghreamú agus thosaigh muid ag scríobh bailitheoir.

Nascann an bailitheoir trí SSH, bunaítear nasc slán leis an bhfreastalaí leis an mbunachar sonraí ag baint úsáide as deimhniú, agus tail -F “ceanglaíonn” air sa chomhad loga. Mar sin sa seisiún seo Faighimid “scáthán” iomlán den logchomhad iomlán, a ghineann an freastalaí. Is beag an t-ualach ar an bhfreastalaí féin, toisc nach ndéanaimid aon rud a pharsáil ann, ní dhéanaimid ach an trácht a scáthánú.

Ós rud é go raibh tús curtha againn cheana féin ag scríobh an chomhéadain i Node.js, leanamar ar aghaidh ag scríobh an bhailitheora ann. Agus tá údar maith ag an teicneolaíocht seo, toisc go bhfuil sé an-áisiúil JavaScript a úsáid chun oibriú le sonraí téacs atá formáidithe go lag, agus is é sin an logáil. Agus ligeann bonneagar Node.js féin mar ardán inneall duit oibriú go héasca agus go háisiúil le naisc líonra, agus go deimhin le haon sruthanna sonraí.

Dá réir sin, déanaimid "síneadh" dhá nasc: an chéad cheann "éisteacht" leis an logáil féin agus é a ghlacadh chugainn féin, agus an dara ceann chun an bonn a iarraidh go tréimhsiúil. “Ach léiríonn an logáil go bhfuil an comhartha le oid 123 bactha,” ach ní chiallaíonn sé seo rud ar bith don fhorbróir, agus bheadh ​​​​sé go deas fiafraí den bhunachar sonraí, “Cad é OID = 123 ar aon nós?” Agus mar sin iarraimid go tréimhsiúil ar an mbonn cad nach bhfuil ar eolas againn fúinn féin go fóill.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

“Níl ach rud amháin nár chuir tú san áireamh, tá speiceas beacha cosúil le eilifint ann!..” Thosaigh muid ag forbairt an chórais seo nuair a theastaigh uainn monatóireacht a dhéanamh ar 10 bhfreastalaí. An ceann is tábhachtaí inár dtuiscint, áit ar tháinig roinnt fadhbanna chun cinn a bhí deacair déileáil leo. Ach le linn na chéad ráithe, fuair muid céad le haghaidh monatóireachta - toisc go raibh an córas ag obair, bhí gach duine ag iarraidh é, bhí gach duine compordach.

Ní mór é seo go léir a shuimiú, tá an sreabhadh sonraí mór agus gníomhach. Go deimhin, is é an rud a dhéanaimid monatóireacht, cad is féidir linn déileáil leis, an méid a úsáidimid. Bainimid úsáid freisin as PostgreSQL mar stóráil sonraí. Agus níl aon rud níos tapúla chun sonraí a “doirteadh” isteach ann ná an t-oibreoir COPY Fós.

Ach ní hé ár dteicneolaíocht i ndáiríre sonraí a “dhoirteadh”. Mar má tá thart ar 50k iarratas in aghaidh an tsoicind agat ar céad freastalaithe, ginfidh sé seo 100-150GB de logs in aghaidh an lae. Mar sin, bhí orainn an bonn a “ghearradh” go cúramach.

Ar dtús, rinneamar partitioning in aghaidh an lae, mar, tríd is tríd, níl suim ag aon duine sa chomhghaol idir laethanta. Cén difríocht a dhéanfaidh sé idir an méid a bhí agat inné, má rolladh amach leagan nua den fheidhmchlár anocht - agus roinnt staitisticí nua cheana féin.

Dara dul síos, d'fhoghlaim muid (bhí iachall) an-, an-tapa a scríobh ag baint úsáide as COPY. Is é sin, ní hamháin COPYtoisc go bhfuil sé níos tapúla ná INSERT, agus fiú níos tapúla.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

An tríú pointe - bhí orm triggers thréigean, faoi seach, agus eochracha coigríche. Is é sin, níl aon ionracas tagartha againn ar chor ar bith. Mar má tá tábla agat a bhfuil péire FKanna ann, agus má deir tú i struchtúr an bhunachair shonraí “seo taifead loga a ndéanann FK tagairt dó, mar shampla, do ghrúpa taifead,” ansin nuair a chuireann tú isteach é, PostgreSQL níl aon rud fágtha ach conas é a ghlacadh agus é a dhéanamh go hionraic SELECT 1 FROM master_fk1_table WHERE ... leis an aitheantóir atá tú ag iarraidh a chur isteach - díreach le seiceáil go bhfuil an taifead seo i láthair ansin, nach mbriseann tú an Eochair Eachtrach seo nuair a chuir tú isteach é.

In ionad taifead amháin ar an sprioc-tábla agus a innéacsanna, bainimid tairbhe breise as léamh ó na táblaí go léir dá dtagraíonn sé. Ach níl sé seo de dhíth orainn ar chor ar bith - is é an tasc atá againn ná an oiread agus is féidir a thaifeadadh agus chomh tapa agus is féidir leis an ualach is lú. Mar sin FK - síos!

Is é an chéad phointe eile comhiomlánú agus hashing. Ar dtús, chuireamar i bhfeidhm iad sa bhunachar sonraí - tar éis an tsaoil, tá sé áisiúil láithreach, nuair a thagann taifead, é a dhéanamh i dtáibléad de chineál éigin "móide ceann" ceart sa truicear. Bhuel, tá sé áisiúil, ach an droch-rud céanna - cuireann tú isteach taifead amháin, ach tá iallach ort rud éigin eile a léamh agus a scríobh ó thábla eile. Thairis sin, ní hamháin go léann tú agus a scríobhann tú, ach déanann tú é gach uair freisin.

Anois samhlaigh go bhfuil tábla agat ina ndéanann tú líon na n-iarratas a chuaigh trí ósta ar leith a chomhaireamh: +1, +1, +1, ..., +1. Agus tú, i bprionsabal, nach bhfuil gá seo - tá sé indéanta suim i gcuimhne ar an mbailitheoir agus seol chuig an mbunachar sonraí in aon turas amháin +10.

Sea, i gcás roinnt fadhbanna, féadfaidh do shláine loighciúil “titim as a chéile”, ach is cás beagnach neamhréadúil é seo - toisc go bhfuil gnáthfhreastalaí agat, tá ceallraí aige sa rialtóir, tá logáil idirbheart agat, logáil isteach ar an córas comhaid... Go ginearálta, ní fiú é. Ní fiú an costas a thabhaíonn tú an caillteanas táirgiúlachta a fhaigheann tú ó thriogairí a rith/FK.

Tá sé mar an gcéanna le hashing. Téann iarratas áirithe chugat, ríomhann tú aitheantóir áirithe uaidh sa bhunachar sonraí, scríobhann tú chuig an mbunachar sonraí é agus ansin insíonn tú do gach duine é. Tá gach rud go breá go dtí go dtagann an dara duine chugat ag an am taifeadta atá ag iarraidh an rud céanna a thaifeadadh - agus cuirtear bac ort, agus tá sé seo go dona cheana féin. Dá bhrí sin, más féidir leat giniúint roinnt IDanna a aistriú chuig an gcliant (i gcoibhneas leis an mbunachar sonraí), is fearr é seo a dhéanamh.

Bhí sé foirfe dúinn MD5 a úsáid ón téacs - iarratas, plean, teimpléad,... Déanaimid é a ríomh ar thaobh an bhailitheora, agus “Doirt” an t-aitheantas réamhdhéanta isteach sa bhunachar sonraí. Ligeann fad MD5 agus deighilt laethúil dúinn gan a bheith buartha faoi imbhuailtí féideartha.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ach chun é seo go léir a thaifeadadh go tapa, bhí orainn an nós imeachta taifeadta féin a mhodhnú.

Conas a scríobhann tú sonraí de ghnáth? Tá tacar sonraí de shaghas éigin againn, scoilt muid i roinnt táblaí é, agus ansin CÓIPÍO é - ar dtús sa chéad, ansin isteach sa dara, isteach sa tríú ... Tá sé deacair, mar is cosúil go bhfuil muid ag scríobh sruth sonraí amháin i dtrí chéim seicheamhach. Míthaitneamhach. An féidir é a dhéanamh níos tapúla? An féidir!

Chun seo a dhéanamh, is leor na sreafaí seo a dhianscaoileadh go comhthreomhar lena chéile. Tharlaíonn sé go raibh earráidí, iarratais, teimpléid, blocálacha, ... ag eitilt i snáitheanna ar leith - agus scríobhann muid go léir go comhthreomhar. Go leor le haghaidh seo coinnigh cainéal CÓIP ar oscailt i gcónaí do gach tábla sprice aonair.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Is é sin, ag an mbailitheoir tá sruth i gcónaí, inar féidir liom na sonraí a theastaíonn uaim a scríobh. Ach ionas go bhfeiceann an bunachar sonraí na sonraí seo, agus nach dtéann duine i bhfostú ag fanacht leis na sonraí seo a scríobh, Ní mór cur isteach ar CÓIP ag eatraimh áirithe. Maidir linne, bhí an tréimhse is éifeachtaí thart ar 100ms - déanaimid é a dhúnadh agus é a oscailt arís ar an tábla céanna. Agus mura mbíonn go leor de shreabhadh amháin againn le linn buaicphointí áirithe, déanaimid comhthiomsú suas go teorainn áirithe.

Ina theannta sin, fuaireamar amach go bhfuil aon chomhiomlánú, nuair a bhailítear taifid i mbaisceanna, olc do phróifíl ualaigh den sórt sin. Tá olc clasaiceach INSERT ... VALUES agus 1000 taifead breise. Toisc go bhfuil buaic scríbhneoireachta agat ag an bpointe sin ar na meáin, agus beidh gach duine eile atá ag iarraidh rud éigin a scríobh chuig an diosca ag fanacht.

Chun fáil réidh le haimhrialtachtaí den sórt sin, ná déan aon rud a chomhiomlánú, ná maolán ar chor ar bith. Agus má tharlaíonn maolánú ar dhiosca (ar an drochuair, ceadaíonn an Stream API in Node.js duit a fháil amach) - cuir an nasc seo siar. Nuair a fhaigheann tú imeacht go bhfuil sé saor in aisce arís, scríobh chuige ón scuaine carntha. Agus cé go bhfuil sé gnóthach, tóg an chéad cheann eile saor ón linn agus scríobh chuige.

Sular tugadh isteach an cur chuige seo maidir le taifeadadh sonraí, bhí thart ar 4K ops scríofa againn, agus ar an mbealach seo laghdaigh muid an t-ualach faoi 4 huaire. Anois tá siad méadaithe 6 huaire eile mar gheall ar bhunachair shonraí monatóireachta nua - suas le 100MB/s. Agus anois táimid ag stóráil logaí le 3 mhí anuas i méid de thart ar 10-15TB, ag súil go i díreach trí mhí a bheidh aon fhorbróir in ann aon fhadhb a réiteach.

Tuigimid na fadhbanna

Ach tá na sonraí seo go léir a bhailiú go simplí go maith, úsáideach, ábhartha, ach ní leor - ní mór é a thuiscint. Toisc go bhfuil na milliúin de phleananna éagsúla in aghaidh an lae.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ach tá na milliúin do-bhainistithe, ní mór dúinn a dhéanamh ar dtús “níos lú”. Agus, ar an gcéad dul síos, ní mór duit cinneadh a dhéanamh conas a eagróidh tú an rud “níos lú” seo.

Tá trí phríomhphointe sainaitheanta againn:

  • sheol an t-iarratas seo
    Is é sin, cén feidhmchlár a “tháinig” é: comhéadan gréasáin, inneall, córas íocaíochta nó rud éigin eile.
  • i gcás tharla
    Ar an bhfreastalaí ar leith? Mar má tá go leor freastalaithe agat faoi aon fheidhmchlár amháin, agus go tobann "go bhfuil dúr" (toisc go bhfuil an "diosca lofa", "cuimhne leaked", fadhb éigin eile), ansin ní mór duit dul i ngleic go sonrach leis an bhfreastalaí.
  • как tháinig an fhadhb chun solais ar bhealach amháin nó ar bhealach eile

Chun “cé” a sheol iarratas chugainn a thuiscint, bainimid úsáid as uirlis chaighdeánach - ag socrú athróg seisiúin: SET application_name = '{bl-host}:{bl-method}'; — cuirimid ainm an óstaigh loighce gnó óna dtagann an iarraidh, agus ainm an mhodha nó an fheidhmchláir a thionscain é.

Tar éis dúinn “úinéir” an iarratais a rith, ní mór é a aschur go dtí an loga - chuige seo déanaimid an athróg a chumrú log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Dóibh siúd ar spéis leo, b’fhéidir breathnú sa lámhleabharcad a chiallaíonn sé go léir. Tarlaíonn sé go bhfeicimid sa logáil:

  • am
  • aitheantóirí próisis agus idirbhearta
  • ainm bunachar sonraí
  • IP an duine a sheol an t-iarratas seo
  • agus ainm an mhodha

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Ansin thuig muid nach bhfuil sé an-suimiúil breathnú ar an gcomhghaol d’iarratas amháin idir freastalaithe éagsúla. Ní minic a bhíonn cás agat ina mbíonn feidhmchlár amháin ag dul i bhfeidhm go cothrom anseo agus ansiúd. Ach fiú má tá sé mar an gcéanna, féach ar aon cheann de na freastalaithe seo.

Mar sin, seo an gearrtha "freastalaí amháin - lá amháin" d'éirigh sé amach a bheith go leor dúinn le haghaidh aon anailíse.

Tá an chéad chuid anailíse mar an gcéanna "sampla" - foirm ghiorraithe de chur i láthair an phlean, glanta ó na táscairí uimhriúla go léir. Is é an dara gearradh an t-iarratas nó an modh, agus is é an tríú gearradh an nód plean sonrach a chuir fadhbanna dúinn.

Nuair a bhogamar ó chásanna sonracha go teimpléid, fuaireamar dhá bhuntáiste ag an am céanna:

  • laghdú iolrach ar líon na rudaí le haghaidh anailíse
    Ní mór dúinn anailís a dhéanamh ar an bhfadhb a thuilleadh de réir na mílte fiosrúchán nó pleananna, ach de réir an iliomad teimpléad.
  • amlíne
    Is é sin, trí achoimre a dhéanamh ar na “fíricí” laistigh de chuid áirithe, is féidir leat a gcuma a thaispeáint i rith an lae. Agus anseo is féidir leat a thuiscint má tá patrún de shaghas éigin agat a tharlaíonn, mar shampla, uair san uair, ach ba cheart go dtarlódh sé uair amháin sa lá, ba cheart duit smaoineamh ar cad a chuaigh mícheart - cé ba chúis leis agus cén fáth, b'fhéidir gur chóir go mbeadh sé anseo. níor chóir. Is modh anailíse neamh-uimhriúil, amhairc amháin é seo.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Tá na modhanna atá fágtha bunaithe ar na táscairí a bhainimid as an bplean: cé mhéad uair a tharla patrún den sórt sin, an t-am iomlán agus an meán-am, cé mhéad sonraí a léadh ón diosca, agus cé mhéad ón gcuimhne...

Toisc, mar shampla, go dtagann tú go dtí an leathanach anailíse don óstach, féach - tá rud éigin ag tosú ag léamh an iomarca ar an diosca. Ní féidir leis an diosca ar an bhfreastalaí é a láimhseáil - cé a léann uaidh?

Agus is féidir leat a shórtáil de réir colún ar bith agus cinneadh a dhéanamh faoi cad a bheidh tú ag déileáil leis faoi láthair - an t-ualach ar an bpróiseálaí nó ar an diosca, nó líon iomlán na n-iarratas... Rinneamar é a shórtáil, d'fhéachamar ar na cinn "barr", réitigh sé agus rolladh amach leagan nua den fheidhmchlár.
[léamh físeáin]

Agus láithreach is féidir leat a fheiceáil iarratais éagsúla a thagann leis an teimpléad céanna ó iarratas cosúil SELECT * FROM users WHERE login = 'Vasya'. Aghaidh, inneall, próiseáil... Agus n'fheadar cén fáth a léifeadh próiseáil don úsáideoir mura n-idirghníomhaíonn sé leis.

Is é an bealach eile ná a fheiceáil láithreach ón iarratas cad a dhéanann sé. Mar shampla, is é seo an tosaigh, seo, seo, agus seo uair sa uair (cabhraíonn an líne ama). Agus éiríonn an cheist láithreach: tá an chuma ar an scéal nach é cúram an duine é rud éigin a dhéanamh uair san uair...

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Tar éis roinnt ama, thuig muid go raibh easpa comhiomlánaithe againn staitisticí de réir nóid phlean. Ní scaramar ó na pleananna ach na nóid sin a dhéanann rud éigin le sonraí na dtáblaí féin (léigh/scríobh iad de réir innéacs nó ná bíodh). Go deimhin, ní chuirtear ach gné amháin leis an bpictiúr roimhe seo - cé mhéad taifead a thug an nód seo dúinn?, agus cé mhéad a cuireadh i leataobh (Rows Bainte ag Scagaire).

Níl innéacs oiriúnach agat ar an pláta, déanann tú iarratas air, eitlíonn sé thar an innéacs, titeann sé isteach i Seq Scan ... tá na taifid go léir scagtha agat seachas ceann amháin. Cén fáth a bhfuil 100M taifead scagtha de dhíth ort in aghaidh an lae? Nach fearr an t-innéacs a rolladh suas?

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Tar éis anailís a dhéanamh ar na pleananna go léir nód de réir nód, thuig muid go bhfuil roinnt struchtúir tipiciúla sna pleananna is dócha go mbeidh cuma amhrasach orthu. Agus bheadh ​​​​sé go deas a rá leis an bhforbróir: "Cara, anseo léann tú an chéad trí innéacs, ansin sórtáil, agus ansin gearrtha amach" - mar riail, tá taifead amháin ann.

Is dócha gur tháinig gach duine a scríobh ceisteanna ar an bpatrún seo: “Tabhair dom an t-ordú deiridh le haghaidh Vasya, a dháta.” Agus mura bhfuil innéacs de réir dáta agat, nó mura bhfuil dáta san innéacs a d’úsáid tú, ansin beidh tú céim ar an “rake” díreach céanna.

Ach tá a fhios againn gur “raca” é seo - mar sin cén fáth nach n-insíonn tú láithreach don fhorbróir cad ba cheart dó a dhéanamh. Dá réir sin, agus plean á oscailt anois, feiceann ár bhforbróir pictiúr álainn le leideanna láithreach, áit a insíonn siad dó láithreach: "Tá fadhbanna agat anseo agus ansiúd, ach déantar iad a réiteach mar seo agus mar sin."

Mar thoradh air sin, tá laghdú suntasach tagtha ar an méid taithí a bhí ag teastáil chun fadhbanna a réiteach ag an tús agus anois. Is é seo an cineál uirlis atá againn.

Barrfheabhsú ar cheisteanna PostgreSQL. Kirill Borovikov (Tensor)

Foinse: will.com

Add a comment