Messenger database (Bahin 2): pagbahin "para sa ganansya"

Malampuson namon nga gidesinyo ang istruktura sa among database sa PostgreSQL alang sa pagtipig sa mga sulat, usa ka tuig ang milabay, ang mga tiggamit aktibo nga nagpuno niini, ug karon milyon nga mga rekord, ug ... adunay nagsugod sa pagpahinay sa tanan.

Messenger database (Bahin 2): pagbahin "para sa ganansya"
Point mao nga uban sa pagtubo sa gidaghanon sa lamesa, ang "kalalim" sa mga indeks usab motubo - bisan pa sa logarithmically. Apan sa paglabay sa panahon gipugos niini ang server nga buhaton ang parehas nga mga buluhaton sa pagbasa / pagsulat pagproseso sa daghang mga higayon nga mas daghang panid sa datoskaysa sa sinugdanan.

Dinhi kini moabut sa pagluwas sectioning.

Namatikdan nako nga dili kini bahin sa sharding, nga mao, ang pag-apod-apod sa datos tali sa lainlaing mga database o server. Tungod kay bisan ang pagbahin sa datos pinaagi sa daghan mga server, dili nimo makuha ang problema sa "paghubag" nga mga indeks sa paglabay sa panahon. Kini mao ang tin-aw nga kon kamo makahimo sa pagbutang sa usa ka bag-o nga server ngadto sa operasyon sa matag adlaw, nan ang imong mga problema dili na mamakak sa eroplano sa usa ka partikular nga database.

Atong hisgotan ang dili espesipikong mga script alang sa pagpatuman sa partitioning "sa hardware", apan ang pamaagi mismo - unsa ug sa unsang paagi kinahanglan nga "giputol sa mga hiwa", ug kung unsa ang gitinguha sa ingon.

Konsepto

Sa makausa pa, among gihubit ang among tumong: gusto namo nga masiguro nga karon, ugma, ug usa ka tuig sa ulahi, ang gidaghanon sa datos nga gibasa sa PostgreSQL alang sa bisan unsang operasyon sa pagbasa/pagsulat nagpabilin nga halos pareho.

Alang sa bisan unsa kronolohikal nga natipon nga datos (mga mensahe, mga dokumento, mga troso, mga archive, ...) ang natural nga pagpili alang sa usa ka partition key mao petsa/oras sa panghitabo. Sa among kaso, kini nga panghitabo sa higayon nga gipadala ang mensahe.

Timan-i nga ang mga tiggamit hapit kanunay pagtrabaho lamang uban sa pinakabag-o ang ingon nga datos - gibasa nila ang pinakabag-o nga mga mensahe, pag-analisar sa pinakabag-o nga mga troso, ... Dili, siyempre, mahimo silang mag-scroll pa balik sa panahon, panagsa ra nila kini buhaton.

Gikan niini nga mga pagdili, kini nahimong dayag nga ang labing maayo nga solusyon alang sa mga mensahe mao ang "adlaw-adlaw" nga mga seksyon - human sa tanan, halos kanunay ang atong user magbasa unsa ang miabut kaniya "karon" o "kagahapon".

Kon kita magsulat ug magbasa halos sa usa ka seksyon lamang sa maadlaw, nan kini naghatag usab kanato mas episyente nga memorya ug paggamit sa disk - tungod kay ang tanan nga mga indeks sa seksyon dali nga mohaum sa RAM, sukwahi sa "dako ug tambok" sa tibuok lamesa.

lakang

Sa kinatibuk-an, ang tanan sa ibabaw daw usa ka dako nga ganansya. Ug kini makab-ot, apan alang niini kita kinahanglan nga magtrabaho og maayo - tungod kay ang desisyon sa pagbahin sa usa sa mga entidad modala ngadto sa panginahanglan sa "nakakita" ug nakig-uban.

Mensahe, mga kabtangan niini ug mga projection

Tungod kay nakahukom kami nga putlon ang mga mensahe pinaagi sa mga petsa, makatarunganon usab nga bahinon ang entity-properties nga nagsalig kanila (gilakip nga mga file, lista sa mga nakadawat), ug usab pinaagi sa post date.

Tungod kay ang usa sa among kasagaran nga mga buluhaton mao ang pagtan-aw lamang sa mga rehistro sa mensahe (wala pa mabasa, umaabot, tanan), makatarunganon usab nga "i-draw" kini sa pag-section sa mga petsa sa mensahe.

Messenger database (Bahin 2): pagbahin "para sa ganansya"

Gidugang namon ang yawe sa partisyon (petsa sa mensahe) sa tanan nga mga lamesa: mga nakadawat, file, mga rehistro. Dili ka makadugang sa mensahe mismo, apan gamita ang kasamtangan nga DateTime.

hilo

Tungod kay ang hilisgutan usa alang sa daghang mga mensahe, dili mahimo nga "pagputol" kini sa parehas nga modelo, kinahanglan nga magsalig sa lain nga butang. Hingpit alang sa among kaso. petsa sa unang mensahe sa sulat - nga mao, ang higayon sa paglalang, sa pagkatinuod, sa hilisgutan.

Messenger database (Bahin 2): pagbahin "para sa ganansya"

Pagdugang usa ka partition key (petsa sa hilisgutan) sa tanan nga mga lamesa: hilisgutan, miyembro.

Apan karon adunay duha ka problema sa usa ka higayon:

  • asa nga seksyon mangita alang sa mga mensahe sa hilisgutan?
  • asa nga seksyon pangitaon ang hilisgutan sa mensahe?

Mahimo nimo, siyempre, magpadayon sa pagpangita sa tanan nga mga seksyon, apan kini makapasubo kaayo, ug isalikway ang tanan namon nga mga kadaugan. Busa, aron mahibal-an kung asa eksakto nga tan-awon, maghimo kami mga lohikal nga mga link / pointer sa mga seksyon:

  • idugang sa mensahe field sa petsa sa hilisgutan
  • idugang sa topiko gitakda ang petsa sa mensahe kini nga sulat (mahimo nimong gamiton ang usa ka lahi nga lamesa, o mahimo nimong gamiton ang usa ka han-ay sa mga petsa)

Messenger database (Bahin 2): pagbahin "para sa ganansya"

Tungod kay adunay pipila nga mga pagbag-o sa lista sa mga petsa sa mensahe alang sa matag indibidwal nga mga sulat (human sa tanan, hapit tanan nga mga mensahe mahulog sa 1-2 nga kasikbit nga mga adlaw), akong ipunting kini nga kapilian.

Sa kinatibuk-an, ang istruktura sa among database mikuha sa mosunod nga porma, nga gikonsiderar ang partitioning:

Mga lamesa : RU

-- сСкции ΠΏΠΎ Π΄Π°Ρ‚Π΅ сообщСния
CREATE TABLE "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅_YYYYMMDD"(
  "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅"
    uuid
      PRIMARY KEY
, "Π’Π΅ΠΌΠ°"
    uuid
, "Π”Π°Ρ‚Π°Π’Π΅ΠΌΡ‹"
    date
, "Автор"
    uuid
, "ДатаВрСмя" -- ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΊΠ°ΠΊ Π΄Π°Ρ‚Ρƒ
    timestamp
, "ВСкст"
    text
);

CREATE TABLE "АдрСсат_YYYYMMDD"(
  "ДатаБообщСния"
    date
, "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅"
    uuid
, "ΠŸΠ΅Ρ€ΡΠΎΠ½Π°"
    uuid
, PRIMARY KEY("Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅", "ΠŸΠ΅Ρ€ΡΠΎΠ½Π°")
);

CREATE TABLE "Π€Π°ΠΉΠ»_YYYYMMDD"(
  "ДатаБообщСния"
    date
, "Π€Π°ΠΉΠ»"
    uuid
      PRIMARY KEY
, "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅"
    uuid
, "BLOB"
    uuid
, "Имя"
    text
);

CREATE TABLE "РССстрБообщСний_YYYYMMDD"(
  "ДатаБообщСния"
    date
, "Π’Π»Π°Π΄Π΅Π»Π΅Ρ†"
    uuid
, "ВипРССстра"
    smallint
, "ДатаВрСмя"
    timestamp
, "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅"
    uuid
, PRIMARY KEY("Π’Π»Π°Π΄Π΅Π»Π΅Ρ†", "ВипРССстра", "Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅")
);
CREATE INDEX ON "РССстрБообщСний_YYYYMMDD"("Π’Π»Π°Π΄Π΅Π»Π΅Ρ†", "ВипРССстра", "ДатаВрСмя" DESC);

-- сСкции ΠΏΠΎ Π΄Π°Ρ‚Π΅ Ρ‚Π΅ΠΌΡ‹
CREATE TABLE "Π’Π΅ΠΌΠ°_YYYYMMDD"(
  "Π”Π°Ρ‚Π°Π’Π΅ΠΌΡ‹"
    date
, "Π’Π΅ΠΌΠ°"
    uuid
      PRIMARY KEY
, "Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚"
    uuid
, "НазваниС"
    text
);

CREATE TABLE "УчастникВСмы_YYYYMMDD"(
  "Π”Π°Ρ‚Π°Π’Π΅ΠΌΡ‹"
    date
, "Π’Π΅ΠΌΠ°"
    uuid
, "ΠŸΠ΅Ρ€ΡΠΎΠ½Π°"
    uuid
, PRIMARY KEY("Π’Π΅ΠΌΠ°", "ΠŸΠ΅Ρ€ΡΠΎΠ½Π°")
);

CREATE TABLE "Π”Π°Ρ‚Ρ‹Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠΉΠ’Π΅ΠΌΡ‹_YYYYMMDD"(
  "Π”Π°Ρ‚Π°Π’Π΅ΠΌΡ‹"
    date
, "Π’Π΅ΠΌΠ°"
    uuid
      PRIMARY KEY
, "Π”Π°Ρ‚Π°"
    date
);

Pagtipig og usa ka nindot nga sentimos

Aw, unsa kaha kung atong gamiton classic nga seksyon. base sa pag-apod-apod sa mga kantidad sa uma (pinaagi sa mga trigger ug kabilin o PARTITION BY), apan "manual" sa lebel sa aplikasyon, imong makita nga ang kantidad sa yawe sa partitioning gitipigan na sa ngalan sa lamesa mismo.

Busa kung ikaw mao nabalaka kaayo bahin sa gidaghanon sa datos nga gitipigan, unya mahimo nimong tangtangon kining mga "dugang" nga mga natad ug espesipikong adres sa mga piho nga lamesa. Tinuod, ang tanan nga mga pagpili gikan sa daghang mga seksyon sa kini nga kaso kinahanglan nga ibalhin sa bahin sa aplikasyon.

Source: www.habr.com

Idugang sa usa ka comment