Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

Dhawaan waxaan kuu sheegay sida, adoo isticmaalaya cuntooyinka caadiga ah kordhinta waxqabadka su'aalaha akhrinta SQL Laga soo bilaabo xogta PostgreSQL. Maanta waxaan ka hadli doonaa sida duubista waxaa loo samayn karaa si hufan kaydka xogta adiga oo aan la isticmaalin wax "qalloocin" qaabaynta - si fudud adiga oo si sax ah u habaynaya socodka xogta.

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

#1. Qaybinta

Maqaal ku saabsan sida iyo sababta ay u mudan tahay abaabulka lagu dabaqay qaybinta "aragti ahaan" waa horeba, halkan waxaan kaga hadli doonaa dhaqanka ku dhaqanka qaar ka mid ah hababka gudaha our adeega la socodka boqolaalka adeegayaasha PostgreSQL.

"Waxyaabaha maalmaha soo maray..."

Markii hore, sida MVP kasta, mashruucayagu wuxuu ku bilaabmay culeys fudud - kormeerka waxaa lagu sameeyay kaliya tobanka server ee ugu muhiimsan, dhammaan miisaska waxay ahaayeen kuwo isku dhafan , oo haddana waxaan isku daynay inaan wax ku samayno mid ka mid ah miisaska 1.5TB ee cabbirka, waxaan ogaanay in inkasta oo ay suurtagal tahay in sidan lagu sii noolaado, ay aad u dhib badan tahay.

Waqtiyadu waxay ku dhowaayeen sida waqtiyada xiisaha leh, noocyada kala duwan ee PostgreSQL 9.x waxay ahaayeen kuwo khuseeya, marka dhammaan qaybinta waa in lagu sameeyaa "gacan" - iyada oo loo marayo dhaxalka miiska iyo kiciya jiheynta leh firfircoon EXECUTE.

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB
Xalka natiijadu wuxuu noqday mid caalami ah oo ku filan oo loo turjumi karo dhammaan miisaska:

  • Miiska waalidka ee madhan "madaxa" ayaa lagu dhawaaqay, kaas oo sifeeyay dhammaan tusmooyinka lagama maarmaanka ah iyo kicinta.
  • Diiwaanka laga soo xigtay aragtida macmiilka waxaa lagu sameeyay miiska "xididka", iyo gudaha iyadoo la isticmaalayo kicinta marin habaabinta BEFORE INSERT diiwaanka "jidh ahaan" ayaa la geliyey qaybta loo baahan yahay. Haddi aanay taasi weli jirin, waxa aanu qabanay wax ka reeban oo...
  • … iyadoo la isticmaalayo CREATE TABLE ... (LIKE ... INCLUDING ...) waxaa la abuuray iyadoo lagu salaynayo qaabka miiska waalidka qaybta xaddidan taariikhda la rabosi marka xogta la soo saaro, akhriska lagu sameeyo oo keliya.

PG10: isku daygii ugu horreeyay

Laakin qaybinta dhaxalka taariikh ahaan si fiican ugumay habboonayn la tacaalidda qulqulka qoraalka firfircoon ama tiro badan oo qayb ka mid ah carruurta. Tusaale ahaan, waxaad xasuusan kartaa in algorithm ee xulashada qaybta loo baahan yahay uu lahaa kakanaanta quadratic, in ay la shaqeyso 100+ qaybood, adiga laftaadu waad fahantay sida...

PG10 xaaladdan si weyn ayaa loo hagaajiyay iyadoo la hirgeliyay taageerada qaybinta dhalad. Sidaa darteed, waxaanu isla markiiba isku daynay inaanu ku dabaqno ka dib markii aan u haajiray kaydinta, laakiin ...

Sida ay noqotay ka dib markii la dhex qoday buug-gacmeedka, shaxda asal ahaan u qaybsan ee noocani waa:

  • ma taageerto sharraxaadaha tusmada
  • kuma taageerto kicinta dusheeda
  • qofna ma noqon karo "faraciisa"
  • ha taageerin INSERT ... ON CONFLICT
  • ma soo saari karo qayb si toos ah

Ka dib markii aan ku helnay dharbaaxo xanuun badan oo foolka hore ah, waxaan ogaanay in aysan suurtagal ahayn in la sameeyo iyada oo aan wax laga beddelin codsiga, waxaana dib u dhignay cilmi-baaris dheeraad ah muddo lix bilood ah.

PG10: fursad labaad

Haddaba, waxaan bilownay inaan mid mid u xalinno mashaakilaadka ka dhashay:

  1. Sababtoo ah kiciya iyo ON CONFLICT Waxaan ogaanay inaan wali halkan iyo halkaas uga baahanahay, markaa waxaan samaynay marxalad dhexdhexaad ah si aan uga shaqayno miiska wakiilnimada.
  2. Waa laga takhalusay "routing" kiciyeyaasha - taasi waa, ka EXECUTE.
  3. Si gooni ah ayay u soo saareen miiska template leh dhammaan tusmooyinkasi aanay xataa miiska wakiillada ugu jirin.

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB
Ugu dambeyntii, waxaas oo dhan ka dib, waxaan u qaybinay miiska weyn ee hooyo. Abuuritaanka qayb cusub ayaa weli loo daayaa damiirka codsiga.

Qaamuusyada "Sawing".

Как ΠΈ Π² любой аналитичСской систСмС, Ρƒ нас Ρ‚ΠΎΠΆΠ΅ Π±Ρ‹Π»ΠΈ "xaqiiqda" iyo "gooyo" (qaamuusyo). Xaaladeena, awooddan waxay u dhaqmeen, tusaale ahaan, jirka template Weydiimaha qunyar socodka ah ee la midka ah ama qoraalka weydiinta lafteeda.

"Xaqiiqooyinka" ayaa la qaybiyay maalinba waqti dheer, sidaas darteed waxaan si degan u tirtirnay qaybo duug ah, oo nama ay dhibin (logs!). Laakin waxaa jirtay dhibaato qaamuusyada...

Ma aha in la sheego in ay jiraan wax badan oo iyaga ka mid ah, laakiin qiyaas ahaan 100TB ee "xaqiiqda" waxay keentay qaamuus 2.5TB ah. Si habboon ugama tirtiri kartid shay miiska noocaas ah, kuma cadaadin kartid wakhti kugu filan, qoraal ahaanna si tartiib tartiib ah ayey u yaraatay.

Sida qaamuuska... gudaha, gelitaan kasta waa in si sax ah loo soo bandhigaa hal mar... tani waa sax, laakiin! qaamuus gaar ah maalin kasta! Haa, tani waxay keenaysaa dib-u-dhac gaar ah, laakiin waxay ogolaataa:

  • dhaqso u qor/ akhri iyadoo ay ugu wacan tahay cabbirka qaybta yar
  • Isticmaal xasuus yar adoo la shaqaynaya tusmooyin is haysta
  • kaydi xog yar iyada oo ay ugu wacan tahay awoodda in si degdeg ah looga saaro waqti hore

Natiijadu waxay tahay dhammaan kakan ee tallaabooyinka Culayska CPU ayaa hoos u dhacay ~ 30%, culayska diskooga ~ 50%:

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB
Isla mar ahaantaana, waxaan sii wadnay inaan isla wax ku qorno keydka xogta, iyadoo culeys yar ay saaran tahay.

#2. Kobcinta xogta iyo dib u habeynta

Markaa wixii aanu haysanay ayaanu ku degnay maalin walba waxay leedahay qayb u gaar ah xogta leh. Dhab ahaantii, CHECK (dt = '2018-10-12'::date) - oo waxaa jira furaha qaybinta iyo shuruudda in diiwaanku ku dhaco qayb gaar ah.

Maaddaama dhammaan warbixinnada adeeggayaga lagu dhisay macnaha taariikh gaar ah, tusmooyinka iyaga laga soo bilaabo "wakhtiyada aan la qaybin" waxay ahaayeen dhammaan noocyada (Server, Taariikhda, Qorshaha Qorshaha), (Server, Taariikhda, Qorshe noode), (Taariikhda, Qaladka fasalka, Server)...

Но Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сСкции ΠΆΠΈΠ²ΡƒΡ‚ koobiyadaada index kasta oo sida... Iyo gudaha qayb kasta taariikhda waa joogto ah... Waxaa soo baxday in hadda aan ku jirno index kasta oo noocaas ah si fudud u geli joogto ah sida mid ka mid ah beeraha, taas oo kordhisa labadaba mugga iyo wakhtiga raadinta, laakiin ma keeno wax natiijo ah. Raashinkii bay iska daayeen, ooh...

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB
Jihada hagaajinta waa caddahay - fudud ka saar goobta taariikhda dhammaan tusmooyinka miisaska kala qaybsan. Marka la eego muggayada, faa'iidada ayaa ku saabsan 1TB/toddobaadkii!

Hadda aan ogaano in terabyte-kan weli ay ahayd in si uun loo duubo. Taasi waa, annaguna sidoo kale saxanku hadda waa inuu ka yara shubaa! Sawirkaani wuxuu si cad u muujinayaa saameynta laga helay nadiifinta, kaas oo aan u hurnay usbuuc:

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

#3. "Fidinta" culeyska ugu sarreeya

Mid ka mid ah dhibaatooyinka waaweyn ee nidaamyada la raray waa isku xidhid aan badnayn hawlgallada qaarkood oo aan u baahnayn. Mararka qaarkood "sababtoo ah ma aysan dareemin", mararka qaarkood " way sahlanayd sidaas", laakiin mar dhow ama ka dib waa inaad ka takhalustaa.

Aynu soo koobno ​​sawirkii hore oo aynu aragno in aynu haysanno saxan "bambooyin" culeyska hoostiisa oo leh laba-weyn Inta u dhaxaysa shaybaarrada ku xiga, kuwaas oo si cad β€œtirakoob ahaan” waa in aanay ku dhicin tiro hawlgallo ah:

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

Tani way fududahay in la gaaro. Waxaan mar hore bilownay la socodka ku dhawaad ​​1000 server, mid walba waxaa lagu farsameeyaa dun macquul ah oo gaar ah, oo dun kasta waxay dib u dejisaa macluumaadka la ururiyey si loogu diro xogta inta jeer ee go'an, wax sidan oo kale ah:

setInterval(sendToDB, interval)

Dhibaatadu halkan waxay si sax ah ugu jirtaa xaqiiqda taas Dhammaan duntadu waxay bilaabaan qiyaastii isku mar, sidaas darteed waqtigooda dirista waxay had iyo jeer ku beegan yihiin "ilaa heerka." Hooy #2...

Nasiib wanaag, tani way fududahay in la hagaajiyo, ku darida "random" run-up waqtiga:

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

#4. Waxaan kaydinnaa waxa aan u baahanahay

Dhibaatada saddexaad ee soo jireenka ah ayaa ah kayd la'aan meesha uu joogo karaa ahaansho.

Tusaale ahaan, waxaan suurtogal ka dhignay in lagu falanqeeyo dhinaca qanjidhada qorshaha (dhammaan kuwan Seq Scan on users), laakiin isla markiiba waxay u maleynayaan inay yihiin, inta badan, isku mid ah - way illoobeen.

Maya, dabcan, waxba laguma qorin kaydka xogta mar kale, tani waxay ku gooynaysaa kicinta INSERT ... ON CONFLICT DO NOTHING. Laakiin xogtani wali waxay gaartaa kaydka xogta, waana wax aan loo baahnayn akhrinta si aad u hubiso isku dhaca waa in la sameeyaa. Hooy #3...

Farqiga u dhexeeya tirada diiwaannada loo soo diray xogta kaydinta ka hor/kadib marka la kaydiyo waa wax iska cad:

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

Tanina waa hoos u dhaca kaydinta ee la socota:

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

Wadarta

"Terabyte-maalintii" kaliya waxay u muuqataa cabsi. Haddii aad wax walba si sax ah u sameyso, markaa tani waa kaliya 2^40 bytes / 86400 seconds = ~ 12.5MB/sin xitaa muraayadaha IDE-ga ee desktop-ka la hayo. πŸ™‚

Laakiin si dhab ah, xitaa iyadoo toban laab "skew" culeyska inta lagu jiro maalinta, waxaad si fudud ula kulmi kartaa awoodaha SSD-yada casriga ah.

Waxaan ku qornaa PostgreSQL iftiinka hoose: 1 martigeliyaha, 1 maalin, 1TB

Source: www.habr.com

Add a comment