Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Дар гузориш баъзе равишҳое оварда шудаанд, ки имкон медиҳанд иҷрои дархостҳои SQL-ро назорат кунед, вақте ки миллионҳо онҳо дар як рӯз вуҷуд доранд, ва садҳо серверҳои PostgreSQL назоратшаванда мавҷуданд.

Кадом қарорҳои техникӣ ба мо имкон медиҳанд, ки чунин ҳаҷми иттилоотро самаранок коркард кунем ва ин чӣ гуна ҳаёти як таҳиягари оддиро осон мекунад?


Кӣ манфиатдор аст? таҳлили мушкилоти мушаххас ва усулҳои гуногуни оптимизатсия Дархостҳои SQL ва ҳалли мушкилоти маъмулии DBA дар PostgreSQL - шумо инчунин метавонед як катор маколахо хонед дар ин мавзуъ.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)
Номи ман Кирилл Боровиков аст, ман намояндагӣ мекунам Ширкати тензор. Махсусан, ман дар кор бо пойгоҳи додаҳо дар ширкати мо тахассус дорам.

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

Умуман, Tensor барои як миллион мизоҷони мо VLSI барномаи мост: шабакаи иҷтимоии корпоративӣ, қарорҳо барои алоқаи видеоӣ, барои гардиши ҳуҷҷатҳои дохилӣ ва хориҷӣ, системаҳои баҳисобгирии муҳосибӣ ва анборҳо,... Яъне, чунин «мегакомбинат» барои идоракунии интегралии тиҷорат, ки дар он зиёда аз 100 намуди гуногун мавҷуд аст. лоиҳаҳои дохилӣ.

Барои он ки ҳамаи онҳо ба таври мӯътадил кор кунанд ва рушд кунанд, мо дар саросари кишвар 10 маркази рушд дорем, ки дар онҳо бештари онҳо вуҷуд доранд 1000 таҳиягарон.

Мо аз соли 2008 бо PostgreSQL кор карда истодаем ва миқдори зиёди он чизеро, ки мо коркард мекунем, ҷамъ кардем - маълумоти муштарӣ, оморӣ, таҳлилӣ, маълумот аз системаҳои иттилоотии беруна - зиёда аз 400 ТБ. Танҳо дар истеҳсолот тақрибан 250 сервер мавҷуд аст ва дар маҷмӯъ тақрибан 1000 серверҳои пойгоҳи додаҳо мавҷуданд, ки мо онҳоро назорат мекунем.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

SQL забони декларативист. Шумо на "чӣ гуна" кор кардан лозим аст, балки "чӣ" -ро тасвир мекунед, ки шумо мехоҳед ба даст оред. DBMS беҳтар медонад, ки чӣ гуна JOIN созед - чӣ гуна пайваст кардани ҷадвалҳои шумо, кадом шартҳо гузоштан лозим аст, аз индекс чӣ мегузарад, чӣ кор намекунад...

Баъзе DBMS маслиҳатҳоро қабул мекунанд: "Не, ин ду ҷадвалро дар фалон навбат пайваст кунед", аммо PostgreSQL ин корро карда наметавонад. Ин мавқеъи бошууронаи таҳиягарони пешбар аст: "Мо беҳтар мебудем, ки оптимизатори дархостро ба анҷом расонем, на ба таҳиягарон иҷозати истифодаи як навъ маслиҳатро."

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

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Умуман, як таҳиякунанда [ба DBA] одатан бо кадом мушкилоти классикӣ дучор меояд? «Дар ин чо мо дархостро ичро кардем ва бо мо ҳама чиз суст аст, хама чиз овезон аст, чизе руй дода истодааст... Як хел нохушй!».

Сабабҳо қариб ҳамеша якхелаанд:

  • алгоритми дархости бесамар
    Таҳиягар: "Ҳоло ман ба ӯ 10 ҷадвалро дар SQL тавассути JOIN медиҳам..." - ва интизор аст, ки шароити ӯ ба таври мӯъҷизавӣ ба таври муассир "кушода мешавад" ва ӯ ҳама чизро зуд ба даст меорад. Аммо мӯъҷизаҳо рӯй намедиҳанд ва ҳама гуна система бо чунин тағирёбанда (10 ҷадвал дар як АЗ) ҳамеша як навъ хатогӣ медиҳад. [мақола]
  • омори номатлуб
    Ин нукта махсусан барои PostgreSQL хеле муҳим аст, вақте ки шумо маҷмӯи маълумоти калонро ба сервер "рехтед", дархост кунед ва он планшети шуморо "сексканит мекунад". Зеро дирӯз дар он 10 сабт мавҷуд буд ва имрӯз 10 миллион аст, аммо PostgreSQL ҳанӯз аз ин огоҳ нест ва мо бояд дар ин бора нақл кунем. [мақола]
  • "васл" ба захираҳо
    Шумо дар сервери заиф, ки диск, хотира ё кори протсессори кофӣ надорад, пойгоҳи калон ва пурбор насб кардаед. Ва ин ҳама аст ... Дар ҷое як шифти иҷроиш мавҷуд аст, ки шумо дигар аз он ҷаҳидан наметавонед.
  • манъ кардан
    Ин як нуқтаи душвор аст, аммо онҳо барои дархостҳои гуногуни тағирёбанда бештар мувофиқанд (INSERT, UPDATE, DELETE) - ин як мавзӯи алоҳидаи калон аст.

Гирифтани нақша

...Ва барои ҳама чизи дигар мо план лозим аст! Мо бояд бубинем, ки дар дохили сервер чӣ рӯй дода истодааст.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Ҳар як гиреҳи дарахт як амалиёт аст: дарёфт кардани маълумот аз ҷадвал ё индекс, сохтани харитаи бит, пайваст кардани ду ҷадвал, пайвастшавӣ, буриш ё истисно кардани интихобҳо. Иҷрои пурсиш гузаштан аз гиреҳҳои ин дарахтро дар бар мегирад.

Барои гирифтани нақшаи пурсиш, роҳи осонтарини иҷрои изҳорот аст EXPLAIN. Барои гирифтани ҳама атрибутҳои воқеӣ, яъне воқеан иҷро кардани дархост дар асоси - EXPLAIN (ANALYZE, BUFFERS) SELECT ....

Қисми бад: вақте ки шумо онро иҷро мекунед, он "дар ин ҷо ва ҳоло" рӯй медиҳад, бинобар ин он танҳо барои ислоҳи маҳаллӣ мувофиқ аст. Агар шумо сервери пурборшударо гиред, ки зери ҷараёни қавии тағирёбии додаҳо қарор дорад ва шумо мебинед: “Оҳ! Дар ин ҷо мо иҷрои суст доремxia дархост». Ним соат, як соат пеш - вақте ки шумо иҷро мекардед ва ин дархостро аз гузоришҳо мегиред ва онро ба сервер бармегардонед, тамоми маълумот ва омори шумо тағир ёфт. Шумо онро барои ислоҳ кардан иҷро мекунед - ва он зуд кор мекунад! Ва шумо намефаҳмед, ки чаро, чаро ки оҳиста.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Агар он дарк кунад, ки ягон дархост аз маҳдудияте, ки шумо ба он гуфта будед, дарозтар иҷро мешавад, ин мекунад «тасвири» нақшаи ин дархост ва онҳоро якҷоя дар журнал менависад.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Ҳоло ҳама чиз хуб ба назар мерасад, мо ба назди чӯб меравем ва дар онҷо мебинем... [матнӣ поймол]. Аммо мо дар ин бора чизе гуфта наметавонем, ба истиснои он, ки ин нақшаи олӣ аст, зеро барои иҷрои он 11ms вақт лозим буд.

Ба назар чунин мерасад, ки ҳама чиз хуб аст - аммо ҳеҷ чиз маълум нест, ки воқеан чӣ рух додааст. Ба ғайр аз вақти умумӣ, мо воқеан чизе намебинем. Зеро ба чунин «барра»-и матни оддӣ нигоҳ кардан умуман аёнӣ нест.

Аммо ҳатто агар он аён набошад ҳам, ҳатто агар он нороҳат бошад ҳам, мушкилоти бунёдии бештар вуҷуд доранд:

  • Гиреҳ нишон медиҳад маблағи захираҳои тамоми зердарахт дар зери у. Яъне, шумо наметавонед танҳо бифаҳмед, ки дар ин скани мушаххас чӣ қадар вақт сарф шудааст, агар дар зери он ягон ҳолати лона мавҷуд бошад. Мо бояд ба таври динамикӣ бубинем, ки оё дар дохили "кӯдакон" ва тағирёбандаҳои шартӣ, CTE вуҷуд доранд ва ҳамаи инро "дар зеҳни мо" хориҷ кунем.
  • Нуқтаи дуюм: вақте, ки дар гиреҳ нишон дода шудааст вақти иҷрои як гиреҳ. Агар ин гирех дар натиљаи, масалан, дар натиљаи сабти љадвал якчанд маротиба иљро шуда бошад, пас дар наќша шумораи њалќањо - даврањои ин гирењ меафзояд. Аммо худи вакти ичрои атом аз чихати план як хел мемонад. Яъне, барои фаҳмидани он ки ин гиреҳ дар маҷмӯъ чӣ қадар иҷро шудааст, шумо бояд як чизро ба чизи дигар зарб кунед - боз "дар сари шумо".

Дар чунин ҳолатҳо бифаҳмед, ки "Зифтарин ҳалқа кист?" қариб ғайриимкон аст. Аз ин рӯ, ҳатто худи таҳиягарон дар "дастур" менависанд, ки "Фахмидани нақша санъатест, ки бояд омӯхта шавад, таҷриба...".

Аммо мо 1000 таҳиягар дорем ва шумо ин таҷрибаро ба ҳар яки онҳо расонида наметавонед. Ман, шумо, ӯ медонам, аммо касе дар он ҷо дигар намедонад. Шояд ӯ ёд гирад, ё не, аммо ӯ бояд ҳоло кор кунад - ва ӯ ин таҷрибаро аз куҷо пайдо мекард?

Нақшаи визуалӣ

Бинобар ин, мо фаҳмидем, ки барои ҳалли ин мушкилот ба мо лозим аст визуалии хуби план. [мақола]

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Мо аввал "аз бозор" рафтем - биёед дар Интернет бубинем, то бубинем, ки чӣ вуҷуд дорад.

Аммо маълум шуд, ки қарорҳои нисбатан "зинда" хеле каманд, ки бештар ё камтар инкишоф меёбанд - айнан танҳо як: izah.depesz.com аз ҷониби Ҳуберт Любачевский. Вақте ки шумо ба майдони "хўрок" тасвири матни нақшаро ворид мекунед, он ба шумо ҷадвалеро бо маълумоти таҳлилшуда нишон медиҳад:

  • вақти коркарди худи гиреҳ
  • вақти умумӣ барои тамоми зердарахт
  • шумораи сабтҳои гирифташуда, ки аз рӯи омор интизор буданд
  • худи бадани гиреҳ

Ин хидмат инчунин қобилияти мубодилаи бойгонии истинодҳоро дорад. Шумо нақшаи худро дар он ҷо партофтед ва гуфтед: "Ҳей, Вася, ин ҷо пайванд аст, дар он ҷо ягон хатогӣ ҳаст."

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Аммо проблемахои хурд хам хастанд.

Аввалан, миқдори зиёди «нусхабардорӣ-часбонед». Шумо як пораи чӯбро мегиред, онро дар он ҷо часпонед ва боз ва боз.

Дуюм, тахлили микдори маълумоти хондашуда — хамон буферхое, ки мебароянд EXPLAIN (ANALYZE, BUFFERS), мо онро дар ин ҷо намебинем. Вай фацат намедонад, ки чй тавр онхоро ба кисмхо чудо кардан, фахмидан ва бо онхо кор кардан. Вақте ки шумо маълумоти зиёдеро мехонед ва дарк мекунед, ки шумо диск ва кэши хотираро нодуруст тақсим карда истодаед, ин маълумот хеле муҳим аст.

Нуқтаи манфии сеюм ин рушди хеле сусти лоиҳа мебошад. Уҳдадориҳо хеле хурданд, хуб аст, агар дар шаш моҳ як маротиба ва рамз дар Perl бошад.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Аммо ин ҳама "лирика" аст, ки мо метавонистем бо ин зиндагӣ кунем, аммо як чиз ҳаст, ки моро аз ин хидмат хеле дур кард. Ин хатогиҳо дар таҳлили Common Table Expression (CTE) ва гиреҳҳои гуногуни динамикӣ ба монанди InitPlan/SubPlan мебошанд.

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

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Баъд мо фахмидем, ки вакти худамон навиштан расидааст — ура! Ҳар як таҳиягар мегӯяд: "Акнун мо худамонро менависем, ин хеле осон хоҳад буд!"

Мо стекеро гирифтем, ки барои хидматҳои веб хос аст: ядрое, ки дар Node.js + Express асос ёфтааст, барои диаграммаҳои зебо Bootstrap ва D3.js-ро истифода бурд. Ва интизориҳои мо комилан асоснок шуданд - мо прототипи аввалро дар тӯли 2 ҳафта гирифтем:

  • таҳлилгари нақшаи фармоишӣ
    Яъне, ҳоло мо метавонем ҳама нақшаҳоро аз нақшаҳое, ки аз ҷониби PostgreSQL тавлид шудаанд, таҳлил кунем.
  • тахлили дурусти гиреххои динамикй - CTE Scan, InitPlan, SubPlan
  • таҳлили тақсимоти буферҳо - дар куҷо саҳифаҳои маълумот аз хотира хонда мешаванд, дар куҷо аз кэши маҳаллӣ, дар куҷо аз диск
  • равшанӣ пайдо кард
    Барои он ки ин ҳамаро дар журнал «кофта» накунем, балки дарҳол «пайванди заифтарин»-ро дар расм бубинем.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Мо чунин чизе гирифтем, ки бо таъкиди синтаксис дохил карда шудааст. Аммо одатан таҳиягарони мо дигар на бо пешниҳоди пурраи нақша, балки бо нақшаи кӯтоҳтар кор мекунанд. Охир, мо аллакай хамаи ракамхоро тахлил карда, онхоро ба чапу рост партофтем ва дар мобайн танхо сатри якумро мондаем, ки он чй гуна гирех аст: CTE Scan, Generation CTE ё Seq Scan аз руи ягон нишона.

Ин намояндагии кӯтоҳшудаест, ки мо онро даъват мекунем Шаблон нақша.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Боз чӣ қулай хоҳад буд? Дидани он қулай мебуд, ки кадом ҳиссаи вақти умумии мо ба кадом гиреҳ ҷудо карда шудааст - ва танҳо онро ба паҳлӯ "часпонед" ҷадвали шишагин.

Мо ба гиреҳ ишора мекунем ва мебинем - маълум мешавад, ки Seq Scan камтар аз чоряки вақти умумиро гирифтааст ва 3/4 қисми боқимондаро CTE Scan гирифтааст. Даҳшат! Ин як ёддошти хурд дар бораи "суръати оташ" -и CTE Scan аст, агар шумо онҳоро дар дархостҳои худ фаъолона истифода баред. Онҳо чандон зуд нестанд - онҳо ҳатто аз сканкунии муқаррарии ҷадвал пасттаранд. [мақола] [мақола]

Аммо одатан чунин диаграммаҳо ҷолибтар ва мураккабтаранд, вақте ки мо фавран ба сегмент ишора мекунем ва мебинем, ки масалан, беш аз нисфи вақт баъзе Seq Scan “хӯрд”. Гузашта аз ин, дар дохили он як навъ Филтр мавҷуд буд, аз рӯи он сабтҳои зиёде партофта шуданд... Шумо метавонед ин расмро бевосита ба таҳиякунанда партоед ва бигӯед: «Вася, дар ин ҷо ҳама чиз барои шумо бад аст! Фикр кунед, бубинед, чизе нодуруст аст! ”

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Табиист, ки дар ин чо баъзе «ракетхо» иштирок доштанд.

Аввалин чизе, ки мо дучор омадем, мушкилоти мудавваркунӣ буд. Вакти хар як гирехи алохида дар план бо дакикии 1 мкс нишон дода шудааст. Ва вақте ки шумораи давраҳои гиреҳ, масалан, аз 1000 зиёд мешавад - пас аз иҷрои PostgreSQL "дар доираи дақиқ" тақсим карда мешавад, пас ҳангоми ҳисоб кардани бозгашт мо вақти умумиро "дар ҷое аз 0.95 мс то 1.05 мс" мегирем. Вақте ки ҳисоб ба микросонияҳо мерасад, ин хуб аст, аммо вақте ки он аллакай [милли] сония аст, шумо бояд ин маълумотро ҳангоми "кушода" кардани захираҳо ба гиреҳҳои нақшаи "кӣ чӣ қадар истеъмол кардааст" ба назар гиред.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Нуктаи дуюм, ки мураккабтар аст, тақсимоти захираҳо (он буферҳо) дар байни гиреҳҳои динамикӣ мебошад. Ин ба мо 2 ҳафтаи аввали прототип ва илова бар 4 ҳафтаи дигар арзиш дошт.

Гирифтани ин гуна мушкилот хеле осон аст - мо CTE мекунем ва гӯё дар он чизе мехонем. Дар асл, PostgreSQL "ақл" аст ва дар он ҷо мустақиман чизе намехонад. Пас аз он сабти аввалро мегирем ва ба он саду якумро аз ҳамон CTE мегирем.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Мо ба нақша менигарем ва мефаҳмем - аҷиб аст, мо дар Seq Scan 3 буфер (саҳифаҳои маълумот) "истеъмол" дорем, 1-и дигар дар CTE Scan ва 2-и дигар дар Скании дуюми CTE. Яъне, агар мо ҳама чизро танҳо ҷамъбаст кунем, мо 6 мегирем, аммо аз планшет мо танҳо 3-ро мехонем! CTE Scan чизеро аз ҳеҷ ҷо намехонад, аммо мустақиман бо хотираи раванд кор мекунад. Яъне, дар ин ҷо чизе равшан аст!

Дарвоқеъ, маълум мешавад, ки дар ин ҷо ҳама он 3 саҳифаи маълумоте ҳастанд, ки аз Seq Scan дархост шуда буданд, аввал 1-и Скании 1-умро талаб карданд ва баъд 2-юм ва 2 саҳифаи дигар ба ӯ хонда шуданд. 3 саҳифа маълумот хонда шуданд, на 6.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Ва ин расм моро ба фаҳмиш овард, ки иҷрои нақша дигар дарахт нест, балки танҳо як намуди графики асиклист. Ва мо чунин диаграмма гирифтем, то фаҳмем, ки "аз куҷо аз куҷо пайдо шуд". Яъне, дар ин ҷо мо аз pg_class як CTE таъсис додем ва онро ду маротиба дархост кардем ва вақте ки бори дуюм хостем, тақрибан тамоми вақти мо дар филиал сарф шуд. Маълум аст, ки хондани сабти 2 назар ба хондани сабти 101-ум аз планшет хеле гаронтар аст.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Мо муддате нафас гирифтем. Гуфтанд: «Акнун, Нео, ту кунг-фуро медони! Акнун таҷрибаи мо дар экрани шумост. Акнун шумо метавонед онро истифода баред." [мақола]

Муттаҳидсозии сабт

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

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Умуман, як модули стандартӣ мавҷуд аст, ки метавонад оморро ҷамъ кунад, аммо он инчунин бояд дар танзимот фаъол карда шавад - ин модули pg_stat_statements. Аммо ӯ ба мо мувофиқ набуд.

Аввалан, он ба як дархостҳо бо истифода аз схемаҳои гуногун дар як пойгоҳи додаҳо таъин мекунад QueryIds гуногун. Яъне, агар шумо аввал SET search_path = '01'; SELECT * FROM user LIMIT 1;, ва он гоҳ SET search_path = '02'; ва ҳамон дархост, пас омори ин модул сабтҳои гуногун хоҳад дошт ва ман наметавонам омори умумиро махсус дар заминаи ин профили дархост бидуни ба назар гирифтани схемаҳо ҷамъоварӣ кунам.

Нуктаи дуюм, ки моро аз истифодаи он бозмедорад набудани планхо. Яъне нақшае нест, танҳо худи дархост вуҷуд дорад. Мо мебинем, ки чӣ суст шуда буд, аммо намефаҳмем, ки чаро. Ва дар ин ҷо мо ба масъалаи маҷмӯи маълумотҳои зуд тағйирёбанда бармегардем.

Ва охирин лаҳза - набудани "фактҳо". Яъне, шумо наметавонед ба як мисоли мушаххаси иҷрои дархост муроҷиат кунед - вуҷуд надорад, танҳо омори ҷамъшуда мавҷуд аст. Гарчанде ки бо ин кор кардан мумкин аст, ин танҳо хеле душвор аст.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Коллектор тавассути SSH пайваст мешавад, бо истифода аз сертификат ба сервер бо пойгоҳи додаҳо пайвасти бехатарро муқаррар мекунад ва tail -F дар файли гузориш ба он "часпида". Инак, дар ин сессия мо «оина»-и пурраи тамоми файли журналро мегирем, ки сервер тавлид мекунад. Сарборӣ ба худи сервер ҳадди аққал аст, зеро мо дар он ҷо ҳеҷ чизро таҳлил намекунем, мо танҳо трафикро инъикос мекунем.

Азбаски мо аллакай навиштани интерфейсро дар Node.js оғоз карда будем, мо ба навиштани коллектор дар он идома додем. Ва ин технология худро сафед кард, зеро истифодаи JavaScript барои кор бо додаҳои матнии суст форматшуда, ки лог аст, хеле қулай аст. Ва худи инфрасохтори Node.js ҳамчун платформаи пуштибонӣ ба шумо имкон медиҳад, ки бо пайвастҳои шабакавӣ ва воқеан бо ҳама гуна ҷараёнҳои додаҳо ба осонӣ ва бароҳат кор кунед.

Муносибат, мо ду пайвастро «дароз» мекунем: якум барои «гӯш додан» худи лог ва онро ба худамон мебарем ва дуюмӣ давра ба давра аз пойгоҳ пурсед. "Аммо гузориш нишон медиҳад, ки аломати oid 123 баста шудааст", аммо ин барои таҳиякунанда ҳеҷ маъно надорад ва хуб мебуд, ки аз пойгоҳи додаҳо пурсед: "Ба ҳар ҳол OID = 123 чист?" Ва аз ин рӯ, мо давра ба давра аз база чизҳоеро мепурсем, ки мо дар бораи худамон ҳанӯз намедонем.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

"Танҳо як чизест, ки шумо ба назар нагирифтед, як намуди занбӯри асал ба фил вуҷуд дорад!.." Мо ба таҳияи ин система вақте шурӯъ кардем, ки 10 серверро назорат кардан мехостем. Муҳимтарин дар фаҳмиши мо, ки дар он баъзе мушкилоте пайдо шуданд, ки ҳалли онҳо душвор буд. Аммо дар семохаи аввал барои назорат саддо гирифтем — зеро система кор мекард, хама инро мехостанд, ба хама рохат буд.

Хамаи ин бояд илова карда шавад, ҷараёни маълумот калон ва фаъол аст. Дарвоқеъ, он чизе ки мо назорат мекунем, бо чӣ кор карда метавонем, он чизест, ки мо истифода мебарем. Мо инчунин PostgreSQL-ро ҳамчун нигаҳдории маълумот истифода мебарем. Ва чизе зудтар ба он "рехтани" маълумот аз оператор нест COPY Ҳоло не.

Аммо танҳо "рехтани" маълумот аслан технологияи мо нест. Зеро агар шумо дар як сад сервер тақрибан 50k дархост дар як сония дошта бошед, пас ин дар як рӯз 100-150 ГБ гузоришҳоро тавлид мекунад. Бинобар ин ба мо лозим омад, ки базаро эхтиёткорона «буридем».

Аввалан, мо кардем ба рӯз тақсим карда мешавад, зеро, умуман, касе ба таносуби байни рӯзҳо манфиатдор нест. Чӣ фарқияте дорад, ки шумо дирӯз доштед, агар шумо имшаб версияи нави барномаро бароварда бошед - ва аллакай баъзе омори нав.

Дуюм, мо фаҳмидем (маҷбур шудем) бо истифода аз навиштан хеле, хеле зуд COPY. Яъне на танҳо COPYзеро вай тезтар аз INSERT, ва ҳатто тезтар.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Нуктаи сеюм - ман маҷбур будам мутаносибан триггерҳо ва калидҳои хориҷиро тарк кунед. Яъне, мо умуман беайбии истинод надорем. Зеро агар шумо ҷадвале дошта бошед, ки ҷуфти FK-ҳо дорад ва шумо дар сохтори пойгоҳи додаҳо мегӯед, ки "дар ин ҷо сабти гузоришест, ки аз ҷониби FK истинод шудааст, масалан, ба гурӯҳи сабтҳо", пас ҳангоми ворид кардани он, PostgreSQL ба чуз чй тавр гирифтан ва софдилона ба чо овардани он чизе намондааст SELECT 1 FROM master_fk1_table WHERE ... бо идентификаторе, ки шумо ворид кардан мехоҳед - танҳо барои санҷед, ки ин сабт дар он ҷо мавҷуд аст ва шумо ин Калиди хориҷиро бо воридкунии худ "шикастан" накунед.

Ба ҷои як сабт ба ҷадвали мақсаднок ва индексҳои он, мо аз хондани ҳамаи ҷадвалҳое, ки ба он ишора мекунанд, бартарии иловагиро мегирем. Аммо ба мо тамоман лозим нест - вазифаи мо ин аст, ки ҳарчи бештар ва ҳарчи зудтар бо бори камтар сабт кунем. Пас, FK - поён!

Нуктаи навбатӣ ҷамъоварӣ ва ҳашинг аст. Дар аввал, мо онҳоро дар пойгоҳи додаҳо татбиқ кардем - дар ниҳоят, қулай аст, ки дарҳол, вақте ки сабт меояд, онро дар ягон намуди планшет иҷро кунед. "плюс як" рост дар триггер. Хуб, ин қулай аст, аммо ҳамон як чизи бад - шумо як сабт мегузоред, аммо маҷбуред, ки чизи дигареро аз ҷадвали дигар хонед ва нависед. Гузашта аз ин, шумо на танҳо мехонед ва менависед, балки ҳар дафъа низ ин корро мекунед.

Акнун тасаввур кунед, ки шумо ҷадвале доред, ки дар он шумо танҳо шумораи дархостҳоеро, ки аз ҳости мушаххас гузаштаанд, ҳисоб мекунед: +1, +1, +1, ..., +1. Ва шумо, аслан, ба ин ниёз надоред - ин ҳама имконпазир аст сум дар хотираи оид ба коллектор ва дар як лахза ба база фиристед +10.

Бале, дар сурати ба миён омадани баъзе мушкилот, якпорчагии мантиқии шумо метавонад "аз ҳам пошида шавад", аммо ин як ҳолати қариб ғайривоқеист - зеро шумо сервери муқаррарӣ доред, он дар контроллер батарея дорад, шумо сабти транзаксия, лог дар системаи файлӣ... Умуман, он меарзад. Аз даст додани маҳсулнокӣ, ки шумо аз триггерҳо/ФК ба даст меоред, маблағи хароҷоти сарфкардаи шумо нест.

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

Ин барои мо комилан комил буд, ки MD5 аз матн - дархост, нақша, шаблон, ... Мо онро дар тарафи коллектор ҳисоб карда, ID-и тайёрро ба базаи маълумот "рехт". Дарозии MD5 ва тақсимоти ҳаррӯза ба мо имкон медиҳад, ки дар бораи бархӯрдҳои эҳтимолӣ хавотир нашавем.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Аммо барои зуд сабт кардани ҳамаи ин ба мо лозим омад, ки худи тартиби сабтро тағир диҳем.

Шумо одатан маълумотро чӣ гуна менависед? Мо як навъ маҷмӯаи додаҳо дорем, мо онро ба чанд ҷадвал тақсим мекунем ва баъд НУСЯ мекунем - аввал ба якум, баъд ба дуюм, ба сеюм... Ин номувофиқ аст, зеро ба назар чунин мерасад, ки мо як ҷараёни додаҳоро дар се қадам менависем. пай дар пай. Нохушоянд. Оё онро зудтар кардан мумкин аст? Метавонед!

Барои ин кофист, ки ин ҷараёнҳоро дар баробари ҳамдигар ҷудо кунем. Маълум мешавад, ки мо хатоҳо, дархостҳо, шаблонҳо, блокҳо, ... дар риштаҳои алоҳида парвоз мекунем - ва мо ҳамаро дар баробари ин менависем. Барои ин кифоя як канали COPY-ро барои ҳар як ҷадвали ҳадафи инфиродӣ доимо кушода нигоҳ доред.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Яъне, дар коллектор ҳамеша ҷараён дорад, ки дар он ман метавонам маълумоти заруриро нависам. Аммо барои он ки пойгоҳи додаҳо ин маълумотро бубинад ва касе дар интизори навиштани ин маълумот дармонда нашавад, Нусха бояд дар фосилаҳои муайян қатъ карда шавад. Барои мо, давраи самараноктарин тақрибан 100 мс буд - мо онро мепӯшем ва фавран онро боз ба ҳамон ҷадвал боз мекунем. Ва агар мо дар баъзе қуллаҳо як ҷараёнро кофӣ надорем, пас мо то ҳадди муайян ҷамъ мекунем.

Илова бар ин, мо фаҳмидем, ки барои чунин намуди сарборӣ, ҳама гуна ҷамъбаст, вақте ки сабтҳо дар гурӯҳҳо ҷамъ карда мешаванд, бад аст. Бадии классикӣ аст INSERT ... VALUES ва боз 1000 сабт. Зеро дар он лаҳза шумо авҷи навиштан дар васоити ахбори омма доред ва ҳар каси дигаре, ки мехоҳанд ба диск чизе нависад, интизор мешаванд.

Барои бартараф кардани чунин аномалияҳо, танҳо чизеро ҷамъ накунед, умуман буфер накунед. Ва агар буферкунӣ ба диск рух диҳад (хушбахтона, Stream API дар Node.js ба шумо имкон медиҳад, ки бидонед) - ин пайвастшавиро ба таъхир гузоред. Вақте ки шумо чорабинӣ мегиред, ки он боз ройгон аст, ба он аз навбати ҷамъшуда нависед. Ва дар ҳоле ки он банд аст, навбатии ройгонро аз ҳавз гиред ва ба он нависед.

Пеш аз ҷорӣ кардани ин равиш ба сабти маълумот, мо тақрибан 4K амалиёти навиштан доштем ва бо ин роҳ мо сарбориро 4 маротиба кам кардем. Ҳоло онҳо аз ҳисоби базаҳои нави назоратшаванда 6 маротиба афзоиш ёфтанд - то 100 МБ/с. Ва ҳоло мо гузоришҳоро дар тӯли 3 моҳи охир дар ҳаҷми тақрибан 10-15 ТБ нигоҳ медорем ва умедворем, ки танҳо дар се моҳ ҳама гуна таҳиягар метавонад ҳама гуна мушкилотро ҳал кунад.

Мо мушкилотро мефаҳмем

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

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Мо се нуктаи асосиро муайян кардем:

  • ки ин дархостро фиристод
    Яъне, он аз кадом барнома "омадааст": веб-интерфейс, пуштибон, системаи пардохт ё чизи дигар.
  • ки рӯй дод
    Дар кадом сервери мушаххас? Зеро агар шумо дар зери як замима якчанд сервер дошта бошед ва баногоҳ яке «беақл» шавад (зеро «диск пӯсида», «хотира ихроҷ шуд», ягон мушкилоти дигар), пас шумо бояд ба сервер махсус муроҷиат кунед.
  • чи тавр масъала ба ин ё он тарз зухур меёфт

Барои фаҳмидани "кӣ" ба мо дархост фиристодааст, мо асбоби стандартиро истифода мебарем - тағирёбандаи сессия: SET application_name = '{bl-host}:{bl-method}'; — мо номи мизбони мантиқи тиҷорӣ, ки дархост аз он меояд ва номи усул ё барномае, ки онро оғоз кардааст, мефиристем.

Пас аз гузаштани мо "соҳиби" дархост, он бояд ба журнал бароварда шавад - барои ин мо тағирёбандаро танзим мекунем log_line_prefix = ' %m [%p:%v] [%d] %r %a'. Барои онҳое, ки таваҷҷӯҳ доранд, шояд ба дастур нигаредин ҳама чӣ маъно дорад. Маълум мешавад, ки мо дар гузориш мебинем:

  • время
  • идентификаторҳои раванд ва транзаксия
  • номи базаи маълумотҳо
  • IP-и шахсе, ки ин дархостро фиристодааст
  • ва номи усул

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Инак, буриш "як сервер - як рӯз" барои хар як тахлил барои мо кифоя шуд.

Бахши аввали таҳлилӣ ҳамин аст "намуна" - шакли мухтасари пешниҳоди нақша, ки аз тамоми нишондиҳандаҳои ададӣ тоза карда шудааст. Буридани дуюм барнома ё усул аст ва буриши сеюм гиреҳи нақшаи мушаххасест, ки ба мо мушкилот овард.

Вақте ки мо аз мисолҳои мушаххас ба қолибҳо гузаштем, мо якбора ду бартарият гирифтем:

  • якчанд маротиба кам кардани шумораи объектхои тахлил
    Мо бояд мушкилотро дигар на аз рӯи ҳазорҳо дархост ё нақшаҳо, балки аз рӯи даҳҳо қолабҳо таҳлил кунем.
  • ҷадвали вақт
    Яъне, бо ҷамъбасти "фактҳо" дар як бахши муайян шумо метавонед намуди зоҳирии онҳоро дар давоми рӯз нишон диҳед. Ва дар ин ҷо шумо метавонед дарк кунед, ки агар шумо як намуди намунае дошта бошед, ки масалан, дар як соат як маротиба рӯй медиҳад, аммо он бояд дар як рӯз як маротиба рӯй диҳад, шумо бояд дар бораи он фикр кунед, ки чӣ хато кардааст - кӣ сабаб шуд ва чаро, шояд он бояд дар ин ҷо бошад. набояд. Ин боз як усули ғайрирақамӣ, сирф визуалӣ, таҳлил аст.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Усулҳои боқимонда ба нишондодҳое асос ёфтаанд, ки мо аз нақша мегирем: чанд маротиба чунин намуна рух додааст, вақти умумӣ ва миёна, чӣ қадар маълумот аз диск хонда шудааст ва чӣ қадар аз хотира...

Зеро, масалан, шумо ба саҳифаи таҳлилӣ барои мизбон омадед, бубинед - чизе дар диск аз ҳад зиёд хонда мешавад. Диски сервер аз ӯҳдаи он баромада наметавонад - кӣ аз он мехонад?

Ва шумо метавонед аз рӯи дилхоҳ сутун ҷудо кунед ва қарор кунед, ки худи ҳозир бо чӣ кор хоҳед кард - сарбории протсессор ё диск, ё шумораи умумии дархостҳо ... Мо онро ҷудо кардем, "боло" -ро дида баромадем, ислоҳ кардем ва версияи нави барномаро бароварданд.
[дарсҳои видеоӣ]

Ва дарҳол шумо метавонед замимаҳои гуногунро бинед, ки бо як қолаб аз дархости монанди SELECT * FROM users WHERE login = 'Vasya'. Frontend, backend, processing... Ва шумо ҳайрон мешавед, ки чаро коркард корбарро мехонад, агар ӯ бо ӯ муошират накунад.

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

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Шумо дар табақ индекси мувофиқ надоред, шумо ба он муроҷиат мекунед, он аз назди индекс парвоз мекунад, ба Seq Scan меафтад ... шумо ҳама сабтҳоро ба ҷуз як филтр кардаед. Чаро ба шумо дар як рӯз 100 миллион сабти филтршуда лозим аст? Оё беҳтар нест, ки индексро ҷамъ кунед?

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

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

Ҳар касе, ки пурсишҳо навишт, эҳтимол бо чунин намуна дучор шуда бошад: "Ба ман фармоиши охирини Васяро бидеҳ, санаи онро диҳед." Ва агар шумо индекс аз рӯи сана надошта бошед ё дар индекси истифодакардаатон сана мавҷуд набошад, пас шумо маҳз ба ҳамон «тарма» қадам занед.

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

Дар натича микдори тачрибае, ки барои халли проблемахо дар аввал лозим буд ва холо хеле кам шудааст. Ин гуна воситаест, ки мо дорем.

Оптимизатсияи оммавии дархостҳои PostgreSQL. Кирилл Боровиков (тензор)

Манбаъ: will.com

Илова Эзоҳ