A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

Laipe Mo ti sọ fun ọ bi, lilo awọn ilana ilana mu iṣẹ ṣiṣe ti awọn ibeere kika SQL pọ si lati PostgreSQL database. Loni a yoo sọrọ nipa bii gbigbasilẹ le ṣee ṣe daradara siwaju sii ninu aaye data laisi lilo eyikeyi “awọn oniyi” ninu atunto - nirọrun nipa siseto awọn ṣiṣan data ni deede.

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

#1. Abala

Nkan kan nipa bii ati idi ti o fi tọ lati ṣeto ipin ti a lo “ninu ero” ti wa tẹlẹ, nibi a yoo sọrọ nipa iṣe ti lilo diẹ ninu awọn ọna laarin wa iṣẹ ibojuwo fun awọn ọgọọgọrun awọn olupin PostgreSQL.

"Awọn nkan ti awọn ọjọ ti kọja..."

Ni ibẹrẹ, bii eyikeyi MVP, iṣẹ akanṣe wa bẹrẹ labẹ ẹru ina to peye - ibojuwo ni a ṣe nikan fun awọn olupin mẹwa ti o ṣe pataki julọ, gbogbo awọn tabili jẹ iwapọ… , ati ki o lekan si a gbiyanju lati se nkankan pẹlu ọkan ninu awọn tabili 1.5TB ni iwọn, a mọ̀ pé bí ó tilẹ̀ jẹ́ pé ó ṣeé ṣe láti máa bá a lọ láti gbé bí èyí, kò rọrùn.

Awọn akoko naa fẹrẹ dabi awọn akoko apọju, awọn ẹya oriṣiriṣi ti PostgreSQL 9.x ṣe pataki, nitorinaa gbogbo ipin ni lati ṣee “pẹlu ọwọ” - nipasẹ ilẹ-iní tabili ati okunfa afisona pẹlu ìmúdàgba EXECUTE.

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB
Ojutu abajade ti jade lati jẹ gbogbo agbaye to pe o le tumọ si gbogbo awọn tabili:

  • Ohun ṣofo tabili obi “akọsori” ti a kede, eyi ti o se apejuwe gbogbo pataki atọka ati okunfa.
  • Igbasilẹ lati oju wiwo alabara ni a ṣe ni tabili “root”, ati lilo inu afisona okunfa BEFORE INSERT igbasilẹ naa "ti ara" ti a fi sii sinu apakan ti a beere. Ti ko ba si iru nkan bẹẹ sibẹsibẹ, a mu imukuro ati…
  • ... nipa lilo CREATE TABLE ... (LIKE ... INCLUDING ...) ti a da da lori awọn awoṣe ti awọn obi tabili apakan pẹlu ihamọ lori ọjọ ti o fẹki nigbati data ti wa ni gba, kika ti wa ni ṣe nikan ni o.

PG10: akọkọ igbiyanju

Ṣugbọn ipin nipasẹ ogún ti itan-akọọlẹ ko ni ibamu daradara si ṣiṣe pẹlu ṣiṣan kikọ ti nṣiṣe lọwọ tabi nọmba nla ti awọn ipin ọmọde. Fun apẹẹrẹ, o le ranti pe alugoridimu fun yiyan apakan ti a beere ni kuadiratiki complexity, pe o ṣiṣẹ pẹlu awọn apakan 100+, iwọ funrararẹ loye bii…

Ni PG10 ipo yii jẹ iṣapeye pupọ nipasẹ atilẹyin imuse abinibi ipin. Nitorinaa, a gbiyanju lẹsẹkẹsẹ lati lo lẹsẹkẹsẹ lẹhin gbigbe ibi ipamọ naa, ṣugbọn…

Bi o ti wa ni jade lẹhin ti n walẹ nipasẹ itọnisọna, tabili ti a pin si abinibi ni ẹya yii jẹ:

  • ko ṣe atilẹyin awọn apejuwe atọka
  • ko ṣe atilẹyin awọn okunfa lori rẹ
  • ko le jẹ “iru-ọmọ” ẹnikẹni
  • ma ṣe atilẹyin INSERT ... ON CONFLICT
  • ko le ṣe ina apakan laifọwọyi

Lehin ti o ti gba ikun irora si iwaju iwaju pẹlu rake, a rii pe kii yoo ṣee ṣe lati ṣe laisi iyipada ohun elo naa, ati sun siwaju iwadii siwaju fun oṣu mẹfa.

PG10: keji anfani

Nitorinaa, a bẹrẹ lati yanju awọn iṣoro ti o dide ni ọkọọkan:

  1. Nitori okunfa ati ON CONFLICT A rii pe a tun nilo wọn nibi ati nibẹ, nitorinaa a ṣe ipele agbedemeji lati ṣiṣẹ wọn tabili aṣoju.
  2. Ti yọ kuro ninu “itọpa” ni awọn okunfa - eyini ni, lati EXECUTE.
  3. Wọ́n gbé e jáde lọ́tọ̀ọ̀tọ̀ tabili awoṣe pẹlu gbogbo awọn atọkaki wọn ko tilẹ wa ninu tabili aṣoju.

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB
Nikẹhin, lẹhin gbogbo eyi, a pin tabili akọkọ ni abinibi. Ṣiṣẹda ti apakan titun jẹ ṣi silẹ si ẹri-ọkan ti ohun elo naa.

Awọn iwe-itumọ “Sawing

Bi ni eyikeyi analitikali eto, a tun ní "awọn otitọ" ati "awọn gige" (awọn iwe-itumọ). Ninu ọran wa, ni agbara yii wọn ṣe, fun apẹẹrẹ, ara awoṣe iru awọn ibeere ti o lọra tabi ọrọ ti ibeere naa funrararẹ.

“Awọn otitọ” ti pin nipasẹ ọjọ fun igba pipẹ tẹlẹ, nitorinaa a farabalẹ paarẹ awọn apakan ti igba atijọ, ati pe wọn ko yọ wa lẹnu (awọn akọọlẹ!). Ṣugbọn iṣoro kan wa pẹlu awọn iwe-itumọ…

Kii ṣe lati sọ pe ọpọlọpọ wọn wa, ṣugbọn isunmọ 100TB ti “awọn otitọ” yorisi iwe-itumọ 2.5TB kan. O ko le ni irọrun paarẹ ohunkohun lati iru tabili bẹ, o ko le fun pọ ni akoko to pe, ati kikọ si rẹ di diẹdiẹ.

Gẹgẹbi iwe-itumọ ... ninu rẹ, titẹ sii kọọkan yẹ ki o gbekalẹ ni pato ni ẹẹkan ... ati pe eyi jẹ deede, ṣugbọn! .. Ko si ẹnikan ti o da wa duro lati ni a lọtọ dictionary fun kọọkan ọjọ! Bẹẹni, eyi mu idapada kan wa, ṣugbọn o gba laaye:

  • kọ / ka yiyara nitori kere apakan iwọn
  • je kere iranti nipa ṣiṣẹ pẹlu diẹ iwapọ atọka
  • tọjú kere data nitori agbara lati yara yọ igba atijọ kuro

Bi abajade ti gbogbo eka ti awọn igbese Iwọn Sipiyu dinku nipasẹ ~ 30%, fifuye disk nipasẹ ~ 50%:

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB
Ni akoko kanna, a tẹsiwaju lati kọ gangan ohun kanna sinu ibi ipamọ data, o kan pẹlu fifuye kere si.

#2. Itankalẹ data ati refactoring

Nitorina a yanju lori ohun ti a ni ọjọ kọọkan ni apakan tirẹ pẹlu data. Lootọ, CHECK (dt = '2018-10-12'::date) - ati pe bọtini ipin kan wa ati ipo fun igbasilẹ kan lati ṣubu sinu apakan kan pato.

Niwọn igba ti gbogbo awọn ijabọ ninu iṣẹ wa ni a ṣe ni ipo ti ọjọ kan pato, awọn atọka fun wọn lati “awọn akoko ti kii ṣe ipin” ti jẹ gbogbo iru (Olupinpin, Ọjọ, Awoṣe Eto), (Olupinpin, Ọjọ, Eto ipade), (Ọjọ, Kilasi aṣiṣe, olupin), ...

Ṣugbọn nisisiyi wọn n gbe ni gbogbo apakan awọn ẹda rẹ kọọkan iru atọka... Ati laarin kọọkan apakan ọjọ jẹ kan ibakan... O wa ni pe bayi a wa ni iru atọka kọọkan nìkan tẹ kan ibakan bi ọkan ninu awọn aaye, eyiti o mu iwọn didun mejeeji pọ si ati akoko wiwa fun rẹ, ṣugbọn ko mu abajade eyikeyi wa. Wọn fi rake silẹ fun ara wọn, oops...

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB
Itọsọna ti iṣapeye jẹ kedere - rọrun yọ aaye ọjọ kuro lati gbogbo awọn atọka lori awọn tabili ti a pin. Fi fun awọn iwọn didun wa, ere jẹ nipa 1TB / ọsẹ!

Bayi jẹ ki a ṣe akiyesi pe terabyte yii tun ni lati gbasilẹ bakan. Iyẹn ni, awa naa awọn disk yẹ ki o bayi fifuye kere! Aworan yii fihan kedere ipa ti o gba lati inu mimọ, eyiti a yasọtọ ni ọsẹ kan:

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

#3. "Ntan" fifuye tente oke

Ọkan ninu awọn iṣoro nla ti awọn ọna ṣiṣe ti kojọpọ jẹ laiṣe amuṣiṣẹpọ diẹ ninu awọn mosi ti ko beere o. Nigbakugba "nitori wọn ko ṣe akiyesi", nigbami "o rọrun ni ọna naa", ṣugbọn pẹ tabi nigbamii o ni lati yọ kuro.

Jẹ ki a sun-un sinu aworan ti tẹlẹ ki o rii pe a ni disk kan "awọn ifasoke" labẹ fifuye pẹlu titobi meji laarin awọn ayẹwo ti o wa nitosi, eyiti o han gbangba “iṣiro” ko yẹ ki o ṣẹlẹ pẹlu iru nọmba awọn iṣẹ ṣiṣe:

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

Eyi jẹ ohun rọrun lati ṣaṣeyọri. A ti bẹrẹ ibojuwo tẹlẹ fere 1000 apèsè, ọ̀kọ̀ọ̀kan wọn ń ṣiṣẹ́ lọ́nà ọgbọ́n orí ọ̀tọ̀ọ̀tọ̀, àti pé òwú ọ̀kọ̀ọ̀kan ń ṣàtúntò ìwífún tí a kójọ láti fi ránṣẹ́ sí ibùdó dátà ní ìwọ̀n ìgbà kan, irú èyí:

setInterval(sendToDB, interval)

Iṣoro naa wa ni pipe ni otitọ pe gbogbo awọn okun bẹrẹ ni iwọn akoko kanna, nítorí náà àwọn àkókò tí wọ́n ń fi ránṣẹ́ fẹ́rẹ̀ẹ́ máa ń bá “dé kókó.” Oops #2...

O da, eyi rọrun pupọ lati ṣatunṣe, fifi a "ID" run-soke nipa akoko:

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

#4. A kaṣe ohun ti a nilo

Awọn kẹta ibile highload isoro ni ko si kaṣe ibi ti o wa Le jẹ.

Fun apẹẹrẹ, a jẹ ki o ṣee ṣe lati ṣe itupalẹ ni awọn ofin ti awọn apa ero (gbogbo iwọnyi Seq Scan on users), ṣugbọn lẹsẹkẹsẹ ro pe wọn jẹ, fun apakan pupọ julọ, kanna - wọn gbagbe.

Rara, nitorinaa, ko si ohunkan ti a kọ si ibi ipamọ data lẹẹkansi, eyi yoo ge okunfa naa pẹlu INSERT ... ON CONFLICT DO NOTHING. Ṣugbọn data yii tun de ibi ipamọ data, ati pe ko ṣe pataki kika lati ṣayẹwo fun rogbodiyan ni lati ṣe. Oops #3...

Iyatọ ninu nọmba awọn igbasilẹ ti a fi ranṣẹ si ibi ipamọ data ṣaaju/lẹhin ti o ti ṣiṣẹ caching jẹ kedere:

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

Ati pe eyi ni idinku ti o tẹle ni fifuye ibi ipamọ:

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

Lapapọ

"Terabyte-fun-ọjọ" o kan dun idẹruba. Ti o ba ṣe ohun gbogbo ti o tọ, lẹhinna eyi jẹ o kan 2^40 baiti / 86400 aaya = ~ 12.5MB/sti o ani tabili IDE skru waye. 🙂

Ṣugbọn ni pataki, paapaa pẹlu “skew” igba mẹwa ti ẹru lakoko ọjọ, o le ni rọọrun pade awọn agbara ti awọn SSD ode oni.

A kọ ni PostgreSQL lori sublight: 1 ogun, 1 ọjọ, 1TB

orisun: www.habr.com

Fi ọrọìwòye kun