Махзани маълумотҳои Messenger (қисми 2): тақсимоти "барои фоида"

Мо сохтори пойгоҳи додаҳои PostgreSQL-и худро барои нигоҳ доштани мукотиба бомуваффақият тарҳрезӣ кардем, як сол гузашт, корбарон онро фаъолона пур мекунанд ва ҳоло он дорои миллионҳо сабтҳо, ва... чизе суст шудан гирифт.

Махзани маълумотҳои Messenger (қисми 2): тақсимоти "барои фоида"
Пойнт аст, ки Дар баробари калон шудани андозаи ҷадвал, "умқи"-и индексҳо низ меафзояд. — гарчанде ки ба таври логарифмй. Аммо бо мурури замон ин серверро маҷбур мекунад, ки ҳамон вазифаҳои хондан/навиштро иҷро кунад Саҳифаҳои зиёдтари маълумотро коркард мекунандназар ба ибтидо.

Ин аст, ки он ба наҷот меояд тақсим кардан.

Биёед қайд намоям, ки мо дар бораи sharding, яъне паҳн кардани маълумот байни пойгоҳи додаҳо ё серверҳои гуногун сухан намегӯем. Зеро ҳатто тақсим кардани маълумот ба якчанд серверҳо, шумо бо мурури замон аз мушкилоти "дабдабанок" шудани индексҳо халос намешавед. Равшан аст, ки агар шумо тавонед ҳар рӯз сервери навро ба кор андозед, пас мушкилоти шумо дигар дар як пойгоҳи додаҳои мушаххас намехоҳанд.

Мо на скриптҳои мушаххасро барои татбиқи тақсимоти "дар сахтафзор" баррасӣ хоҳем кард, балки худи равиш - чӣ ва чӣ гуна бояд "ба бурида" бурида шавад ва чунин хоҳиш ба чӣ оварда мерасонад.

Консепсия

Биёед бори дигар ҳадафи худро муайян кунем: мо мехоҳем боварӣ ҳосил кунем, ки имрӯз, фардо ва дар як сол миқдори маълумоте, ки PostgreSQL ҳангоми ҳама гуна амалиёти хондан/навиштан хонда мешавад, тақрибан бетағйир боқӣ мемонад.

Барои ягон маълумотҳои аз ҷиҳати хронологӣ ҷамъшуда (паёмҳо, ҳуҷҷатҳо, гузоришҳо, бойгонӣ, ...) интихоби табиӣ ҳамчун калиди тақсимкунӣ мебошад сана/вақти ҳодиса. Дар мо бошад, чунин ходиса лаҳзаи фиристодани паём.

Дар хотир доред, ки корбарон қариб ҳамеша танхо бо «навтаринхо» кор кунед чунин маълумот - онҳо паёмҳои охиринро мехонанд, гузоришҳои охиринро таҳлил мекунанд, ... Не, албатта, онҳо метавонанд дар вақташ ба ақиб ҳаракат кунанд, аммо онҳо ин корро хеле кам мекунанд.

Аз ин маҳдудиятҳо маълум аст, ки ҳалли оптималии паём хоҳад буд бахшҳои "ҳаррӯза" - охир, корбари мо қариб ҳамеша он чизеро, ки ба ӯ "имрӯз" ё "дирӯз" омадааст, мехонад.

Агар мо дар давоми рӯз қариб танҳо дар як бахш нависем ва хонем, пас ин ба мо низ медиҳад самараноктар истифода бурдани хотира ва диск - зеро ҳамаи индексҳои бахш ба осонӣ ба RAM мувофиқат мекунанд, дар муқоиса бо индексҳои "калон ва фарбеҳ" дар тамоми ҷадвал.

қадам ба қадам

Умуман, ҳама чизе, ки дар боло гуфта шудааст, ба як фоидаи доимӣ монанд аст. Ва ин имконпазир аст, аммо барои ин мо бояд сахт кӯшиш кунем - зеро қарор дар бораи тақсим кардани яке аз субъектҳо ба зарурати "дидан" -и алоқаманд оварда мерасонад.

Паём, хосиятҳо ва пешгӯиҳои он

Азбаски мо тасмим гирифтем, ки паёмҳоро аз рӯи санаҳо ҷудо кунем, инчунин тақсим кардани объектҳо-хусусиятҳое, ки аз онҳо вобастаанд (файлҳои замимашуда, рӯйхати қабулкунандагон) ва инчунин аз рӯи санаи паём.

Азбаски яке аз вазифаҳои маъмулии мо дақиқ дидани реестрҳои паёмҳо (хондашуда, воридшаванда, ҳама) мебошад, инчунин мантиқӣ кашидани онҳо ба тақсимот аз рӯи санаҳои паёмҳо.

Махзани маълумотҳои Messenger (қисми 2): тақсимоти "барои фоида"

Мо калиди тақсимкуниро (санаи паём) ба ҳама ҷадвалҳо илова мекунем: қабулкунандагон, файлҳо, реестрҳо. Ба шумо лозим нест, ки онро ба худи паём илова кунед, аммо DateTime-и мавҷударо истифода баред.

мунозирот

Азбаски барои якчанд паёмҳо танҳо як мавзӯъ вуҷуд дорад, ҳеҷ гуна роҳи "буридан" дар як модел вуҷуд надорад; шумо бояд ба чизи дигар такя кунед. Дар ҳолати мо он идеалӣ аст санаи аввалин паёми мукотиба — яъне лахзаи эчодй, дар хакикат мавзуъ.

Махзани маълумотҳои Messenger (қисми 2): тақсимоти "барои фоида"

Калиди тақсимкуниро (санаи мавзӯъ) ба ҳамаи ҷадвалҳо илова кунед: мавзӯъ, иштирокчӣ.

Аммо ҳоло мо якбора ду мушкилот дорем:

  • Дар кадом бахш ман бояд паёмҳоро дар мавзӯъ ҷустуҷӯ кунам?
  • Дар кадом бахш мавзӯъро аз паём ҷустуҷӯ кунам?

Мо, албатта, метавонем ҷустуҷӯро дар ҳама бахшҳо идома диҳем, аммо ин хеле ғамгин хоҳад буд ва ҳамаи бурдҳои моро рад мекунад. Аз ин рӯ, барои донистани он ки ба куҷо бояд нигарем, мо ба бахшҳо истинодҳои мантиқӣ / ишоракунакҳо месозем:

  • мо дар хабар илова мекунем майдони санаи мавзӯъ
  • ба мавзуъ илова мекунем таъини санаи паём ин мукотиба (метавонад ҷадвали алоҳида ё маҷмӯи санаҳо бошад)

Махзани маълумотҳои Messenger (қисми 2): тақсимоти "барои фоида"

Азбаски дар рӯйхати санаҳои паёмҳо барои ҳар як мукотибаи инфиродӣ каме тағирот ворид карда мешавад (дар ниҳоят, қариб ҳама паёмҳо ба 1-2 рӯзи наздик рост меоянд), ман ба ин вариант таваҷҷӯҳ мекунам.

Дар маҷмӯъ, сохтори базаи мо бо назардошти тақсимкунӣ шакли зеринро гирифт:

Ҷадвалҳо: 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
);

Як динори зебо сарфа кунед

Хуб, агар мо истифода накунем варианти тақсимоти классикӣ дар асоси тақсимоти арзишҳои майдон (тавассути триггерҳо ва мерос ё PARTITION BY) ва "дастӣ" дар сатҳи барнома, шумо хоҳед дид, ки арзиши калиди тақсимкунӣ аллакай дар номи худи ҷадвал нигоҳ дошта мешавад.

Пас, агар шумо чунин бошед Оё шумо дар бораи миқдори маълумоти захирашуда хеле нигарон ҳастед?, пас шумо метавонед аз ин майдонҳои "иловагӣ" халос шавед ва ба ҷадвалҳои мушаххас муроҷиат кунед. Дуруст аст, ки ҳама интихобҳо аз якчанд бахшҳо дар ин ҳолат бояд ба тарафи ариза интиқол дода шаванд.

Манбаъ: will.com

Илова Эзоҳ