Sàbhail sgillinn air meudan mòra ann am PostgreSQL

A’ leantainn leis a’ chuspair a bhith a’ clàradh sruthan dàta mòra a thogadh le artaigil roimhe mu dheidhinn sgaradh, ann an seo seallaidh sinn ris na dòighean anns an urrainn dhut lughdaich meud “corporra” an stuth a tha air a stòradh ann am PostgreSQL, agus a’ bhuaidh aca air coileanadh frithealaiche.

Bruidhnidh sinn mu dheidhinn Roghainnean TOAST agus co-thaobhadh dàta. “Gu cuibheasach,” cha shàbhail na dòighean sin cus ghoireasan, ach gun a bhith ag atharrachadh còd an tagraidh idir.

Sàbhail sgillinn air meudan mòra ann am PostgreSQL
Ach, thionndaidh an t-eòlas againn gu math buannachdail a thaobh seo, leis gu bheil stòradh cha mhòr sgrùdadh sam bith a rèir a nàdar eàrr-ràdh a-mhàin sa mhòr-chuid a thaobh dàta clàraichte. Agus ma tha thu a’ faighneachd ciamar as urrainn dhut an stòr-dàta a theagasg airson sgrìobhadh gu diosc na àite 200MB / s leth uiread — please under cat.

Dìomhaireachd beag dàta mòr

Le pròifil obrach ar seirbhis, bidh iad gu cunbhalach ag itealaich thuige bho na uachdaran pacaidean teacsa.

Agus bhon uairsin VLSI iom-fhillteaig a bheil an stòr-dàta a bhios sinn a’ sgrùdadh na thoradh ioma-phàirteach le structaran dàta iom-fhillte, an uairsin ceistean airson an coileanadh as àirde tionndaidh a-mach gu math mar seo “ioma-mheud” le loidsig algorithmach iom-fhillte. Mar sin tha an àireamh de gach eisimpleir fa leth de dh’ iarrtas no am plana buileachaidh a thig às a dhèidh anns a’ log a thig thugainn a’ tionndadh a-mach gu bhith “gu cuibheasach” gu math mòr.

Bheir sinn sùil air structar aon de na clàran anns am bi sinn a’ sgrìobhadh dàta “amh” - is e sin, seo an teacsa tùsail bhon inntrigeadh loga:

CREATE TABLE rawdata_orig(
  pack -- PK
    uuid NOT NULL
, recno -- PK
    smallint NOT NULL
, dt -- ключ секции
    date
, data -- самое главное
    text
, PRIMARY KEY(pack, recno)
);

Soidhne àbhaisteach (mar-thà air a roinn, gu dearbh, mar sin is e teamplaid earrann a tha seo), far a bheil an teacsa as cudromaiche. Uaireannan gu math voluminous.

Cuimhnich nach urrainn meud “corporra” aon chlàr ann am PG barrachd air aon duilleag dàta a ghabhail, ach tha am meud “loidsigeach” na chùis gu tur eadar-dhealaichte. Gus luach tomhas-lìonaidh (varchar/text/bytea) a sgrìobhadh gu raon, cleachd Teicneòlas TOAST:

Bidh PostgreSQL a’ cleachdadh meud duilleag stèidhichte (mar as trice 8 KB), agus chan eil e a’ leigeil le tuples a dhol thairis air grunn dhuilleagan. Mar sin, tha e do-dhèanta luachan achaidh glè mhòr a stòradh gu dìreach. Gus faighinn thairis air a’ chuingealachadh seo, tha luachan achaidh mòra air an teannachadh agus/no air an roinn thairis air grunn loidhnichean fiosaigeach. Bidh seo a’ tachairt gun mhothachadh leis an neach-cleachdaidh agus chan eil mòran buaidh aige air a’ mhòr-chuid de chòd an fhrithealaiche. Canar TOAST ris an dòigh seo ...

Gu dearbh, airson a h-uile clàr le raointean "a dh'fhaodadh a bhith mòr", gu fèin-obrachail cruthaichear clàr paidhir le “slicing”. gach clàr “mòr” ann an earrannan 2KB:

TOAST(
  chunk_id
    integer
, chunk_seq
    integer
, chunk_data
    bytea
, PRIMARY KEY(chunk_id, chunk_seq)
);

Is e sin, ma dh'fheumas sinn sreang a sgrìobhadh le luach "mòr". data, an uairsin bidh an fhìor chlàradh a’ tachairt chan ann a-mhàin don phrìomh bhòrd agus don PK aige, ach cuideachd do TOAST agus a PK.

A’ lughdachadh buaidh TOAST

Ach chan eil a’ mhòr-chuid de na clàran againn fhathast cho mòr, bu chòir dha a dhol a-steach do 8KB - Ciamar as urrainn dhomh airgead a shàbhaladh air seo? ..

Seo far a bheil am feart a’ tighinn gu ar taic STORAGE aig colbh a’ bhùird:

  • TORAIDHEAN a’ ceadachadh an dà chuid teannachadh agus stòradh air leth. Seo roghainn àbhaisteach airson a’ mhòr-chuid de sheòrsan dàta a tha a’ gèilleadh ri TOAST. Feuchaidh e an-toiseach ri teannachadh a dhèanamh, an uairsin ga stòradh taobh a-muigh a’ bhùird ma tha an sreath fhathast ro mhòr.
  • làimh a’ ceadachadh teannachadh ach gun stòradh air leth. (Gu dearbh, thèid stòradh air leth a dhèanamh fhathast airson na colbhan sin, ach a-mhàin mar an roghainn mu dheireadh, nuair nach eil dòigh eile air an t-sreang a chrìonadh gus am bi e a’ freagairt air an duilleag.)

Gu dearbh, is e seo dìreach a tha a dhìth oirnn airson an teacsa - teannachadh e cho mòr ‘s as urrainn, agus mura h-eil e iomchaidh idir, cuir ann an TOAST e. Faodar seo a dhèanamh gu dìreach air an itealan, le aon òrdugh:

ALTER TABLE rawdata_orig ALTER COLUMN data SET STORAGE MAIN;

Mar a nì thu measadh air a’ bhuaidh

Leis gu bheil an sruth dàta ag atharrachadh a h-uile latha, chan urrainn dhuinn coimeas a dhèanamh eadar àireamhan iomlan, ach ann an teirmean coimeasach roinn nas lugha Sgrìobh sinn sìos e ann an TOAST - cho math 's as fheàrr. Ach tha cunnart ann an seo - mar as motha an tomhas “corporra” de gach clàr fa leth, is ann “nas fharsainge” a thig an clàr-amais, oir feumaidh sinn barrachd dhuilleagan dàta a chòmhdach.

Earrann roimh atharraichean:

heap  = 37GB (39%)
TOAST = 54GB (57%)
PK    =  4GB ( 4%)

Earrann às deidh atharrachaidhean:

heap  = 37GB (67%)
TOAST = 16GB (29%)
PK    =  2GB ( 4%)

Gu dearbh, sinn thòisich mi a’ sgrìobhadh gu TOAST 2 tursan nas lugha, a chuir a-mach chan e a-mhàin an diosc, ach cuideachd an CPU:

Sàbhail sgillinn air meudan mòra ann am PostgreSQL
Sàbhail sgillinn air meudan mòra ann am PostgreSQL
Bheir mi fa-near gu bheil sinn cuideachd air fàs nas lugha ann an “leughadh” an diosc, chan e a-mhàin “sgrìobhadh” - oir nuair a chuireas sinn clàr a-steach do bhòrd, feumaidh sinn cuideachd pàirt de chraobh gach clàr-amais a “leughadh” gus a dhearbhadh. suidheachadh annta san àm ri teachd.

Cò as urrainn a bhith beò gu math air PostgreSQL 11

Às deidh dhuinn ùrachadh gu PG11, chuir sinn romhainn leantainn air adhart le “gleusadh” TOAST agus mhothaich sinn gun robh am paramadair ri fhaighinn airson gleusadh a’ tòiseachadh bhon dreach seo. toast_tuple_target:

Cha bhith an còd giollachd TOAST a’ losgadh ach nuair a tha luach na loidhne a tha ri stòradh sa chlàr nas motha na TOAST_TUPLE_THRESHOLD bytes (2 KB mar as trice). Bidh an còd TOAST a’ teannachadh agus/no a’ gluasad luachan raoin a-mach às a’ chlàr gus am bi luach na loidhne nas ìsle na TOAST_TUPLE_TARGET bytes (luach caochlaideach, cuideachd mar as trice 2 KB) air neo nach gabh am meud a lughdachadh.

Cho-dhùin sinn gu bheil an dàta a bhios againn mar as trice an dàrna cuid “glè ghoirid” no “glè fhada”, agus mar sin chuir sinn romhainn sinn fhìn a chuingealachadh chun luach as ìsle a tha comasach:

ALTER TABLE rawplan_orig SET (toast_tuple_target = 128);

Chì sinn mar a thug na roghainnean ùra buaidh air luchdachadh diosc às deidh an ath-dhealbhadh:

Sàbhail sgillinn air meudan mòra ann am PostgreSQL
Chan eil sin dona! Cuibheasach tha an ciudha chun diosc air a dhol sìos timcheall air 1.5 uair, agus tha an diosc “trang” 20 sa cheud! Ach is dòcha gun tug seo buaidh air dòigh air an CPU?

Sàbhail sgillinn air meudan mòra ann am PostgreSQL
Co-dhiù cha do dh'fhàs e na bu mhiosa. Ged, tha e duilich breithneachadh a bheil eadhon na h-àireamhan sin fhathast comasach air an luchd cuibheasach CPU àrdachadh nas àirde 5%.

Le bhith ag atharrachadh àiteachan nan teirmean, bidh an t-suim... ag atharrachadh!

Mar a tha fios agad, bidh sgillinn a’ sàbhaladh rubles, agus leis na meudan stòraidh againn tha e mu dheidhinn 10TB / mìos faodaidh eadhon beagan optimization prothaid mhath a thoirt seachad. Mar sin, thug sinn aire do structar fiosaigeach ar dàta - dè dìreach raointean “cruachadh” am broinn a’ chlàir gach aon de na bùird.

Air sgàth air sgàth co-thaobhadh dàta tha seo dìreach air adhart toirt buaidh air an tomhas-lìonaidh a thig às:

Bidh mòran ailtireachd a’ toirt seachad co-thaobhadh dàta air crìochan facal inneal. Mar eisimpleir, air siostam 32-bit x86, bidh slán-àireamhan (seòrsa integer, 4 bytes) air an co-thaobhadh ri crìoch facal 4-byte, agus cuideachd àireamhan puing-fleòdraidh mionaideachd dùbailte (puing fleòdraidh mionaideachd dùbailte, 8 bytes). Agus air siostam 64-bit, bidh luachan dùbailte air an co-thaobhadh ri crìochan facal 8-byte. 'S e seo adhbhar eile airson neo-fhreagarrachd.

Air sgàth co-thaobhadh, tha meud sreath bùird an urra ri òrdugh nan raointean. Mar as trice chan eil a 'bhuaidh seo gu math follaiseach, ach ann an cuid de chùisean faodaidh e leantainn gu àrdachadh mòr ann am meud. Mar eisimpleir, ma mheasgaicheas tu char(1) agus achaidhean iomlan, mar as trice bidh 3 bytes air an caitheamh eatorra.

Feuch an tòisich sinn le modalan synthetigeach:

SELECT pg_column_size(ROW(
  '0000-0000-0000-0000-0000-0000-0000-0000'::uuid
, 0::smallint
, '2019-01-01'::date
));
-- 48 байт

SELECT pg_column_size(ROW(
  '2019-01-01'::date
, '0000-0000-0000-0000-0000-0000-0000-0000'::uuid
, 0::smallint
));
-- 46 байт

Cò às a thàinig dhà no dhà a bharrachd anns a’ chiad chùis? Tha e sìmplidh - Smallint 2-byte co-thaobhadh air crìoch 4-byte ron ath achadh, agus nuair a tha e am fear mu dheireadh, chan eil dad agus chan eil feum air co-thaobhadh.

Ann an teòiridh, tha a h-uile dad gu math agus faodaidh tu na raointean ath-rèiteachadh mar a thogras tu. Feuch an toir sinn sùil air fìor dhàta a ’cleachdadh eisimpleir aon de na clàran, agus tha an earrann làitheil dheth a’ fuireach 10-15GB.

Structar tùsail:

CREATE TABLE public.plan_20190220
(
-- Унаследована from table plan:  pack uuid NOT NULL,
-- Унаследована from table plan:  recno smallint NOT NULL,
-- Унаследована from table plan:  host uuid,
-- Унаследована from table plan:  ts timestamp with time zone,
-- Унаследована from table plan:  exectime numeric(32,3),
-- Унаследована from table plan:  duration numeric(32,3),
-- Унаследована from table plan:  bufint bigint,
-- Унаследована from table plan:  bufmem bigint,
-- Унаследована from table plan:  bufdsk bigint,
-- Унаследована from table plan:  apn uuid,
-- Унаследована from table plan:  ptr uuid,
-- Унаследована from table plan:  dt date,
  CONSTRAINT plan_20190220_pkey PRIMARY KEY (pack, recno),
  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),
  CONSTRAINT plan_20190220_dt_check CHECK (dt = '2019-02-20'::date)
)
INHERITS (public.plan)

Earrann às deidh òrdugh colbh atharrachadh - dìreach na h-aon raointean, dìreach òrdugh eadar-dhealaichte:

CREATE TABLE public.plan_20190221
(
-- Унаследована from table plan:  dt date NOT NULL,
-- Унаследована from table plan:  ts timestamp with time zone,
-- Унаследована from table plan:  pack uuid NOT NULL,
-- Унаследована from table plan:  recno smallint NOT NULL,
-- Унаследована from table plan:  host uuid,
-- Унаследована from table plan:  apn uuid,
-- Унаследована from table plan:  ptr uuid,
-- Унаследована from table plan:  bufint bigint,
-- Унаследована from table plan:  bufmem bigint,
-- Унаследована from table plan:  bufdsk bigint,
-- Унаследована from table plan:  exectime numeric(32,3),
-- Унаследована from table plan:  duration numeric(32,3),
  CONSTRAINT plan_20190221_pkey PRIMARY KEY (pack, recno),
  CONSTRAINT chck_ptr CHECK (ptr IS NOT NULL),
  CONSTRAINT plan_20190221_dt_check CHECK (dt = '2019-02-21'::date)
)
INHERITS (public.plan)

Tha meud iomlan na h-earrainn air a dhearbhadh leis an àireamh de “fìrinnean” agus tha e an urra ri pròiseasan taobh a-muigh a-mhàin, mar sin roinnidh sinn meud a’ charn (pg_relation_size) leis an àireamh de chlàran a tha ann - is e sin, gheibh sinn meud cuibheasach de fhìor chlàr a chaidh a stòradh:

Sàbhail sgillinn air meudan mòra ann am PostgreSQL
Nas lugha na 6% tomhas-lìonaidh, Sgoinneil!

Ach chan eil a h-uile dad, gu dearbh, cho rosy - às deidh a h-uile càil, ann an clàran-amais chan urrainn dhuinn òrdugh nan raointean atharrachadh, agus mar sin "san fharsaingeachd" (pg_total_relation_size) ...

Sàbhail sgillinn air meudan mòra ann am PostgreSQL
...fhathast an seo cuideachd sàbhail 1.5%gun a bhith ag atharrachadh aon loidhne de chòd. Tha, tha!

Sàbhail sgillinn air meudan mòra ann am PostgreSQL

Tha mi a’ toirt fa-near nach e an roghainn gu h-àrd airson raointean a chuir air dòigh an fhìrinn gur e seo an rud as fheàrr. Leis nach eil thu airson cuid de bhlocaichean de raointean a “reubadh” airson adhbharan bòidhchead - mar eisimpleir, càraid (pack, recno), is e sin am PK airson a’ chlàr seo.

San fharsaingeachd, is e gnìomh gu math sìmplidh “feachd brùideil” a th’ ann a bhith a’ dearbhadh an rèiteachadh “as ìsle” de raointean. Mar sin, gheibh thu toraidhean eadhon nas fheàrr bhon dàta agad na an fheadhainn againn - feuch e!

Source: www.habr.com

Cuir beachd ann