Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

Ба наздикӣ ман ба шумо гуфтам, ки чӣ тавр, бо истифода аз меъ- стандартӣ баланд бардоштани самаранокии дархостҳои хондани SQL аз пойгоҳи додаҳои PostgreSQL. Имрӯз мо дар бораи он сӯҳбат хоҳем кард сабт кардан мумкин аст, самараноктар анҷом дода мешавад дар базаи маълумот бе истифодаи ягон "каҷҳо" дар конфигуратсия - танҳо бо роҳи дуруст ташкил кардани ҷараёни додаҳо.

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

#1. Тақсимкунӣ

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

— Воқеаҳои рӯзҳо гузаштанд...

Дар аввал, мисли ҳама гуна MVP, лоиҳаи мо дар зери сарбории хеле сабук оғоз ёфт - мониторинг танҳо барои даҳ сервери муҳимтарин гузаронида шуд, ҳама ҷадвалҳо нисбатан зич буданд... Аммо бо мурури замон шумораи ҳостҳои назоратшаванда торафт бештар мешуд. , ва бори дигар мо кӯшиш ба коре бо яке аз мизҳои андозаи 1.5TB, мо фахмидем, ки гарчанде хамин тавр зиндагиро давом додан мумкин бошад хам, ин хеле ногувор буд.

Он замонҳо тақрибан ба замонҳои эпикӣ монанд буданд, версияҳои гуногуни PostgreSQL 9.x мувофиқ буданд, аз ин рӯ ҳама тақсимкунӣ бояд “дастӣ” анҷом дода мешуд. мероси ҷадвал ва триггерҳо масир бо динамикӣ EXECUTE.

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB
Ҳалли натиҷавӣ ба қадри кофӣ универсалӣ шуд, ки онро ба ҳама ҷадвалҳо тарҷума кардан мумкин аст:

  • Ҷадвали волидайнии холии "сарлавҳа" эълон карда шуд, ки ҳамаро тавсиф мекунад нишондиҳандаҳо ва триггерҳои зарурӣ.
  • Сабт аз нуқтаи назари муштарӣ дар ҷадвали "реша" ва дар дохили он истифода шудааст триггери масир BEFORE INSERT рекорд «чисмонй» ба кисми зарурй дохил карда шуд. Агар то ҳол чунин чизе набуд, мо як истисноро гирифтем ва...
  • ... бо истифода CREATE TABLE ... (LIKE ... INCLUDING ...) дар асоси қолаби ҷадвали волидайн сохта шудааст фасли бо маҳдудият дар санаи дилхоҳто вақте ки маълумот гирифта мешавад, хондан танҳо дар он сурат мегирад.

PG10: кӯшиши аввал

Аммо тақсимот тавассути мерос таърихан барои мубориза бо ҷараёни фаъоли навиштан ё миқдори зиёди қисмҳои кӯдакон мувофиқ набуд. Масалан, шумо метавонед ба ёд оред, ки алгоритми интихоби бахши зарурӣ дошт мураккабии квадратӣ, ки он бо 100+ бахш кор мекунад, шумо худатон мефаҳмед, ки чӣ тавр ...

Дар PG10 ин вазъият тавассути татбиқи дастгирӣ ба таври назаррас оптимизатсия карда шуд тақсимоти аслӣ. Аз ин рӯ, мо фавран кӯшиш кардем, ки онро фавран пас аз интиқоли анбор истифода барем, аммо...

Тавре ки пас аз кофтани дастур маълум шуд, ҷадвали тақсимшуда дар ин версия чунин аст:

  • тавсифи индексро дастгирӣ намекунад
  • триггерҳоро дар он дастгирӣ намекунад
  • "авлоди" касе шуда наметавонад
  • дастгирй намекунанд INSERT ... ON CONFLICT
  • бахшро ба таври худкор тавлид карда наметавонад

Мо ба пешонаи бо мола зарбаи дардовар зада, фаҳмидем, ки бидуни тағир додани ариза кор кардан ғайриимкон аст ва тадқиқоти минбаъдаро ба шаш моҳ мавқуф гузоштем.

PG10: имконияти дуюм

Ҳамин тавр, мо ба ҳалли мушкилоте, ки ба миён меоянд, оғоз кардем:

  1. Зеро триггерхо ва ON CONFLICT Мо фаҳмидем, ки мо то ҳол ба онҳо дар ин ҷо ва он ҷо ниёз дорем, аз ин рӯ мо барои коркарди онҳо марҳилаи мобайнӣ кардем ҷадвали прокси.
  2. Аз "маршрут" халос шудем дар триггерҳо - яъне аз EXECUTE.
  3. Онҳо онро алоҳида бароварданд ҷадвали шаблон бо ҳама индексатсияҳото ки онҳо ҳатто дар ҷадвали прокси мавҷуд нестанд.

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB
Ниҳоят, пас аз ҳамаи ин, мо ҷадвали асосиро ба таври аслӣ тақсим кардем. Таъсиси бахши нав ҳанӯз ба виҷдони ариза гузошта шудааст.

Луғатҳои "Арра"

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

"Фактҳо" аллакай муддати тӯлонӣ ба рӯз тақсим карда мешуданд, аз ин рӯ мо оромона бахшҳои кӯҳнашударо нест кардем ва онҳо моро ташвиш надоданд (логҳо!). Аммо дар луғатҳо мушкиле вуҷуд дошт...

Нагуфта намонад, ки онҳо зиёд буданд, балки тахминан 100 TB "далелҳо" ба луғати 2.5 TB оварда расонд. Шумо наметавонед чизеро аз чунин ҷадвал ба осонӣ нест кунед, шумо онро дар вақти мувофиқ фишурда наметавонед ва навиштан ба он тадриҷан сусттар шуд.

Мисли луғат... дар он, ҳар як сабт бояд маҳз як маротиба пешниҳод шавад... ва ин дуруст аст, аммо!.. Ҳеҷ кас моро аз доштани он бозмедорад. луғати алоҳида барои ҳар рӯз! Бале, ин як миқдори муайянеро меорад, аммо он имкон медиҳад:

  • тезтар навиштан/хондан аз сабаби андозаи қисмати хурдтар
  • хотираро камтар истеъмол мекунанд бо кор кардан бо индексхои зичтар
  • кам маълумот захира кунед аз сабаби қобилияти зуд бартараф кардани кӯҳна

Дар натичаи тамоми комплекси тадбирхо Сарбории CPU ~ 30%, сарбории диск ~ 50% кам шуд:

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB
Дар айни замон, мо навиштани ҳамон чизеро дар базаи маълумот идома додем, танҳо бо бори камтар.

#2. Эволютсияи пойгоҳи додаҳо ва рефакторинг

Пас, мо ба он чизе ки дорем, қарор додем хар руз бахши худро дорад бо маълумот. Дар асл, CHECK (dt = '2018-10-12'::date) — ва калиди тақсимкунӣ ва шарти ба қисмати мушаххас афтодани сабт мавҷуд аст.

Азбаски ҳама гузоришҳо дар хидмати мо дар заминаи санаи мушаххас сохта шудаанд, индексҳо барои онҳо аз замони "вақти тақсимнашуда" ҳама намудҳо буданд. (Сервер, Сана, Шаблон Нақша), (Сервер, Сана, гиреҳи нақша), (Сана, Синфи хато, Сервер)...

Аммо ҳоло онҳо дар ҳар як қисм зиндагӣ мекунанд нусхаҳои шумо хар як чунин шохис... Ва дар дохили хар як бахш санаи доимӣ аст...Маълум мешавад, ки холо мо дар хар як чунин шохис хастем танҳо як доимиро ворид кунед хамчун яке аз майдонхое, ки хам хачми он ва хам вакти чустучуи онро зиёд мекунад, вале ягон натича намебахшад. Моро ба ихтиёри худ гузоштанд, эй...

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB
Самти оптимизатсия равшан аст - оддӣ майдони санаро аз ҳамаи индексҳо хориҷ кунед дар ҷадвалҳои тақсимшуда. Бо назардошти ҳаҷми мо, фоида дар бораи аст 1TB / ҳафта!

Акнун биёед қайд кунем, ки ин терабайт ҳанӯз ҳам бояд бо ягон роҳ сабт карда шавад. Яъне мо низ диск акнун бояд камтар бор кунад! Ин расм ба таври возеҳ таъсири тозаеро, ки мо як ҳафта ба он бахшидаем, нишон медиҳад:

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

#3. "Паҳн кардани" бори авҷи

Яке аз мушкилоти калони системаҳои пурбор аст синхронизатсияи зиёдатӣ баъзе амалиётхое, ки инро талаб намекунанд. Баъзан «азбаски пай намебурданд», баъзан «ин тавр осонтар буд», аммо дер ё зуд бояд аз он халос шав.

Биёед тасвири пешинаро васеъ кунем ва бубинем, ки мо диск дорем «насосхо» дар зери бори амплитудаи дукарата байни намунаҳои ҳамсоя, ки ба таври возеҳ "оморӣ" набояд бо чунин як қатор амалиётҳо рух диҳад:

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

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

setInterval(sendToDB, interval)

Масъала дар ин чо махз дар он аст ҳама риштаҳо тақрибан дар як вақт оғоз мешаванд, бинобар ин, вақти фиристодани онҳо қариб ҳамеша "ба нуқта" мувофиқат мекунад. Оҳ #2...

Хушбахтона, ислоҳ кардани ин хеле осон аст, илова кардани давидан «тасодуфй». бо вақт:

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

#4. Мо он чизеро, ки ба мо лозим аст, захира мекунем

Мушкилоти сеюми анъанавии пурборкунӣ ин аст кэш нест дар куҷост метавонист будан.

Масалан, мо имкон додем, ки аз рӯи гиреҳҳои нақша таҳлил кунем (ҳамаи ин Seq Scan on users), аммо дарҳол фикр кунед, ки онҳо, аксаран, якхелаанд - онҳо фаромӯш карданд.

Не, албатта, боз ба базаи маълумот чизе навишта нашудааст, ин триггерро бо буридааст INSERT ... ON CONFLICT DO NOTHING. Аммо ин маълумот то ҳол ба пойгоҳи додаҳо мерасад ва он нолозим аст хондан барои тафтиши ихтилофот бояд кард. Оҳ #3...

Тафовут дар шумораи сабтҳое, ки пеш аз фаъол кардани кэш ба пойгоҳи додаҳо фиристода мешаванд, равшан аст:

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

Ва ин коҳиши сарбории нигаҳдорӣ аст:

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

Ҳамагӣ

"Терабайт дар як рӯз" танҳо даҳшатнок садо медиҳад. Агар шумо ҳама чизро дуруст кунед, пас ин дуруст аст 2^40 байт / 86400 сония = ~12.5 МБ/ски ҳатто иддаоҳои IDE мизи корӣ нигоҳ дошта мешаванд. 🙂

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

Мо дар PostgreSQL дар зери равшанӣ менависем: 1 мизбон, 1 рӯз, 1TB

Манбаъ: will.com

Илова Эзоҳ