Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

Dènyèman mwen te di ou ki jan, lè l sèvi avèk resèt estanda ogmante pèfòmans nan demann SQL lekti soti nan baz done PostgreSQL. Jodi a nou pral pale sou ki jan anrejistreman ka fè pi efikas nan baz done a san yo pa itilize okenn "torsion" nan konfigirasyon an - tou senpleman pa kòrèkteman òganize koule done yo.

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

#1. Seksyon

Yon atik sou kijan ak poukisa li vo òganize aplike patisyon "an teyori" te deja, isit la nou pral pale sou pratik nan aplike kèk apwòch nan nou an sèvis siveyans pou dè santèn de serveurs PostgreSQL.

"Bagay nan jou ki te pase..."

Okòmansman, tankou nenpòt ki MVP, pwojè nou an te kòmanse anba yon chaj san patipri lejè - siveyans te pote soti sèlman pou yon douzèn nan sèvè ki pi kritik yo, tout tab yo te relativman kontra enfòmèl ant... Men, kòm tan te pase, kantite lame kontwole te vin pi plis. ak plis ankò, ak yon lòt fwa ankò nou te eseye fè yon bagay ak youn nan tab 1.5TB nan gwosè, nou reyalize ke byenke li te posib kontinye viv konsa, li te trè enkonvenyan.

Tan yo te prèske tankou tan sezon, diferan vèsyon PostgreSQL 9.x te enpòtan, kidonk tout patisyon yo te dwe fè "manyèlman" - atravè eritaj tab la ak deklannche routage ak dinamik EXECUTE.

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB
Solisyon an ki kapab lakòz te tounen ase inivèsèl ke li ta ka tradui nan tout tab:

  • Yo te deklare yon tab paran "tèt" vid, ki te dekri tout endèks ki nesesè yo ak deklanche.
  • Dosye a soti nan pwen de vi kliyan an te fè nan "rasin" tab la, ak entèn lè l sèvi avèk deklanche routage BEFORE INSERT dosye a te "fizikman" antre nan seksyon ki nesesè yo. Si pa t 'gen bagay konsa ankò, nou te kenbe yon eksepsyon ak...
  • … lè ​​l sèvi avèk CREATE TABLE ... (LIKE ... INCLUDING ...) te kreye ki baze sou modèl tab paran an seksyon ki gen yon restriksyon sou dat ou vle ase konsa ke lè done yo rekipere, lekti fèt sèlman nan li.

PG10: premye tantativ

Men, patisyon atravè eritaj istorikman pa te byen adapte pou fè fas ak yon kouran ekri aktif oswa yon gwo kantite patisyon timoun. Pou egzanp, ou ka sonje ke algorithm pou chwazi seksyon ki nesesè yo te genyen konpleksite kwadratik, ke li travay ak 100+ seksyon, ou menm ou konprann ki jan...

Nan PG10 sitiyasyon sa a te anpil optimize pa mete ann aplikasyon sipò patisyon natif natal. Se poutèt sa, nou imedyatman te eseye aplike li imedyatman apre migrasyon depo a, men...

Kòm li te tounen soti apre fouye nan manyèl la, tab la patisyon natif natal nan vèsyon sa a se:

  • pa sipòte deskripsyon endèks
  • pa sipòte deklanche sou li
  • pa ka "desandan" pèsonn
  • pa sipòte INSERT ... ON CONFLICT
  • pa ka jenere yon seksyon otomatikman

Lè nou te resevwa yon souflèt douloure nan fwon an ak yon rato, nou reyalize ke li ta enposib fè san yo pa modifye aplikasyon an, ak ranvwaye plis rechèch pou sis mwa.

PG10: dezyèm chans

Se konsa, nou te kòmanse rezoud pwoblèm yo ki te parèt youn pa youn:

  1. Paske deklanche ak ON CONFLICT Nou te jwenn ke nou toujou bezwen yo isit la epi la, kidonk nou te fè yon etap entèmedyè travay yo deyò tab prokurasyon.
  2. Debarase m de "routage" nan deklannche - se sa ki, soti nan EXECUTE.
  3. Yo pran li separeman tab modèl ak tout endèkspou yo pa menm prezan nan tab prokurasyon an.

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB
Finalman, apre tout bagay sa yo, nou divize tab prensipal la natif natal. Kreyasyon yon nouvo seksyon toujou kite konsyans aplikasyon an.

"Sawing" diksyonè

Kòm nan nenpòt sistèm analyse, nou menm tou nou te genyen "reyalite" ak "koupe" (diksyonè). Nan ka nou an, nan kapasite sa a yo te aji, pou egzanp, kò modèl demann ralanti menm jan an oswa tèks la nan rechèch la li menm.

"Reyalite" yo te seksyon pa jou pou yon tan long deja, kidonk nou ak kalm efase seksyon demode, epi yo pa t 'deranje nou (mòso bwa!). Men, te gen yon pwoblèm ak diksyonè...

Pa di ke te gen anpil nan yo, men apeprè 100TB "reyalite" te lakòz yon diksyonè 2.5TB. Ou pa ka fasilman efase anyen nan yon tab konsa, ou pa ka konprese li nan tan ase, epi ekri li piti piti te vin pi dousman.

Tankou yon diksyonè... ladan l, chak antre ta dwe prezante egzakteman yon fwa... e sa a kòrèk, men!.. Pa gen moun ki anpeche nou gen yon diksyonè apa pou chak jou! Wi, sa a pote yon sèten redondance, men li pèmèt:

  • ekri/li pi vit akòz pi piti gwosè seksyon
  • konsome mwens memwa pa travay ak plis endis kontra enfòmèl ant
  • estoke mwens done akòz kapasite nan byen vit retire demode

Kòm yon rezilta nan konplèks la antye nan mezi CPU chaj diminye pa ~ 30%, chaj disk pa ~ 50%:

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB
An menm tan an, nou kontinye ekri egzakteman menm bagay la nan baz done a, jis ak mwens chaj.

#2. Evolisyon baz done ak refactoring

Se konsa, nou rezoud sou sa nou genyen chak jou gen seksyon pa li ak done. Aktyèlman, CHECK (dt = '2018-10-12'::date) — epi gen yon kle patisyon ak kondisyon pou yon dosye tonbe nan yon seksyon espesifik.

Depi tout rapò nan sèvis nou yo bati nan kontèks yon dat espesifik, endèks yo pou yo depi "tan ki pa patisyone" yo te tout kalite. (Sèvè, Dat, Modèl plan), (Sèvè, Dat, Plan ne), (Dat, Klas erè, sèvè), ...

Men kounye a yo ap viv sou chak seksyon kopi ou yo chak endèks sa yo... Ak nan chak seksyon dat se yon konstan... Li sanble ke kounye a nou yo nan chak endèks sa yo tou senpleman antre nan yon konstan kòm youn nan jaden yo, ki ogmante tou de volim li yo ak tan rechèch la pou li, men li pa pote okenn rezilta. Yo kite rato a pou tèt yo, oops...

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB
Direksyon an nan optimize se evidan - senp retire jaden dat la nan tout endèks sou tab partisyone. Bay volim nou yo, benefis la se sou 1TB / semèn!

Koulye a, annou sonje ke teraocte sa a te toujou dwe anrejistre yon jan kanmenm. Sa vle di, nou menm tou Disk la ta dwe kounye a chaje mwens! Foto sa a montre klèman efè a te jwenn nan netwayaj la, ke nou te konsakre yon semèn:

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

#3. "Gaye" chaj la pik

Youn nan gwo pwoblèm yo nan sistèm chaje se senkronizasyon redondants kèk operasyon ki pa mande pou li. Pafwa "paske yo pa t 'avi", pafwa "li te pi fasil nan fason sa a", men pi bonè oswa pita ou gen debarase m de li.

Ann rale sou foto anvan an epi wè ke nou gen yon disk "ponp" anba chaj la ak anplitid doub ant echantiyon adjasan yo, ki klèman "estatistik" pa ta dwe rive ak yon kantite operasyon konsa:

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

Sa a se byen fasil reyalize. Nou deja komanse siveyans prèske 1000 serveurs, yo chak trete pa yon fil lojik separe, ak chak fil reset enfòmasyon yo akimile yo dwe voye nan baz done a nan yon frekans sèten, yon bagay tankou sa a:

setInterval(sendToDB, interval)

Pwoblèm nan isit la manti jisteman nan lefèt ke tout fil kòmanse nan apeprè menm tan an, kidonk lè yo voye yo prèske toujou kowenside "nan pwen an." Oop #2...

Erezman, sa a se byen fasil yo ranje, ajoute yon "o aza" kouri-up pa tan:

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

#4. Nou kachèt sa nou bezwen

Twazyèm pwoblèm tradisyonèl highload se pa gen kachèt kote li ye te kapab dwe.

Pou egzanp, nou te fè li posib analize an tèm de nœuds plan (tout bagay sa yo Seq Scan on users), men imedyatman panse ke yo, pou pati ki pi, menm bagay la - yo bliye.

Non, nan kou, pa gen anyen ki ekri nan baz done a ankò, sa a koupe deklanche a ak INSERT ... ON CONFLICT DO NOTHING. Men, done sa yo toujou rive nan baz done a, epi li pa nesesè lekti pou tcheke si gen konfli gen pou fè. Oop #3...

Diferans ki genyen nan kantite dosye yo voye nan baz done a anvan/apre kachèt yo aktive se evidan:

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

Epi sa a se gout ki akonpaye nan chaj depo:

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

Nan total

"Terabyte-pa-jou" jis son pè. Si ou fè tout bagay byen, Lè sa a, sa a se jis 2^40 bytes / 86400 segonn = ~12.5MB/ske menm Desktop IDE vis ki te fèt. 🙂

Men, seryezman, menm ak yon dis fwa "skew" nan chaj la pandan jounen an, ou ka fasilman satisfè kapasite yo nan SSD modèn.

Nou ekri nan PostgreSQL sou sublight: 1 lame, 1 jou, 1TB

Sous: www.habr.com

Add nouvo kòmantè