Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ман ба шумо тавсия медиҳам, ки стенограммаи гузоришро аз аввали соли 2016 аз ҷониби Андрей Сальников хонед "Хатоҳои маъмулӣ дар барномаҳое, ки ба bloat дар postgresql оварда мерасонанд"

Дар ин гузориш, ман хатогиҳои асосии барномаҳоро, ки дар марҳилаи тарҳрезӣ ва навиштани коди барнома ба вуҷуд меоянд, таҳлил мекунам. Ва ман танҳо он хатогиҳоеро мегирам, ки дар Postgresql варам мекунанд. Чун қоида, ин оғози анҷоми иҷрои системаи шумо дар маҷмӯъ аст, гарчанде ки дар аввал ҳеҷ гуна шартҳои зарурӣ барои ин намоён набуданд.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Чаро хатогиҳо содир мешаванд? Онҳо бо ду сабаб анҷом дода мешаванд: ба таври тасодуфӣ, шояд он кор кунад ва аз сабаби надонистани баъзе механизмҳое, ки дар сатҳи байни пойгоҳи додаҳо ва барномаҳо ва инчунин дар худи пойгоҳи додаҳо рух медиҳанд.

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Маълумоти ибтидоии плита: он хеле хурд аст, 2 МБ. Вақти вокуниш ба пойгоҳи додаҳо ва махсусан барои аломат низ хеле хуб аст. Ва бори хеле хуб - 2 амалиёт дар як сония мувофиқи табақ.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ва тавассути ин гузориш ман ба шумо графикҳо нишон медиҳам, то шумо фаҳмед, ки чӣ рӯй дода истодааст. Ҳамеша 2 слайд бо графикҳо хоҳад буд. Слайди аввал он чизест, ки умуман дар сервер рӯй медиҳад.

Ва дар ин вазъият мо мебинем, ки дар ҳақиқат аломати хурде дорем. Индекс хурд аст ва 2 МБ аст. Ин диаграммаи аввал дар тарафи чап аст.

Вақти миёнаи посух дар сервер низ устувор ва кӯтоҳ аст. Ин графики болои рост аст.

Графикаи чапи поён дарозтарин транзаксияҳоро нишон медиҳад. Мо мебинем, ки муомилот зуд анҷом дода мешавад. Ва автовакуум дар ин ҷо ҳоло кор намекунад, зеро ин санҷиши ибтидоӣ буд. Он минбаъд хам кор мекунад ва ба мо фоиданок мешавад.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Графикаи рости поён нишон медиҳад, ки мо то чӣ андоза хотираи оперативӣ ва дискро дар ҷустуҷӯи хати дилхоҳамон пеш аз навсозӣ аз сар мегузаронем. Ва шумораи амалиётҳо аз рӯи нишона дар як сония 2 аст, чунон ки дар аввал гуфтам.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ва акнун мо як фоҷиа дорем. Бо баъзе сабабҳо як амалиёти фаромӯшшуда вуҷуд дорад. Одатан, сабабҳо ҳама чизи ғайриоддӣ мебошанд:

  • Яке аз маъмултарин он аст, ки мо ба дастрасии хидмати беруна дар коди барнома шурӯъ кардем. Ва ин хидмат ба мо ҷавоб намедиҳад. Яъне, мо транзаксия кушодем, дар базаи маълумот тағйирот ворид кардем ва аз замима ба хондани почта ё хидмати дигаре дар дохили инфрасохтори мо рафтем ва бо кадом сабабе ба мо посух намедиҳад. Ва иҷлосияи мо дар ҳолате дармондааст, ки кай ҳал мешавад, маълум нест.
  • Вазъияти дуюм ин аст, ки дар кодекси мо бо ягон сабаб истисно ба амал омад. Ва дар истисно, мо бастани муомилотро коркард накардаем. Ва мо бо як ҷаласаи овезон бо муомилоти кушод анҷом ёфтем.
  • Ва охирин низ як парвандаи хеле маъмул аст. Ин рамзи пастсифат аст. Баъзе чаҳорчӯбаҳо транзаксияро мекушоянд. Он овезон аст ва шумо шояд дар барнома намедонед, ки шумо онро овезон доред.

Чунин чизҳо ба куҷо мебарад?

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

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

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

Умуман хуб, аммо вазъият аз пештара бадтар аст. Тоза кардани таназзули пойгоҳи додаҳо дар натиҷаи барномаи мо, ки бо ин пойгоҳи дода кор мекунад.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ва барои фаҳмидани он ки дар он ҷо чӣ рӯй дода истодааст, агар шумо дар гузориши қаблӣ набудед, ҳоло биёед як назарияи каме гирем. Назария дар бораи раванди дохилӣ. Чаро чангкашаки мошин ва он чӣ кор мекунад?

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

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

Дар айни замон, мо кор бо базаи маълумотро идома медиҳем ва ворид кардани баъзе тағиротро ба ҷадвал идома медиҳем. Ва дар ин сатрҳо, ки мо метавонем онҳоро дубора истифода кунем, мо маълумоти нав менависем. Ва ҳамин тавр мо давра ба даст меорем, яъне ҳама вақт дар он ҷо хатҳои кӯҳнаи мурда пайдо мешаванд, ба ҷои онҳо мо сатрҳои наверо, ки ба мо лозиманд, менависем. Ва ин ҳолати муқаррарӣ барои кори PostgreSQL аст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ҳангоми садама чӣ рӯй дод? Ин раванд дар он ҷо чӣ гуна сурат гирифт?

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

Аммо дар айни замон мо кор бо ҷадвалро идома медиҳем. Мо дар он коре мекунем, онро навсозӣ мекунем, маълумотро тағир медиҳем. Дар ин вақт базаи маълумот бояд чӣ кор кунад? Вай чорае надорад, ки ба охири ҷадвали мавҷуда сатрҳои нав илова кунад. Ва ҳамин тавр андозаи мизи мо ба варам кардан оғоз мекунад.

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

Ва вақте ки мо дархостро иҷро мекунем, базаи маълумот бояд аз тамоми сатрҳо гузарад: ҳам сурх ва ҳам сабз, барои ёфтани хати дилхоҳ. Ва таъсири дабдабанок кардани миз бо маълумоти бефоидаро “блоат” меноманд, ки фазои диски моро низ мехӯрад. Дар хотир доред, ки он 2 МБ буд, 300 МБ шуд? Акнун мегабайтҳоро ба гигабайт иваз кунед ва шумо тамоми захираҳои диски худро зуд аз даст медиҳед.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Барои мо чӣ оқибатҳо дошта метавонанд?

  • Дар мисоли ман, ҷадвал ва индекс 150 маротиба афзоиш ёфт. Баъзе аз мизоҷони мо ҳолатҳои марговар бештар доштанд, вақте ки онҳо танҳо аз тамом шудани фазои диск сар карданд.
  • Андозаи худи ҷадвалҳо ҳеҷ гоҳ кам намешавад. Автовакуум дар баъзе ҳолатҳо метавонад думи мизро бурида, агар танҳо хатҳои мурда вуҷуд дошта бошанд. Аммо азбаски гардиши доимӣ вуҷуд дорад, як хати сабз метавонад дар охир ях кунад ва навсозӣ нашавад, дар ҳоле ки ҳамаи дигарон дар ҷои аввали лавҳа навишта мешаванд. Аммо ин як воқеаи аз эҳтимол дур нест, ки худи мизи шумо хурд мешавад, аз ин рӯ шумо набояд ба он умед бастан лозим аст.
  • Махзани маълумот бояд як қатор хатҳои бефоидаро ҷудо кунад. Ва мо захираҳои дискро беҳуда сарф мекунем, мо захираҳои протсессор ва нерӯи барқро сарф мекунем.
  • Ва ин бевосита ба замимаи мо таъсир мерасонад, зеро агар дар аввал мо барои дархост 10 миллисония, барои коди худ 10 миллисония сарф мекардем, пас ҳангоми садама мо як сонияро барои дархост ва 10 миллисония барои код сарф кардем, яъне фармоиши миқёси иҷрои барнома коҳиш ёфт. Ва ҳангоме ки садама ҳал карда шуд, мо ба як дархост 20 миллисония, барои код 10 миллисония сарф кардем. Ин чунин маъно дорад, ки мо хануз хосилнокии мехнатро якуним баробар кам кардем. Ва ин ҳама ба хотири як муомилае аст, ки шояд бо айби мо ях бастааст.
  • Ва савол: «Чӣ тавр мо ҳама чизро баргардонем?», то ҳама чиз дар мо хуб бошад ва дархостҳо мисли пеш аз садама зудтар ворид шаванд.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Бо ин максад цикли муайяни кор ба чо оварда мешавад.

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

Вақте ки шумо ин ҷадвалҳоро ёфтед, шумо бояд онҳоро фишурда кунед. Барои ин аллакай асбобҳо мавҷуданд. Дар корхонаи мо мо се асбобро истифода мебарем. Якум - вакууми дарунсохт. Вай бераҳм, сахтгир ва бераҳм аст, вале баъзан хеле муфид аст. Pg_repack и pgcompacttable - Инҳо утилитаҳои тарафи сеюм барои фишурдани ҷадвалҳо мебошанд. Ва онхо ба база бодиккаттар муносибат мекунанд.

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

Пас аз он ки мо ҳама чизро ислоҳ кардем ва боварӣ ҳосил кардем, ки ҳама чиз хуб аст, мо бояд донем, ки чӣ гуна ин вазъиятро дар оянда пешгирӣ кунем:

  • Онро ба осонӣ пешгирӣ кардан мумкин аст. Шумо бояд давомнокии сессияҳоро дар сервери Мастер назорат кунед. Сеансҳои махсусан хатарнок дар ҳолати бекорӣ. Инҳо онҳое ҳастанд, ки танҳо транзаксия кушоданд, коре карданд ва рафтанд ё танҳо овезон шуданд, дар код гум шуданд.
  • Ва барои шумо, ҳамчун таҳиягарон, ҳангоми ба миён омадани ин ҳолатҳо санҷиши коди худ муҳим аст. Кор кардан душвор нест. Ин як санҷиши муфид хоҳад буд. Шумо аз шумораи зиёди мушкилоти "кӯдакона", ки бо муомилоти дарозмуддат алоқаманданд, канорагирӣ хоҳед кард.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Дар ин графикҳо ман мехостам ба шумо нишон диҳам, ки чӣ гуна аломат ва рафтори пойгоҳи додаҳо пас аз гузаштани аломати VACUUM FULL дар ин ҳолат тағир ёфтааст. Ин барои ман истеҳсолот нест.

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Ҳикояи дуюм, ки дар он мо сарборӣ ва оптимизатсияи захираҳои серверро тақсим мекунем

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

  • Мо аллакай калон шуда, бачаҳои ҷиддӣ шудаем. Ва мо мефаҳмем, ки мо нусхабардорӣ дорем ва барои мо хуб мебуд, ки сарбориро баробар кунем: ба устод нависед ва аз реплика хонед. Ва одатан ин вазъият вақте ба миён меояд, ки мо мехоҳем баъзе гузоришҳо ё ETL омода кунем. Ва тиҷорат аз ин хеле шод аст. Вай воқеан мехоҳад гузоришҳои гуногун дошта бошад, ки дорои таҳлилҳои зиёди мураккаб бошанд.
  • Ҳисобот соатҳои зиёдро мегирад, зеро таҳлили мураккабро дар миллисонияҳо ҳисоб кардан мумкин нест. Мо мисли бачахои далер код менависем. Дар замимаи воридкунӣ мо дар Master сабт мекунем ва ҳисоботҳоро дар реплика иҷро мекунем.
  • Тақсимоти бор.
  • Ҳама чиз ба таври комил кор мекунад. Мо бузургем.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

То ин вакт тахтаи хисоботй калон шуда буд. Шумораи онҳо бештар аст. Мо мебинем, ки вақти вокуниши миёнаи сервер мӯътадил аст. Мо мебинем, ки дар реплика мо як амалиёти дарозмуддат дорем, ки дар тӯли 2 соат кор мекунад. Мо кори ороми автовакуумро мебинем, ки хатхои мурдаро кор карда мебарояд. Ва ҳама чиз бо мо хуб аст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Махсусан, мувофиқи лавҳаи санҷидашуда, мо дар он ҷо навсозии бақияи ҳисобро идома медиҳем. Ва мо инчунин вақти вокуниши устувор барои дархостҳо, истеъмоли устувори захираҳо дорем. Дар мо ҳама чиз хуб аст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ҳама чиз хуб аст, то он даме, ки ин гузоришҳо аз сабаби ихтилоф бо такрорӣ оташ заданд. Ва онҳо бо фосилаҳои муқаррарӣ оташ мезананд.

Мо ба интернет меравем ва ба хондан шурӯъ мекунем, ки чаро ин рӯй медиҳад. Ва мо роҳи ҳалли худро пайдо мекунем.

Ҳалли аввал ин зиёд кардани таъхири такрорист. Мо медонем, ки гузориши мо 3 соат давом мекунад. Мо таъхири такрориро ба 3 соат муқаррар кардем. Мо ҳама чизро оғоз мекунем, аммо мо ҳоло ҳам мушкилот дорем, ки гузоришҳо баъзан бекор карда мешаванд.

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Махсусан, аз таблиғи мо, мо мебинем, ки навсозии маълумот дар он низ ба осмон парид. Истеъмоли CPU ба ҳамин монанд хеле зиёд шудааст. Мо боз шумораи зиёди хатхои мурдаи бефоидаро аз cap мегузаронем. Ва вақти вокуниш ба ин аломат ва шумораи муомилот коҳиш ёфтааст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Агар мо намедонем, ки ман пештар дар бораи чӣ гап мезадам, ин чӣ гуна хоҳад буд?

  • Мо ба ҷустуҷӯи мушкилот шурӯъ мекунем. Агар мо дар қисми аввал бо мушкилот рӯ ба рӯ шуда бошем, мо медонем, ки ин метавонад бо сабаби муомилоти тӯлонӣ бошад ва ба устод равем. Мо дар бораи устод мушкилот дорем. Ӯро ҳасиб мекунад. Он гарм мешавад, миёнаи сарбории он тақрибан сад аст.
  • Дархостҳо дар он ҷо суст мешаванд, аммо мо дар он ҷо ягон амалиёти дарозмуддатро намебинем. Ва мо намефаҳмем, ки чӣ гап аст. Мо намефаҳмем, ки ба куҷо нигоҳ кунем.
  • Мо таҷҳизоти серверро тафтиш мекунем. Шояд рейди мо барбод рафт. Шояд хотираи хотираи мо сӯхта бошад. Бале, ҳама чиз метавонад рӯй диҳад. Аммо не, серверҳо наванд, ҳама чиз хуб кор мекунад.
  • Ҳама кор мекунанд: маъмурон, таҳиягарон ва директор. Ҳеҷ чиз кӯмак намекунад.
  • Ва дар як лаҳза ҳама чиз ногаҳон худро ислоҳ мекунад.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

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

  • hot_standby_feedback-ро фаъол накунед? Бале, тавсия дода намешавад, ки онро бе сабабҳои сахт фаъол созед. Зеро ин гардиш бевосита ба сервери Мастер таъсир мерасонад ва кори автовакуумро дар он ҷо бозмедорад. Бо фаъол кардани он дар баъзе нусхабардорӣ ва фаромӯш кардани он, шумо метавонед устодро кушед ва бо барнома мушкилоти калон пайдо кунед.
  • Таъхири max_standby_streaming_delay зиёд карда шавад? Бале, барои гузоришҳо ин дуруст аст. Агар шумо гузориши сесоата дошта бошед ва намехоҳед, ки он аз сабаби ихтилофоти такрорӣ вайрон шавад, пас танҳо таъхирро зиёд кунед. Ҳисоботи дарозмуддат ҳеҷ гоҳ маълумотеро талаб намекунад, ки ҳоло ба пойгоҳи додаҳо ворид шудааст. Агар шумо онро се соат дошта бошед, пас шумо онро дар тӯли якчанд давраи маълумоти кӯҳна иҷро мекунед. Ва барои шумо, оё таъхири се соат ё шаш соат ҳеҷ фарқияте надорад, аммо шумо пайваста гузоришҳо мегиред ва бо афтодани онҳо мушкилот нахоҳед дошт.
  • Табиист, ки шумо бояд сеансҳои тӯлониро дар репликаҳо назорат кунед, хусусан агар шумо қарор диҳед, ки hot_standby_feedback-ро дар реплика фаъол созед. Зеро ҳама чиз метавонад рӯй диҳад. Мо ин нусхаро ба таҳиякунанда додем, то ӯ дархостҳоро санҷида тавонад. Ӯ дархости девонавор навишт. Вай онро ба кор андохта, барои чой нӯшидан рафт ва мо устоди муқарраршударо гирифтем. Ё шояд мо дар он ҷо аризаи нодуруст гузоштаем. Ҳолатҳо гуногунанд. Ҷаласаҳои такрорӣ бояд мисли Master бодиққат назорат карда шаванд.
  • Ва агар шумо дар бораи репликаҳо дархостҳои зуд ва дароз дошта бошед, пас дар ин ҳолат беҳтар аст, ки онҳоро тақсим кунед, то сарборӣ тақсим карда шавад. Ин пайванд ба streaming_delay аст. Барои тезтар, як нусха бо таъхири хурди такрорӣ дошта бошед. Барои дархостҳои гузоришдиҳии дарозмуддат, як нусхае дошта бошед, ки метавонад 6 соат ё як рӯз ақиб ояд. Ин як ҳолати комилан муқаррарӣ аст.

Мо оқибатҳоро ҳамин тавр бартараф мекунем:

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

Ҳикояи дуюм дар ин ҷо ба охир мерасад. Биёед ба достони сеюм гузарем.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Инчунин барои мо, ки дар он ҷо муҳоҷират мекунем, хеле маъмул аст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

  • Ҳар як маҳсулоти нармафзор афзоиш меёбад. Талабот ба он тагьир меёбад. Дар ҳар сурат мо мехоҳем рушд кунем. Ва чунин мешавад, ки мо бояд маълумотро дар ҷадвал навсозӣ кунем, яъне навсозиро дар робита ба муҳоҷирати мо барои функсияи наве, ки мо ҳамчун як қисми рушди худ ҷорӣ мекунем, иҷро кунем.
  • Формати кӯҳнаи додаҳо қаноатбахш нест. Фарз мекунем, ки мо ҳоло ба ҷадвали дуюм муроҷиат мекунем, ки ман дар ин ҳисобҳо амалиёт дорам. Ва биёед бигӯем, ки онҳо бо рубл буданд ва мо тасмим гирифтем, ки дақиқиро зиёд кунем ва онро бо копейк иҷро кунем. Ва барои ин мо бояд навсозӣ кунем: майдонро бо маблағи муомилот ба сад зиёд кунед.
  • Дар ҷаҳони имрӯза мо воситаҳои автоматии идоракунии версияи пойгоҳи додаҳоро истифода мебарем. Биёед бигӯем Ликибаза. Мо муҳоҷирати худро дар онҷо сабти ном мекунем. Мо онро дар базаи озмоишии худ санҷем. Ҳама чиз хуб аст. Навсозӣ идома дорад. Он корро барои муддате блок мекунад, аммо мо маълумоти навро мегирем. Ва мо метавонем дар ин бора функсияҳои навро оғоз кунем. Ҳама чиз санҷида шуд ва санҷида шуд. Ҳама чиз тасдиқ карда шуд.
  • Корҳои пешбинишударо анҷом дода, муҳоҷиратро анҷом додем.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ин аст муҳоҷират бо навсозӣ дар пеши шумо. Азбаски ин транзаксияҳои ҳисоби ман мебошанд, табақ 15 ГБ буд. Ва азбаски мо ҳар як сатрро навсозӣ мекунем, бо навсозӣ андозаи ҷадвалро дучанд кардем, зеро мо ҳар як сатрро аз нав навиштем.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ҳангоми муҳоҷират мо бо ин лавҳа коре карда натавонистем, зеро ҳама дархостҳо ба он дар навбат буданд ва то анҷоми ин навсозӣ интизор буданд. Аммо дар ин ҷо ман мехоҳам таваҷҷӯҳи шуморо ба рақамҳое ҷалб намоям, ки дар меҳвари амудӣ ҳастанд. Яъне, мо вақти миёнаи дархост пеш аз муҳоҷират тақрибан 5 миллисония ва сарбории протсессор дорем, шумораи амалиёти блок барои хондани хотираи диск камтар аз 7,5 аст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Муҳоҷиратро анҷом додем ва боз мушкилот пеш омад.

Муҳоҷират муваффақ буд, аммо:

  • Функсияи кӯҳна ҳоло барои анҷом додани он вақти зиёдтар мегирад.
  • Ҷадвал боз калон шуд.
  • Сарбории сервер боз аз пештара зиёдтар шуд.
  • Ва, албатта, мо то ҳол бо функсияи хуб кор карда истодаем, мо онро каме такмил додем.

Ва ин боз варам аст, ки боз зиндагии моро хароб мекунад.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

Ва агар мо ба ҷадвали ҳисобҳо муроҷиат кунем, мебинем, ки вақти миёнаи дархост барои ин ҷадвал ду баробар зиёд шудааст. Сарборӣ ба протсессор ва шумораи сатрҳои дар хотира мураттабшуда аз 7,5 боло ҷаҳид, аммо камтар буд. Ва он дар мавриди протсессорҳо 2 маротиба, дар ҳолати амалиёти блок 1,5 маротиба боло рафт, яъне мо дар кори сервер таназзул гирифтем. Ва дар натиҷа - таназзули иҷрои барномаи мо. Дар баробари ин шумораи зангҳо тақрибан дар як сатҳ боқӣ мондааст.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

  • Чунин муҳоҷирати калон ба таври худкор ба амал намеояд. Онҳо бояд ҳамеша зери назорат бошанд.
  • Назорати шахси донишманд лозим аст. Агар шумо дар дастаи худ DBA дошта бошед, бигзор DBA ин корро кунад. Ин кори ӯст. Агар не, пас бигзор шахси ботаҷрибатарин кор кунад, ки бо базаҳои маълумот кор карданро медонад.
  • Схемаи нави пойгоҳи додаҳо, ҳатто агар мо як сутунро навсозӣ кунем ҳам, мо ҳамеша дар марҳила омода мешавем, яъне пешакӣ пеш аз баровардани версияи нави барнома:
  • Майдонҳои нав илова карда мешаванд, ки дар онҳо мо маълумоти навшударо сабт хоҳем кард.
  • Мо маълумотро аз майдони кӯҳна ба майдони нав дар қисмҳои хурд интиқол медиҳем. Чаро мо ин корро карда истодаем? Аввалан, мо ҳамеша раванди ин равандро назорат мекунем. Мо медонем, ки мо аллакай ин қадар партияҳоро интиқол додаем ва мо ин қадар партияҳо мондаем.
  • Ва таъсири дуюми мусбӣ ин аст, ки мо дар байни ҳар як чунин партия транзаксияро баста, навашро мекушоем ва ин имкон медиҳад, ки автовакуум мувофиқи плита кор кунад, хатҳои мурдаро барои истифодаи такрорӣ қайд кунем.
  • Барои сатрҳое, ки ҳангоми кор кардани барнома пайдо мешаванд (мо то ҳол барномаи кӯҳнаро иҷро мекунем), мо триггер илова мекунем, ки арзишҳои навро ба майдонҳои нав менависад. Дар ҳолати мо, ин зарб ба сад арзиши кӯҳна аст.
  • Агар мо комилан якрав бошем ва ҳамон майдонро дошта бошем, пас пас аз ба итмом расидани ҳама муҳоҷират ва пеш аз паҳн кардани версияи нави барнома, мо танҳо номи майдонҳоро иваз мекунем. Ба майдонҳои кӯҳна номи ихтироъшуда дода мешавад ва майдонҳои нав ба майдонҳои кӯҳна табдил дода мешаванд.
  • Ва танҳо пас аз он мо версияи нави барномаро оғоз мекунем.

Ва дар баробари ин мо дам дабдабанок намешавем ва аз чидати ичрои кор азоб намекашем.

Дар ин ҷо ҳикояи сеюм ба охир мерасад.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat.sql

https://github.com/dataegret/pg-utils/blob/master/sql/table_bloat_approx.sql

Ва ҳоло тафсилоти каме дар бораи асбобҳое, ки ман дар ҳикояи аввал гуфта будам.

Пеш аз ҷустуҷӯи bloat, шумо бояд васеъкуниро насб кунед pgstattuple.

Барои он ки шумо ба саволҳо муроҷиат накунед, мо ин дархостҳоро дар кори худ аллакай навиштаем. Шумо метавонед онҳоро истифода баред. Дар ин ҷо ду дархост вуҷуд дорад.

  • Аввалин кор вақти хеле тӯлонӣ мегирад, аммо он ба шумо арзишҳои дақиқи варамро аз ҷадвал нишон медиҳад.
  • Дуюмаш тезтар кор мекунад ва хеле самаранок аст, вақте ки ба шумо лозим аст, ки мувофиқи ҷадвал зуд баҳо диҳед, ки варам вуҷуд дорад ё не. Ва шумо инчунин бояд фаҳмед, ки варам ҳамеша дар ҷадвали Postgres мавҷуд аст. Ин як хусусияти модели MVCC аст.
  • Ва 20% варам барои ҷадвалҳо дар аксари ҳолатҳо муқаррарӣ аст. Яъне набояд хавотир нашавед ва ин ҷадвалро фишурда кунед.

Мо фаҳмидем, ки чӣ гуна ҷадвалҳоеро, ки бо маълумоти бефоида варам кардаанд, муайян кунем.

Акнун дар бораи чӣ гуна ислоҳ кардани варам:

  • Агар мо як планшети хурд ва дискҳои хуб дошта бошем, яъне дар планшет то гигабайт, истифодаи VACUUM FULL комилан имконпазир аст. Вай дар тӯли чанд сония аз шумо қулфи истисноиро дар миз мегирад ва хуб аст, аммо ӯ ҳама чизро зуд ва сахт иҷро мекунад. VACUUM FULL чӣ кор мекунад? Он қулфи истисноии мизро мегирад ва сатрҳои зиндаро аз ҷадвалҳои кӯҳна ба ҷадвали нав аз нав менависад. Ва дар охир ӯ онҳоро иваз мекунад. Он файлҳои кӯҳнаро нест мекунад ва файлҳои кӯҳнаро бо файлҳои нав иваз мекунад. Аммо дар тӯли кори худ, он қулфи истисноиро дар миз мегирад. Ин маънои онро дорад, ки шумо бо ин ҷадвал ҳеҷ кор карда наметавонед: на ба он нависед, на хондан ва на тағир додан. Ва VACUUM FULL барои навиштани маълумот фазои иловагии дискро талаб мекунад.
  • Воситаи навбатӣ pg_repack. Аз рӯи принсипи худ, он ба VACUUM FULL хеле монанд аст, зеро он инчунин маълумотро аз файлҳои кӯҳна ба файлҳои нав сабт мекунад ва онҳоро дар ҷадвал иваз мекунад. Аммо дар айни замон, он қулфи истисноии мизро дар ибтидои кори худ намегирад, балки онро танҳо дар лаҳзае мегирад, ки барои иваз кардани файлҳо аллакай маълумоти тайёр дорад. Талаботи захираҳои диски он ба талаботи VACUUM FULL монанд аст. Ба шумо фазои иловагии диск лозим аст ва ин баъзан муҳим аст, агар шумо ҷадвалҳои терабайт дошта бошед. Ва он хеле ба протсессор гурусна аст, зеро он бо I/O фаъолона кор мекунад.
  • Утили сеюм аст pgcompacttable. Он бо захираҳо бештар эҳтиёткор аст, зеро он аз рӯи принсипҳои каме дигар кор мекунад. Идеяи асосии pgcompacttable дар он аст, ки он бо истифода аз навсозиҳо дар ҷадвал ҳамаи сатрҳои зиндаро ба аввали ҷадвал интиқол медиҳад. Ва он гоҳ он дар ин ҷадвал холӣ мекунад, зеро мо медонем, ки мо дар аввал сатрҳои зинда ва дар охир сатрҳои мурда дорем. Ва худи чангкашак ин думро мебурад, яъне он фазои иловагии дискро талаб намекунад. Ва дар баробари ин, аз чихати захирахо хануз хам фишурдан мумкин аст.

Ҳама чиз бо асбобҳо.

Хатогиҳои маъмулӣ дар барномаҳое, ки ба варам кардан дар postgresql оварда мерасонанд. Андрей Сальников

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

  • https://www.slideshare.net/alexius2Mb/where-is-the-space-postgres — Ин гузориши ҳамкори ман аст. Ин умумӣ дар бораи он аст, ки фазои Postgres дар давоми кор ва ҳаёти худ куҷо меравад. Ва як порчаи хеле калон ва муфассали техникӣ барои маъмурони пойгоҳи додаҳо дар бораи bloat вуҷуд дорад.
  • https://github.com/dataegret/pg-utils - ин пайванд ба анбори мост, ки дар он мо як қатор скриптҳои муфидро барои санҷиши ҳолати пойгоҳи додаҳо нигоҳ медорем. Дар он ҷо шумо метавонед скриптҳоро барои ҷустуҷӯи bloat пайдо кунед.
  • Сеюм и чорум пайвандҳо ба асбобҳое, ки ба шумо дар коҳиш додани аломатҳо кӯмак мекунанд.
  • http://blog.dataegret.com/2Mb018/03/postgresql-bloatbusters.html — ин навиштаи хамкасби ман аст. Дар он ҷо вай ба таври ҷиддӣ ва техникӣ варамро дар сатҳи наздик ба маъмурон таҳлил мекунад.

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

Саволҳои шумо

Ташаккур барои гузориш! Шумо дар бораи чӣ гуна шумо метавонед мушкилотро муайян кунед. Чӣ тавр онҳоро огоҳ кардан мумкин аст? Яъне, ман вазъияте доштам, ки дархостҳо на танҳо аз сабаби он ки онҳо ба баъзе хидматҳои беруна дастрасӣ доштанд, овезон мешуданд. Инҳо танҳо баъзе пайвастагиҳои ваҳшӣ буданд. Якчанд дархостҳои ночизи безараре буданд, ки дар тӯли як рӯз овезон буданд ва сипас ба корҳои бемаънӣ шурӯъ карданд. Яъне ба он чизе ки шумо тавсиф мекунед, хеле монанд аст. Инро чӣ гуна пайгирӣ кардан мумкин аст? Нишаста мунтазам тамошо кунед, ки кадом дархост дармондааст? Чӣ тавр инро пешгирӣ кардан мумкин аст?

Дар ин ҳолат, ин вазифа барои маъмурони ширкати шумост, на ҳатман барои DBA.

Ман администратор ҳастам.

PostgreSQL дорои намуди бо номи pg_stat_activity мебошад, ки дархостҳои овезонро нишон медиҳад. Ва шумо мебинед, ки он дар он ҷо чӣ қадар овезон аст.

Оё ман бояд ҳар 5 дақиқа даромада бубинам?

Cron насб кунед ва тафтиш кунед. Агар шумо дархости дарозмуддат дошта бошед, нома нависед ва ин аст. Яъне, ба шумо лозим нест, ки бо чашмони худ нигоҳ кунед, онро автоматӣ кардан мумкин аст. Шумо мактуб мегиред, шумо ба он муносибат мекунед. Ё шумо метавонед ба таври худкор тирандозӣ кунед.

Оё ягон сабабҳои равшане вуҷуд доранд, ки чаро ин рӯй медиҳад?

Ман баъзеро номбар кардам. Дигар мисолҳои мураккабтар. Ва метавон гуфт, ки муддати тӯлонӣ сӯҳбат кунад.

Ташаккур барои гузориш! Ман мехостам дар бораи утилитаи pg_repack фаҳмонам. Агар вай қулфи истисноӣ накунад, пас ...

Вай қулфи истисноӣ мекунад.

... он гоҳ ман эҳтимолан маълумотро гум карда метавонам. Оё дар ин муддат аризаи ман набояд чизе сабт кунад?

Не, он бо ҷадвал бемаънӣ кор мекунад, яъне pg_repack аввал ҳама хатҳои зиндаро интиқол медиҳад. Табиист, ки дар он ҷо як навъ воридшавӣ ба ҷадвал рух медиҳад. Ӯ танҳо ин думи пониро партофта истодааст.

Яъне, ӯ воқеан дар ниҳоят ин корро мекунад?

Дар ниҳоят, ӯ барои иваз кардани ин файлҳо қулфи истисноиро мегирад.

Оё он аз VACUUM FULL тезтар хоҳад буд?

VACUUM FULL, ҳамин ки оғоз шуд, фавран қулфи истисноиро гирифт. Ва то он даме, ки ҳама чизро иҷро кунад, вайро раҳо намекунад. Ва pg_repack қулфи истисноиро танҳо дар вақти иваз кардани файл мегирад. Дар айни замон шумо дар он ҷо наменависед, аммо маълумот гум намешавад, ҳама чиз хуб мешавад.

Салом! Шумо дар бораи кори мошини чангкашак сухан ронд. График бо ҳуҷайраҳои сабти сурх, зард ва сабз мавҷуд буд. Яъне, зардҳо - ӯ ҳамчун ҳазфшуда қайд кард. Ва дар натиҷа, ба онҳо чизи нав навиштан мумкин аст?

Бале. Postgres хатҳоро нест намекунад. Вай чунин хусусият дорад. Агар мо сатрро навсозӣ кунем, мо хатти кӯҳнаро ҳамчун ҳазфшуда қайд кардем. Дар он ҷо ID-и муомилот, ки ин сатрро тағир додааст, пайдо мешавад ва мо сатри нав менависем. Ва мо сессияҳое дорем, ки эҳтимолан онҳоро хонда метавонанд. Дар баъзе мавридҳо онҳо хеле пир мешаванд. Ва мохияти кори автовакуум аз он иборат аст, ки вай аз ин хатхо мегузарад ва онхоро нодаркор кайд мекунад. Ва шумо метавонед дар он ҷо маълумотро аз нав нависед.

Ман мефаҳмам. Аммо савол дар бораи он нест. Ман тамом накардам. Фарз мекунем, ки мо миз дорем. Он дорои майдонҳои андозаи тағйирёбанда. Ва агар ман кӯшиш кунам, ки чизи навро ворид кунам, он метавонад ба ҳуҷайраи кӯҳна мувофиқат накунад.

Не, дар ҳар сурат тамоми хат дар он ҷо нав карда мешавад. Postgres ду модели нигоҳдории маълумот дорад. Он аз намуди маълумот интихоб мекунад. Маълумоте мавҷуд аст, ки бевосита дар ҷадвал нигоҳ дошта мешавад ва инчунин маълумотҳои tos мавҷуданд. Инҳо миқдори зиёди маълумот мебошанд: text, json. Онҳо дар лавҳаҳои алоҳида нигоҳ дошта мешаванд. Ва мувофиқи ин лавҳаҳо, ҳамон як ҳикоя бо варам рух медиҳад, яъне ҳама чиз якхела аст. Онҳо танҳо алоҳида номбар шудаанд.

Ташаккур барои гузориш! Оё истифодаи дархостҳои тайм-аути изҳорот барои маҳдуд кардани давомнокӣ қобили қабул аст?

Хеле қобили қабул. Мо инро дар ҳама ҷо истифода мебарем. Ва азбаски мо хидматҳои шахсии худро надорем, мо дастгирии дурдаст медиҳем, мо мизоҷони хеле гуногун дорем. Ва ҳама аз ин комилан қаноатманданд. Яъне, мо корҳои cron дорем, ки тафтиш мекунанд. Давомнокии сессияҳо танҳо бо муштарӣ мувофиқа карда мешавад, ки мо пеш аз он розӣ нестем. Ин метавонад як дақиқа бошад, он метавонад 10 дақиқа бошад. Он аз сарбории пойгоҳ ва ҳадафи он вобаста аст. Аммо ҳамаи мо pg_stat_activity-ро истифода мебарем.

Ташаккур барои гузориш! Ман кӯшиш мекунам, ки гузориши шуморо ба барномаҳои худ татбиқ кунам. Ва чунин ба назар мерасад, ки мо дар ҳама ҷо муомилотро оғоз мекунем ва онро дар ҳама ҷо ба таври возеҳ анҷом медиҳем. Агар ягон истисно вуҷуд дошта бошад, пас бозгардонидан ҳоло ҳам рух медиҳад. Ва он гоҳ ман фикр карданро сар кардам. Баъд аз ҳама, транзаксия метавонад ба таври возеҳ оғоз нашавад. Эҳтимол, ин як ишораи духтар аст. Агар ман сабтро навсозӣ кунам, оё транзаксия дар PostgreSQL оғоз мешавад ва танҳо вақте ки пайвастшавӣ қатъ карда мешавад?

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

Яъне, он фавран пас аз навсозӣ баста мешавад?

Он аз танзимот вобаста аст. Ман як танзимотро номбар кардам. Ин ӯҳдадории худкор аст. Ин хеле маъмул аст. Агар он фаъол бошад, пас транзаксия кушода ва баста шудааст. Агар шумо ба таври возеҳ нагуфтед, ки "оғози транзаксия" ва "амалиёт анҷом дода шавад", аммо танҳо дархостро ба сессия оғоз кардед.

Салом! Ташаккур барои гузориш! Биёед тасаввур кунем, ки мо пойгоҳи додаҳо дорем, ки варам мекунад ва варам мекунад ва он гоҳ фазои сервер тамом мешавад. Оё ягон восита барои ислоҳи ин вазъият вуҷуд дорад?

Фазо дар сервер бояд дуруст назорат карда шавад.

Масалан, DBA барои чой рафт, дар курорт буд ва ғайра.

Вақте ки системаи файлӣ сохта мешавад, ҳадди аққал як намуди фазои захиравӣ эҷод карда мешавад, ки дар он маълумот навишта нашудааст.

Чӣ мешавад, агар он комилан зери сифр бошад?

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

Оё ягон асбоби дигар вуҷуд дорад?

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

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

Онҳо низ онҳоро бастабандӣ мекунанд.

Аммо вакуум ба индекс таъсир намерасонад?

Баъзеҳо бо индекс кор мекунанд. Масалан, pg_rapack, pgcompacttable. Вакуум индексҳоро дубора эҷод мекунад ва ба онҳо таъсир мерасонад. Бо VACUUM FULL идея аз нав навиштани ҳама аст, яъне он бо ҳама кор мекунад.

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

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

Андрей, ман як савол дорам. Ин графикҳои аҷибе, ки шумо ҳангоми муаррифӣ нишон додед, оё инҳо натиҷаи кори як навъ фоидаи шумост? Графикҳо чӣ гуна сохта шуданд?

Ин хидмат аст Окметр.

Оё ин маҳсулоти тиҷоратӣ аст?

Бале. Ин маҳсулоти тиҷоратӣ аст.

Манбаъ: will.com

Илова Эзоҳ