Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

O chionn ghoirid dh'innis mi dhut mar a chleachdas tu reasabaidhean àbhaisteach àrdachadh coileanadh cheistean leughaidh SQL bho stòr-dàta PostgreSQL. An-diugh bruidhnidh sinn mu dheidhinn ciamar faodar clàradh a dhèanamh nas èifeachdaiche san stòr-dàta gun a bhith a’ cleachdadh “twists” sam bith san config - dìreach le bhith ag eagrachadh nan sruthan dàta gu ceart.

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

#1. Roinneadh

Artaigil mu ciamar agus carson as fhiach e eagrachadh sgaradh gnìomhaichte “ann an teòiridh” air a bhith mar-thà, an seo bruidhnidh sinn mun chleachdadh air cuid de dhòighean-obrach a chleachdadh taobh a-staigh ar seirbheis sgrùdaidh airson ceudan de luchd-frithealaidh PostgreSQL.

"Rudan nan làithean a dh'fhalbh ..."

An toiseach, mar MVP sam bith, thòisich am pròiseact againn fo eallach gu math aotrom - cha deach sgrùdadh a dhèanamh ach airson na deich frithealaichean as deatamaiche, bha a h-uile clàr an ìre mhath teann ... , agus a-rithist dh'fheuch sinn ri rudeigin a dhèanamh le aon de clàran 1.5TB ann am meud, thuig sinn ged a bha e comasach cumail a’ fuireach mar seo, bha e glè ghoireasach.

Bha na h-amannan cha mhòr mar amannan mòra, bha dreachan eadar-dhealaichte de PostgreSQL 9.x buntainneach, agus mar sin dh'fheumadh a h-uile sgaradh a dhèanamh “le làimh” - tro oighreachd bùird agus luchd-brosnachaidh ruith le fiùghantach EXECUTE.

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB
Thionndaidh am fuasgladh a thàinig às a sin gu bhith uile-choitcheann gu leòr gus an gabhadh e eadar-theangachadh chun a h-uile clàr:

  • Chaidh clàr pàrant “cinn” falamh ainmeachadh, a thug cunntas air a h-uile càil clàran-amais agus brosnachaidhean riatanach.
  • Chaidh an clàr bho shealladh an neach-dèiligidh a dhèanamh anns a’ chlàr “root”, agus cleachdadh a-staigh inneal-brosnachaidh slighe BEFORE INSERT chaidh an clàr “gu corporra” a chuir a-steach don roinn a bha a dhìth. Mura robh an leithid ann fhathast, fhuair sinn eisgeachd agus...
  • … le bhith a’ cleachdadh CREATE TABLE ... (LIKE ... INCLUDING ...) a chruthachadh stèidhichte air teamplaid a’ bhùird phàrant earrann le cuingealachadh air a’ cheann-latha a thathar ag iarraidhgus nuair a gheibhear dàta air ais, nach tèid leughadh a dhèanamh ach ann.

PG10: a’ chiad oidhirp

Ach gu h-eachdraidheil chan eil sgaradh tro dhìleab air a bhith gu math freagarrach airson a bhith a’ dèiligeadh ri sruth sgrìobhaidh gnìomhach no àireamh mhòr de sgaradh chloinne. Mar eisimpleir, faodaidh tu cuimhneachadh gu robh an algairim airson an roinn riatanach a thaghadh iom-fhillteachd ceithir-cheàrnach, gu bheil e ag obair le 100+ earrannan, tha thu fhèin a’ tuigsinn ciamar...

Ann am PG10 chaidh an suidheachadh seo a mheudachadh gu mòr le bhith a’ buileachadh taic sgaradh dùthchasach. Mar sin, dh'fheuch sinn sa bhad ri chuir an sàs sa bhad às deidh dhuinn an stòradh a ghluasad, ach ...

Mar a thàinig e a-mach às deidh a bhith a’ cladhach tron ​​​​leabhar-làimhe, is e an clàr a tha air a sgaradh gu dùthchasach san dreach seo:

  • chan eil e a’ toirt taic do thuairisgeulan clàr-amais
  • chan eil e a’ toirt taic do luchd-brosnachaidh air
  • chan urrainn dha a bhith na “shìol” aig duine
  • na toir taic INSERT ... ON CONFLICT
  • chan urrainn dhut earrann a chruthachadh gu fèin-obrachail

Às deidh dhuinn buille dòrainneach fhaighinn air an aghaidh le ràcan, thuig sinn gum biodh e do-dhèanta a dhèanamh gun an tagradh atharrachadh, agus chuir sinn dheth tuilleadh rannsachaidh airson sia mìosan.

PG10: an dàrna cothrom

Mar sin, thòisich sinn a 'fuasgladh nan duilgheadasan a dh' èirich aon ri aon:

  1. Air sgàth triggers agus ON CONFLICT Fhuair sinn a-mach gu robh feum againn orra fhathast an seo agus an sin, agus mar sin rinn sinn ìre eadar-mheadhanach airson an obrachadh a-mach clàr proxy.
  2. Fhuair thu cuidhteas "routing" ann an trioblaidean - 's e sin, bho EXECUTE.
  3. Thug iad a-mach e air leth clàr teamplaid leis a h-uile clàr-amaisgus nach bi iad eadhon an làthair anns a 'chlàr proxy.

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB
Mu dheireadh, às deidh seo uile, dhealaich sinn am prìomh bhòrd gu dùthchasach. Tha cruthachadh earrann ùr fhathast air fhàgail aig cogais an tagraidh.

Faclairean “sawing”.

Mar ann an siostam anailis sam bith, bha againn cuideachd "fìrinn" agus "gearradh" (faclairean). Anns a 'chùis againn, anns a' chomas seo bha iad an sàs, mar eisimpleir, corp teamplaid ceistean slaodach coltach ris no teacsa na ceiste fhèin.

Chaidh “Fiosrachadh” a roinn tron ​​​​latha airson ùine mhòr mu thràth, agus mar sin chuir sinn às gu socair earrannan seann-fhasanta, agus cha do chuir iad dragh oirnn (logaichean!). Ach bha duilgheadas ann le faclairean...

Gun a bhith ag ràdh gu robh mòran dhiubh ann, ach timcheall air Mar thoradh air 100TB de “fìrinn” thàinig faclair 2.5TB. Chan urrainn dhut dad a dhubhadh às gu goireasach bho bhòrd mar sin, chan urrainn dhut a dhlùthadh ann an ùine iomchaidh, agus mean air mhean dh’ fhàs sgrìobhadh thuige nas slaodaiche.

Coltach ri faclair... innte, bu chòir gach inntrig a thaisbeanadh dìreach aon turas… agus tha seo ceart, ach!.. Chan eil duine a’ cur stad oirnn bho bhith faclair fa leth airson gach latha! Tha, bheir seo beagan call obrach, ach leigidh e:

  • sgrìobh/leugh nas luaithe air sgàth meud earrann nas lugha
  • ithe nas lugha de chuimhne le bhith ag obair le clàran-amais nas toinnte
  • nas lugha de dhàta a stòradh air sgàth an comas a thoirt air falbh gu luath seann-fhasanta

Mar thoradh air an iom-fhillte iomlan de cheumannan Lùghdaich luchd CPU ~ 30%, lughdaich diosc le ~ 50%:

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB
Aig an aon àm, chùm sinn oirnn a 'sgrìobhadh an aon rud a-steach don stòr-dàta, dìreach le nas lugha de luchd.

#2. Leasachadh stòr-dàta agus ath-bheachdachadh

Mar sin shocraich sinn air na th’ againn tha a roinn fhèin aig gach latha le dàta. Gu fìrinneach, CHECK (dt = '2018-10-12'::date) - agus tha iuchair dealachaidh ann agus an suidheachadh airson clàr a dhol a-steach do roinn shònraichte.

Leis gu bheil a h-uile aithisg san t-seirbheis againn air an togail ann an co-theacsa ceann-latha sònraichte, tha na clàran-amais dhaibh bho “amannan neo-phàirteach” air a bhith de gach seòrsa (frithealaiche, Ceann-latha, Teamplaid Plana), (frithealaiche, Ceann-latha, nód plana), (Ceann-latha, clas mearachd, frithealaiche)...

Ach a nis tha iad beò air gach earrann na leth-bhreacan agad gach clàr-amais mar sin... Agus taobh a-staigh gach earrainn tha ceann-latha seasmhach... Tha e a 'tionndadh a-mach gu bheil a-nis tha sinn anns gach clàr-amais mar sin dìreach cuir a-steach seasmhach mar aon de na raointean, a tha a’ meudachadh an dà chuid an tomhas-lìonaidh agus an ùine sgrùdaidh air a shon, ach nach toir toradh sam bith. Dh'fhàg iad an ràcan dhaibh fhèin, oich...

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB
Tha an stiùireadh optimization follaiseach - sìmplidh thoir air falbh an raon ceann-latha bho gach clàr-amais air bùird roinnte. Leis na tomhasan againn, tha am buannachd mu dheidhinn 1TB / seachdain!

A-nis bheir sinn an aire gum feumadh an terabyte seo a bhith air a chlàradh fhathast dòigh air choireigin. Is e sin, sinne cuideachd bu chòir don diosc a-nis nas lugha a luchdachadh! Tha an dealbh seo a 'sealltainn gu soilleir a' bhuaidh a gheibhear bhon ghlanadh, ris an do chuir sinn seachad seachdain:

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

#3. “A’ sgaoileadh” an luchd as àirde

Is e aon de na duilgheadasan mòra a tha aig siostaman luchdaichte sioncronachadh gun fheum cuid de ghnìomhan nach eil feum air. Aig amannan “leis nach do mhothaich iad”, uaireannan “bha e na b’ fhasa mar sin”, ach nas luaithe no nas fhaide feumaidh tu faighinn cuidhteas e.

Nach gluais sinn a-steach air an dealbh roimhe agus chì sinn gu bheil diosc againn “Pumpaichean” fon luchd le leud dùbailte eadar sampaill faisg air làimh, a tha gu soilleir “gu staitistigeil” nach bu chòir tachairt le leithid de ghnìomhachd:

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

Tha seo gu math furasta a choileanadh. Tha sinn mu thràth air tòiseachadh air sgrùdadh faisg air 1000 frithealaiche, tha gach fear air a phròiseasadh le snàithlean loidsigeach air leth, agus bidh gach snàithlean ag ath-shuidheachadh an fhiosrachaidh cruinnichte a thèid a chuir chun stòr-dàta aig tricead sònraichte, rudeigin mar seo:

setInterval(sendToDB, interval)

Tha an duilgheadas an seo dìreach anns an fhìrinn gu bheil Bidh a h-uile snàithlean a’ tòiseachadh timcheall air an aon àm, agus mar sin bidh na h-amannan cur aca cha mhòr an-còmhnaidh a’ tighinn còmhla “chun na h-ìre.” Ach #2...

Gu fortanach, tha seo gu math furasta a chàradh, a’ cur ruith-suas “air thuaiream”. le ùine:

setInterval(sendToDB, interval * (1 + 0.1 * (Math.random() - 0.5)))

#4. Bidh sinn a’ tasgadh na tha a dhìth oirnn

Is e an treas duilgheadas àrdachaidh traidiseanta gun tasgadan far a bheil e b ’urrainn Gu bhith.

Mar eisimpleir, rinn sinn e comasach mion-sgrùdadh a dhèanamh a thaobh nodan plana (iad sin uile Seq Scan on users), ach sa bhad smaoinich gu bheil iad, airson a 'chuid as motha, mar an ceudna - dhìochuimhnich iad.

Chan eil, gu dearbh, chan eil dad air a sgrìobhadh chun stòr-dàta a-rithist, tha seo a’ gearradh dheth an inneal-brosnachaidh le INSERT ... ON CONFLICT DO NOTHING. Ach tha an dàta seo fhathast a’ ruighinn an stòr-dàta, agus chan eil feum air leughadh gus sgrùdadh a dhèanamh airson còmhstri fheudar a dhèanamh. Ach #3...

Tha an diofar anns an àireamh de chlàran a chaidh a chuir chun stòr-dàta ro / às deidh an tasgadh air a chomasachadh follaiseach:

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

Agus is e seo an lùghdachadh ann an luchd stòraidh:

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

Iomlan

Tha “Terabyte-per-day” dìreach a’ faireachdainn eagallach. Ma nì thu a h-uile càil ceart, tha seo dìreach 2^ 40 bytes / 86400 diogan = ~ 12.5MB/sgun robh eadhon sgriothan IDE deasg air an cumail. 🙂

Ach dha-rìribh, eadhon le “skew” deich uiread den luchd tron ​​​​latha, is urrainn dhut gu furasta coinneachadh ri comasan SSDs an latha an-diugh.

Bidh sinn a’ sgrìobhadh ann am PostgreSQL air sublight: 1 aoigheachd, 1 latha, 1TB

Source: www.habr.com

Cuir beachd ann