Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

Riċentement għedtlek kif, billi tuża riċetti standard iżżid il-prestazzjoni tal-mistoqsijiet tal-qari SQL mid-database PostgreSQL. Illum se nitkellmu dwar kif ir-reġistrazzjoni tista' ssir b'mod aktar effiċjenti fid-database mingħajr ma tuża l-ebda "twists" fil-konfigurazzjoni - sempliċement billi torganizza b'mod korrett il-flussi tad-dejta.

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

#1. Sezzjoni

Artiklu dwar kif u għaliex ta’ min jorganizza qsim applikat “fit-teorija” diġà kien, hawnhekk se nitkellmu dwar il-prattika tal-applikazzjoni ta 'xi approċċi fi ħdan tagħna servizz ta’ monitoraġġ għal mijiet ta’ servers PostgreSQL.

"Affarijiet ta 'jiem li għaddew..."

Inizjalment, bħal kull MVP, il-proġett tagħna beda taħt tagħbija pjuttost ħafifa - il-monitoraġġ sar biss għall-għaxar servers l-aktar kritiċi, it-tabelli kollha kienu relattivament kompatti... Iżda maż-żmien, in-numru ta 'hosts immonitorjati sar dejjem aktar. , u għal darb'oħra ppruvajna nagħmlu xi ħaġa b'wieħed minn tabelli 1.5TB fid-daqs, indunajna li għalkemm kien possibbli li nkomplu ngħixu hekk, kien inkonvenjenti ħafna.

Iż-żminijiet kienu kważi bħal żminijiet epiċi, verżjonijiet differenti ta' PostgreSQL 9.x kienu rilevanti, għalhekk il-qsim kollu kellu jsir "manwalment" - permezz wirt mejda u triggers rotta b'dinamika EXECUTE.

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB
Is-soluzzjoni li rriżultat irriżulta li kienet universali biżżejjed li setgħet tiġi tradotta għat-tabelli kollha:

  • Ġiet iddikjarata tabella ġenitur "header" vojta, li ddeskriviet kollox indiċijiet meħtieġa u triggers.
  • Ir-rekord mill-perspettiva tal-klijent sar fit-tabella "għerq", u internament bl-użu grillu tar-rotta BEFORE INSERT ir-rekord kien "fiżikament" mdaħħal fis-sezzjoni meħtieġa. Jekk s'issa ma kienx hemm ħaġa bħal din, qbadna eċċezzjoni u...
  • … billi tuża CREATE TABLE ... (LIKE ... INCLUDING ...) inħoloq ibbażat fuq il-mudell tat-tabella ġenitur sezzjoni b’restrizzjoni fuq id-data mixtieqasabiex meta d-data tiġi rkuprata, il-qari jsir biss fiha.

PG10: l-ewwel tentattiv

Iżda l-qsim permezz tal-wirt storikament ma kienx adattat tajjeb biex jittratta fluss ta 'kitba attiv jew numru kbir ta' diviżorji tfal. Per eżempju, tista 'tfakkar li l-algoritmu għall-għażla tas-sezzjoni meħtieġa kellu kumplessità kwadratika, li taħdem b'100+ sezzjoni, int stess tifhem kif...

F'PG10 din is-sitwazzjoni ġiet ottimizzata ħafna bl-implimentazzjoni ta' appoġġ qsim indiġeni. Għalhekk, ippruvajna immedjatament napplikawha immedjatament wara l-migrazzjoni tal-ħażna, iżda...

Kif irriżulta wara li tħaffer il-manwal, it-tabella maqsuma b'mod nattiv f'din il-verżjoni hija:

  • ma jappoġġjax deskrizzjonijiet tal-indiċi
  • ma jappoġġjax triggers fuqha
  • ma jista’ jkun id-“dixxendent” ta’ ħadd
  • ma tappoġġjax INSERT ... ON CONFLICT
  • ma jistax jiġġenera taqsima awtomatikament

Wara li rċevejna daqqa ta 'uġigħ fil-forehead b'rake, indunajna li jkun impossibbli li nagħmlu mingħajr ma tiġi mmodifikata l-applikazzjoni, u pposponna aktar riċerka għal sitt xhur.

PG10: it-tieni ċans

Allura, bdejna nsolvu l-problemi li qamu wieħed wieħed:

  1. Għax iqanqal u ON CONFLICT Sibna li għadna bżonnhom hawn u hemm, għalhekk għamilna stadju intermedju biex naħdmuhom tabella prokura.
  2. Neħles mir-"routing" fil jqajjem - jiġifieri, minn EXECUTE.
  3. Ħaduha separatament tabella mudell bl-indiċi kollhasabiex lanqas ikunu preżenti fit-tabella tal-prokura.

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB
Fl-aħħarnett, wara dan kollu, aħna qasmu t-tabella prinċipali b'mod nattiv. Il-ħolqien ta' taqsima ġdida għadha titħalla għall-kuxjenza tal-applikazzjoni.

Dizzjunarji "Serrar".

Bħal kull sistema analitika, kellna wkoll "fatti" u "qatgħat" (dizzjunarji). Fil-każ tagħna, f'din il-kapaċità aġixxew, pereżempju, korp tal-mudell mistoqsijiet bil-mod simili jew it-test tal-mistoqsija innifsu.

"Il-fatti" kienu maqsumin bi jum għal żmien twil diġà, għalhekk ħassejna bil-kalma sezzjonijiet skaduti, u ma ddejqunax (zkuk!). Imma kien hemm problema bid-dizzjunarji...

Biex ma ngħidx li kien hemm ħafna minnhom, iżda bejn wieħed u ieħor 100TB ta '"fatti" irriżultaw f'dizzjunarju 2.5TB. Ma tistax tħassar xi ħaġa b'mod konvenjenti minn tabella bħal din, ma tistax tikkompressaha fi żmien adegwat, u l-kitba lilha gradwalment saret aktar bil-mod.

Bħal dizzjunarju... fih, kull entrata għandha tiġi ppreżentata eżattament darba... u dan huwa korrett, imma!.. Ħadd mhu qed iwaqqafna milli jkollna dizzjunarju separat għal kull jum! Iva, dan iġib ċertu redundancy, iżda jippermetti:

  • ikteb/aqra aktar malajr minħabba daqs iżgħar ta 'sezzjoni
  • jikkunsmaw inqas memorja billi taħdem b'indiċi aktar kompatti
  • jaħżen inqas data minħabba l-abbiltà li malajr tneħħi skaduti

Bħala riżultat tal-kumpless kollu ta 'miżuri It-tagħbija tas-CPU naqset b'~30%, it-tagħbija tad-diska b'~50%:

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB
Fl-istess ħin, komplejna niktbu eżattament l-istess ħaġa fid-database, biss b'inqas tagħbija.

#2. Evoluzzjoni tad-database u refactoring

Għalhekk issetilna fuq dak li għandna kull jum għandu taqsima tiegħu bid-data. Fil-fatt, CHECK (dt = '2018-10-12'::date) — u hemm ċavetta ta' qsim u l-kundizzjoni biex rekord jaqa' f'sezzjoni speċifika.

Peress li r-rapporti kollha fis-servizz tagħna huma mibnija fil-kuntest ta 'data speċifika, l-indiċi għalihom minn "ħinijiet mhux diviżorji" kienu t-tipi kollha (Server, Data, Mudell tal-Pjan), (Server, Data, Node tal-Pjan), (Data, Klassi ta' żball, Server), ...

Imma issa jgħixu fuq kull sezzjoni kopji tiegħek kull indiċi bħal dan... U fi ħdan kull taqsima data hija kostanti... Jirriżulta li issa qegħdin f'kull indiċi bħal dan sempliċement daħħal kostanti bħala wieħed mill-oqsma, li jżid kemm il-volum tiegħu kif ukoll il-ħin tat-tfittxija għaliha, iżda ma jġib l-ebda riżultat. Ħallew ir-rake għalihom infushom, oops...

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB
Id-direzzjoni tal-ottimizzazzjoni hija ovvja - sempliċi neħħi l-qasam tad-data mill-indiċi kollha fuq imwejjed maqsuma. Minħabba l-volumi tagħna, il-qligħ huwa ta 'madwar 1TB/ġimgħa!

Issa ejja ninnutaw li dan it-terabyte xorta kellu jiġi rreġistrat b'xi mod. Jiġifieri aħna wkoll id-diska issa għandha tagħbija inqas! Din l-istampa turi biċ-ċar l-effett miksub mit-tindif, li għalih iddedikajna ġimgħa:

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

#3. "It-tixrid" tal-ogħla tagħbija

Wieħed mill-problemi kbar ta 'sistemi mgħobbija huwa sinkronizzazzjoni żejda xi operazzjonijiet li ma jeħtiġuhx. Xi drabi "għax ma ndunawx", xi drabi "kien aktar faċli hekk", imma illum jew għada trid teħles minnha.

Ejja nimxu fuq l-istampa preċedenti u naraw li għandna disk "pompi" taħt it-tagħbija b'amplitudni doppja bejn kampjuni ħdejn xulxin, li b'mod ċar "statistikament" m'għandux iseħħ b'tali numru ta' operazzjonijiet:

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

Dan huwa pjuttost faċli biex jinkiseb. Diġà bdejna l-monitoraġġ kważi 1000 server, kull wieħed huwa pproċessat minn ħajt loġiku separat, u kull ħajt reset l-informazzjoni akkumulata biex tintbagħat lid-database b'ċerta frekwenza, xi ħaġa bħal din:

setInterval(sendToDB, interval)

Il-problema hawnhekk tinsab preċiżament fil-fatt li il-ħjut kollha jibdew bejn wieħed u ieħor fl-istess ħin, għalhekk il-ħinijiet tagħhom li jibagħtu kważi dejjem jikkoinċidu “sal-punt.” Ops #2...

Fortunatament, dan huwa pjuttost faċli biex tirranġa, iż-żieda ta 'run-up "każwali". skond il-ħin:

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

#4. Aħna cache dak li għandna bżonn

It-tielet problema tradizzjonali ta 'tagħbija għolja hija ebda cache fejn hu setgħet tkun.

Pereżempju, għamilna possibbli li tiġi analizzata f'termini ta 'nodi tal-pjan (dawn kollha Seq Scan on users), iżda immedjatament taħseb li huma, fil-biċċa l-kbira, l-istess - insew.

Le, ovvjament, xejn ma huwa miktub fid-database mill-ġdid, dan jaqta 'l-grillu ma' INSERT ... ON CONFLICT DO NOTHING. Iżda din id-dejta għadha tasal fid-database, u mhix meħtieġa qari biex jiċċekkja għal kunflitt għandek tagħmel. Ops #3...

Id-differenza fin-numru ta' rekords mibgħuta lid-database qabel/wara li jiġi attivat il-caching hija ovvja:

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

U din hija l-waqgħa ta' akkumpanjament fit-tagħbija tal-ħażna:

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

B'kollox

"Terabyte-per-day" biss ħsejjes tal-biża. Jekk tagħmel kollox sew, allura dan huwa biss 2^40 bytes / 86400 sekondi = ~12.5MB/sli anke desktop viti IDE miżmuma. 🙂

Iżda bis-serjetà, anke b'għaxar darbiet "skew" tat-tagħbija matul il-ġurnata, tista 'faċilment tissodisfa l-kapaċitajiet ta' SSDs moderni.

Kitba f'PostgreSQL fuq sublight: 1 host, 1 jum, 1TB

Sors: www.habr.com

Żid kumment