Чаро хатогиҳо содир мешаванд? Онҳо бо ду сабаб анҷом дода мешаванд: ба таври тасодуфӣ, шояд он кор кунад ва аз сабаби надонистани баъзе механизмҳое, ки дар сатҳи байни пойгоҳи додаҳо ва барномаҳо ва инчунин дар худи пойгоҳи додаҳо рух медиҳанд.
Ман ба шумо се мисолро бо тасвирҳои даҳшатнок дар бораи он ки чизҳои бад чӣ гуна ба даст овардаанд, медиҳам. Ман ба шумо дар бораи механизме, ки дар он ҷо рӯй медиҳад, мухтасар мегӯям. Ва чӣ гуна бояд бо онҳо, вақте ки онҳо рӯй дод ва чӣ гуна усулҳои пешгирикунанда барои пешгирии хатогиҳо истифода шаванд. Ман ба шумо дар бораи асбобҳои ёрирасон мегӯям ва истинодҳои муфидро пешниҳод мекунам.
Ман пойгоҳи додаҳои санҷиширо истифода кардам, ки дар он ду ҷадвал доштам. Як лавҳа бо суратҳисобҳои муштарӣ, дигаре бо амалиёти ин ҳисобҳо. Ва бо чанд вақт мо тавозуни ин ҳисобҳоро навсозӣ мекунем.
Маълумоти ибтидоии плита: он хеле хурд аст, 2 МБ. Вақти вокуниш ба пойгоҳи додаҳо ва махсусан барои аломат низ хеле хуб аст. Ва бори хеле хуб - 2 амалиёт дар як сония мувофиқи табақ.
Ва тавассути ин гузориш ман ба шумо графикҳо нишон медиҳам, то шумо фаҳмед, ки чӣ рӯй дода истодааст. Ҳамеша 2 слайд бо графикҳо хоҳад буд. Слайди аввал он чизест, ки умуман дар сервер рӯй медиҳад.
Ва дар ин вазъият мо мебинем, ки дар ҳақиқат аломати хурде дорем. Индекс хурд аст ва 2 МБ аст. Ин диаграммаи аввал дар тарафи чап аст.
Вақти миёнаи посух дар сервер низ устувор ва кӯтоҳ аст. Ин графики болои рост аст.
Графикаи чапи поён дарозтарин транзаксияҳоро нишон медиҳад. Мо мебинем, ки муомилот зуд анҷом дода мешавад. Ва автовакуум дар ин ҷо ҳоло кор намекунад, зеро ин санҷиши ибтидоӣ буд. Он минбаъд хам кор мекунад ва ба мо фоиданок мешавад.
Слайди дуюм ҳамеша ба табақе, ки санҷида мешавад, бахшида мешавад. Дар ин ҳолат, мо мунтазам тавозуни ҳисоби муштариро навсозӣ мекунем. Ва мо мебинем, ки вақти миёнаи вокуниш барои амалиёти навсозӣ хеле хуб аст, камтар аз як миллисония. Мо мебинем, ки захираҳои протсессор (ин графики рости боло аст) низ баробар ва хеле хурд истеъмол мешаванд.
Графикаи рости поён нишон медиҳад, ки мо то чӣ андоза хотираи оперативӣ ва дискро дар ҷустуҷӯи хати дилхоҳамон пеш аз навсозӣ аз сар мегузаронем. Ва шумораи амалиётҳо аз рӯи нишона дар як сония 2 аст, чунон ки дар аввал гуфтам.
Ва акнун мо як фоҷиа дорем. Бо баъзе сабабҳо як амалиёти фаромӯшшуда вуҷуд дорад. Одатан, сабабҳо ҳама чизи ғайриоддӣ мебошанд:
Яке аз маъмултарин он аст, ки мо ба дастрасии хидмати беруна дар коди барнома шурӯъ кардем. Ва ин хидмат ба мо ҷавоб намедиҳад. Яъне, мо транзаксия кушодем, дар базаи маълумот тағйирот ворид кардем ва аз замима ба хондани почта ё хидмати дигаре дар дохили инфрасохтори мо рафтем ва бо кадом сабабе ба мо посух намедиҳад. Ва иҷлосияи мо дар ҳолате дармондааст, ки кай ҳал мешавад, маълум нест.
Вазъияти дуюм ин аст, ки дар кодекси мо бо ягон сабаб истисно ба амал омад. Ва дар истисно, мо бастани муомилотро коркард накардаем. Ва мо бо як ҷаласаи овезон бо муомилоти кушод анҷом ёфтем.
Ва охирин низ як парвандаи хеле маъмул аст. Ин рамзи пастсифат аст. Баъзе чаҳорчӯбаҳо транзаксияро мекушоянд. Он овезон аст ва шумо шояд дар барнома намедонед, ки шумо онро овезон доред.
Аломати мо чӣ мешавад? Ҳамин гуна. Вақти вокуниши миёнаи мо аз рӯи аломат якчанд дараҷа баланд шуд. Махсусан дар робита ба захираҳои истеъмолшуда, мо мебинем, ки сарбории коркардкунанда хеле зиёд шудааст. Ин диаграммаи болои рост аст. Ва он зиёд шуд, зеро протсессор бояд як қатор хатҳои бефоидаро дар ҷустуҷӯи хатҳои зарурӣ ҷудо кунад. Ин диаграммаи поёни рост аст. Ва дар натиҷа, шумораи зангҳои мо дар як сония хеле кам шудан гирифт, зеро базаи маълумот барои коркарди ҳамон миқдори дархостҳо вақт надошт.
Мо бояд ба ҳаёт баргардем. Мо ба интернет меравем ва мефаҳмем, ки муомилоти тӯлонӣ боиси мушкилот мегардад. Мо ин транзаксияро пайдо мекунем ва мекушем. Ва ҳама чиз барои мо муқаррарӣ шуда истодааст. Ҳама чиз тавре кор мекунад, ки бояд бошад.
Мо ором шудем, аммо пас аз чанде мо пайхас мекунем, ки барнома ҳамон тавре ки пеш аз ҳолати фавқулодда кор намекунад. Дархостҳо ҳоло ҳам сусттар коркард мешаванд ва ба таври назаррас сусттар. Махсусан дар мисоли ман якуним-ду маротиба сусттар аст. Сарбории сервер низ нисбат ба он ки пеш аз садама зиёд буд.
Ва савол: "Дар ин лаҳза бо пойгоҳ чӣ мешавад?" Ва вазъияти зерин бо база ба амал меояд. Дар диаграммаи транзаксия шумо мебинед, ки он қатъ шудааст ва воқеан амалиёти дарозмуддат вуҷуд надорад. Аммо андозаи аломати марговар ҳангоми садама зиёд шуд. Ва аз он вақт инҷониб онҳо кам нашудаанд. Вақти миёна дар пойгоҳ устувор шуд. Ва чунин ба назар мерасад, ки ҷавобҳо бо суръати қобили қабули мо меоянд. Автовакуум фаъолтар шуд ва бо нишона ба коре шурӯъ кард, зеро он бояд маълумоти бештарро аз байн барад.
Махсусан, мувофиқи лавҳаи санҷишӣ бо ҳисобҳо, ки дар он мо тавозунро иваз мекунем: ба назар чунин мерасад, ки вақти посух ба дархост ба ҳолати муқаррарӣ баргаштааст. Аммо дар асл якуним баробар зиёд аст.
Ва аз бори протсессор мебинем, ки сарбории протсессор пеш аз садама ба арзиши зарурӣ барнагаштааст. Ва сабабҳои он ҷо маҳз дар графикаи рости поён ҷойгиранд. Мумкин аст, ки дар он ҷо миқдори муайяни хотира ҷустуҷӯ карда мешавад. Яъне, барои пайдо кардани сатри зарурӣ, мо ҳангоми ҷудо кардани маълумотҳои бефоида захираҳои сервери базаро сарф мекунем. Шумораи муомилот дар як сония муътадил гардид.
Умуман хуб, аммо вазъият аз пештара бадтар аст. Тоза кардани таназзули пойгоҳи додаҳо дар натиҷаи барномаи мо, ки бо ин пойгоҳи дода кор мекунад.
Ва барои фаҳмидани он ки дар он ҷо чӣ рӯй дода истодааст, агар шумо дар гузориши қаблӣ набудед, ҳоло биёед як назарияи каме гирем. Назария дар бораи раванди дохилӣ. Чаро чангкашаки мошин ва он чӣ кор мекунад?
Ба таври мухтасар барои фаҳмиш. Дар баъзе мавридҳо мо як миз дорем. Мо дар ҷадвал сатрҳо дорем. Ин сатрҳо метавонанд фаъол, зинда ва он чизе, ки мо ҳоло лозим аст. Онҳо дар расм бо ранги сабз ишора шудаанд. Ва хатҳои мурдае ҳастанд, ки аллакай кор карда шудаанд, нав карда шудаанд ва дар онҳо сабтҳои нав пайдо шудаанд. Ва онҳо қайд карда мешаванд, ки онҳо дигар ба пойгоҳи додаҳо ҷолиб нестанд. Аммо онҳо аз сабаби хусусияти Postgres дар ҷадвал ҷойгиранд.
Чаро ба шумо чангкашаки мошин лозим аст? Дар баъзе лаҳзаҳо, автовакуум меояд, ба пойгоҳи додаҳо дастрасӣ пайдо мекунад ва аз он мепурсад: "Лутфан, ба ман ID-и қадимтарин транзаксияро диҳед, ки ҳоло дар пойгоҳи додаҳо кушода аст." Пойгоҳи додаҳо ин ID-ро бармегардонад. Ва автовакуум ба он такя карда, сатрхои чадвалро ба навъхо чудо мекунад. Ва агар ӯ бубинад, ки баъзе сатрҳо бо транзаксияҳои хеле кӯҳна иваз карда шудаанд, пас ӯ ҳақ дорад онҳоро ҳамчун хатҳое қайд кунад, ки мо метавонем дар оянда бо навиштани маълумоти нав дар он ҷо дубора истифода кунем. Ин як раванди замина аст.
Дар айни замон, мо кор бо базаи маълумотро идома медиҳем ва ворид кардани баъзе тағиротро ба ҷадвал идома медиҳем. Ва дар ин сатрҳо, ки мо метавонем онҳоро дубора истифода кунем, мо маълумоти нав менависем. Ва ҳамин тавр мо давра ба даст меорем, яъне ҳама вақт дар он ҷо хатҳои кӯҳнаи мурда пайдо мешаванд, ба ҷои онҳо мо сатрҳои наверо, ки ба мо лозиманд, менависем. Ва ин ҳолати муқаррарӣ барои кори PostgreSQL аст.
Мо мехоҳем, ки ҳама чиз комил бошад. Мо бештар ба боло мебароем. Ва мо дар Интернет як танзимоти олӣ пайдо кардем - hot_standby_feedback. Биёед онро фаъол кунем. Hot_standby_feedback ба мо имкон медиҳад, ки автовакуумро дар Мастер нигоҳ дорем. Ҳамин тариқ, мо аз ихтилофҳои такрорӣ комилан халос мешавем. Ва ҳама чиз барои мо бо гузоришҳо хуб кор мекунад.
Ва дар айни замон бо сервери Мастер чӣ рӯй дода истодааст? Ва мо бо сервери Master дар мушкилӣ қарор дорем. Ҳоло мо графикҳоро мебинем, вақте ки ман ҳардуи ин танзимотро фаъол кардам. Ва мо мебинем, ки сессия дар репликаи мо ба гунае ба вазъ дар сервери Мастер таъсир расонидааст. Вай таъсир мерасонад, зеро вай автовакуумро таваққуф кард, ки хатҳои мурдаро тоза мекунад. Андозаи дастархони мо боз дам баланд шуд. Вақти миёнаи иҷрои дархостҳо дар тамоми пойгоҳи додаҳо низ хеле баланд шуд. Автовакуумхо андаке пурзур шуданд.
Махсусан, аз таблиғи мо, мо мебинем, ки навсозии маълумот дар он низ ба осмон парид. Истеъмоли CPU ба ҳамин монанд хеле зиёд шудааст. Мо боз шумораи зиёди хатхои мурдаи бефоидаро аз cap мегузаронем. Ва вақти вокуниш ба ин аломат ва шумораи муомилот коҳиш ёфтааст.
Ва дар як лаҳза ҳама чиз ногаҳон худро ислоҳ мекунад.
Дар айни замон, дархост дар нусхаи мо коркард ва тарк карда шуд. Мо гузориш гирифтем. Тиҷорат ҳоло ҳам хушбахт аст. Чи тавре ки мебинед, аломати мо боз калон шуд ва кам шуданаш нест. Дар график бо сессияҳо ман як пораи ин муомилоти дарозро аз реплика гузоштам, то шумо ҳисоб кунед, ки то мӯътадил шудани вазъ чӣ қадар вақт лозим мешавад.
Сессия ба охир расид. Ва танҳо пас аз чанд вақт сервер бештар ё камтар ба тартиб меояд. Ва вақти миёнаи посух ба дархостҳо дар сервери Мастер ба ҳолати муқаррарӣ бармегардад. Зеро, нихоят, автовакуум имко-ният дорад, ки ин хатхои мурдаро тоза ва кайд кунад. Ва у ба кори худ шуруъ кард. Ва чӣ қадар зуд ин корро мекунад, мо зуд ба тартиб меоем.
Мувофиқи планшети санҷидашуда, ки дар он мо тавозуни ҳисобҳоро нав мекунем, мо айнан ҳамон тасвирро мебинем. Вақти миёнаи навсозии ҳисоб низ тадриҷан ба эътидол меояд. Захираҳои аз ҷониби коркардкунанда истеъмолшаванда низ кам карда мешаванд. Ва шумораи муомилот дар як сония ба муқаррарӣ бармегардад. Аммо боз ба ҳолати муқаррарӣ бармегардем, на ҳамон тавре ки пеш аз садама будем.
Дар ҳар сурат, мо ба монанди дар ҳолати аввал, якуним-ду маротиба ва баъзан аз ин ҳам зиёдтар, коҳиши натиҷа мегирем.
Ба назар чунин мерасад, ки мо ҳама чизро дуруст кардаем. Борро тақсим кунед. Техника бекор намеистад. Мо дархостҳоро мувофиқи ақли худ тақсим кардем, аммо ба ҳар ҳол ҳамааш бад шуд.
hot_standby_feedback-ро фаъол накунед? Бале, тавсия дода намешавад, ки онро бе сабабҳои сахт фаъол созед. Зеро ин гардиш бевосита ба сервери Мастер таъсир мерасонад ва кори автовакуумро дар он ҷо бозмедорад. Бо фаъол кардани он дар баъзе нусхабардорӣ ва фаромӯш кардани он, шумо метавонед устодро кушед ва бо барнома мушкилоти калон пайдо кунед.
Таъхири max_standby_streaming_delay зиёд карда шавад? Бале, барои гузоришҳо ин дуруст аст. Агар шумо гузориши сесоата дошта бошед ва намехоҳед, ки он аз сабаби ихтилофоти такрорӣ вайрон шавад, пас танҳо таъхирро зиёд кунед. Ҳисоботи дарозмуддат ҳеҷ гоҳ маълумотеро талаб намекунад, ки ҳоло ба пойгоҳи додаҳо ворид шудааст. Агар шумо онро се соат дошта бошед, пас шумо онро дар тӯли якчанд давраи маълумоти кӯҳна иҷро мекунед. Ва барои шумо, оё таъхири се соат ё шаш соат ҳеҷ фарқияте надорад, аммо шумо пайваста гузоришҳо мегиред ва бо афтодани онҳо мушкилот нахоҳед дошт.
Ин аст муҳоҷират бо навсозӣ дар пеши шумо. Азбаски ин транзаксияҳои ҳисоби ман мебошанд, табақ 15 ГБ буд. Ва азбаски мо ҳар як сатрро навсозӣ мекунем, бо навсозӣ андозаи ҷадвалро дучанд кардем, зеро мо ҳар як сатрро аз нав навиштем.
Ҳангоми муҳоҷират мо бо ин лавҳа коре карда натавонистем, зеро ҳама дархостҳо ба он дар навбат буданд ва то анҷоми ин навсозӣ интизор буданд. Аммо дар ин ҷо ман мехоҳам таваҷҷӯҳи шуморо ба рақамҳое ҷалб намоям, ки дар меҳвари амудӣ ҳастанд. Яъне, мо вақти миёнаи дархост пеш аз муҳоҷират тақрибан 5 миллисония ва сарбории протсессор дорем, шумораи амалиёти блок барои хондани хотираи диск камтар аз 7,5 аст.
Муҳоҷиратро анҷом додем ва боз мушкилот пеш омад.
Муҳоҷират муваффақ буд, аммо:
Функсияи кӯҳна ҳоло барои анҷом додани он вақти зиёдтар мегирад.
Ҷадвал боз калон шуд.
Сарбории сервер боз аз пештара зиёдтар шуд.
Ва, албатта, мо то ҳол бо функсияи хуб кор карда истодаем, мо онро каме такмил додем.
Ва ин боз варам аст, ки боз зиндагии моро хароб мекунад.
Агар мо як планшети хурд ва дискҳои хуб дошта бошем, яъне дар планшет то гигабайт, истифодаи VACUUM FULL комилан имконпазир аст. Вай дар тӯли чанд сония аз шумо қулфи истисноиро дар миз мегирад ва хуб аст, аммо ӯ ҳама чизро зуд ва сахт иҷро мекунад. VACUUM FULL чӣ кор мекунад? Он қулфи истисноии мизро мегирад ва сатрҳои зиндаро аз ҷадвалҳои кӯҳна ба ҷадвали нав аз нав менависад. Ва дар охир ӯ онҳоро иваз мекунад. Он файлҳои кӯҳнаро нест мекунад ва файлҳои кӯҳнаро бо файлҳои нав иваз мекунад. Аммо дар тӯли кори худ, он қулфи истисноиро дар миз мегирад. Ин маънои онро дорад, ки шумо бо ин ҷадвал ҳеҷ кор карда наметавонед: на ба он нависед, на хондан ва на тағир додан. Ва VACUUM FULL барои навиштани маълумот фазои иловагии дискро талаб мекунад.
Воситаи навбатӣ pg_repack. Аз рӯи принсипи худ, он ба VACUUM FULL хеле монанд аст, зеро он инчунин маълумотро аз файлҳои кӯҳна ба файлҳои нав сабт мекунад ва онҳоро дар ҷадвал иваз мекунад. Аммо дар айни замон, он қулфи истисноии мизро дар ибтидои кори худ намегирад, балки онро танҳо дар лаҳзае мегирад, ки барои иваз кардани файлҳо аллакай маълумоти тайёр дорад. Талаботи захираҳои диски он ба талаботи VACUUM FULL монанд аст. Ба шумо фазои иловагии диск лозим аст ва ин баъзан муҳим аст, агар шумо ҷадвалҳои терабайт дошта бошед. Ва он хеле ба протсессор гурусна аст, зеро он бо I/O фаъолона кор мекунад.
Утили сеюм аст pgcompacttable. Он бо захираҳо бештар эҳтиёткор аст, зеро он аз рӯи принсипҳои каме дигар кор мекунад. Идеяи асосии pgcompacttable дар он аст, ки он бо истифода аз навсозиҳо дар ҷадвал ҳамаи сатрҳои зиндаро ба аввали ҷадвал интиқол медиҳад. Ва он гоҳ он дар ин ҷадвал холӣ мекунад, зеро мо медонем, ки мо дар аввал сатрҳои зинда ва дар охир сатрҳои мурда дорем. Ва худи чангкашак ин думро мебурад, яъне он фазои иловагии дискро талаб намекунад. Ва дар баробари ин, аз чихати захирахо хануз хам фишурдан мумкин аст.
Ҳама чиз бо асбобҳо.
Агар шумо мавзӯи пурқувватро дар робита ба фаҳмиши минбаъда ҷолиб пайдо кунед, инҳоянд чанд истинодҳои муфид:
https://www.slideshare.net/alexius2Mb/where-is-the-space-postgres — Ин гузориши ҳамкори ман аст. Ин умумӣ дар бораи он аст, ки фазои Postgres дар давоми кор ва ҳаёти худ куҷо меравад. Ва як порчаи хеле калон ва муфассали техникӣ барои маъмурони пойгоҳи додаҳо дар бораи bloat вуҷуд дорад.
https://github.com/dataegret/pg-utils - ин пайванд ба анбори мост, ки дар он мо як қатор скриптҳои муфидро барои санҷиши ҳолати пойгоҳи додаҳо нигоҳ медорем. Дар он ҷо шумо метавонед скриптҳоро барои ҷустуҷӯи bloat пайдо кунед.
Он ҳамеша дастӣ аст. Ва ба таври маҳаллӣ маълум мешавад, ки дар он ҷо чӣ кор кардан беҳтар аст, зеро баъзе маълумотҳо муҳиманд ва баъзеҳо муҳим нестанд. Ва барои ҳар як пойгоҳи додаҳо ва барномае, ки бо он кор мекунад, аз тиҷорат вобаста аст. Он ҳамеша дар маҳал қарор мегирад.
Ташаккур барои гузориш! Ман ду савол дорам. Аввалан, шумо слайдҳоро нишон додед, ки ҳангоми ба амал омадани транзаксияҳо ҳам андозаи фазои ҷадвал ва ҳам андозаи индекс калон мешаванд. Ва минбаъд дар гузориш як қатор хидматҳо мавҷуданд, ки планшетро бастабандӣ мекунанд. Дар бораи индекс чӣ гуфтан мумкин аст?
Онҳо низ онҳоро бастабандӣ мекунанд.
Аммо вакуум ба индекс таъсир намерасонад?
Баъзеҳо бо индекс кор мекунанд. Масалан, pg_rapack, pgcompacttable. Вакуум индексҳоро дубора эҷод мекунад ва ба онҳо таъсир мерасонад. Бо VACUUM FULL идея аз нав навиштани ҳама аст, яъне он бо ҳама кор мекунад.
Ва саволи дуюм. Ман намефаҳмам, ки чаро гузоришҳо дар бораи репликаҳо аз худи реплика ин қадар вобастаанд. Ба назарам чунин менамуд, ки гузоришҳо хонда мешаванд ва такрорӣ навишта мешавад.
Чӣ боиси ихтилофи такрорӣ мегардад? Мо устод дорем, ки дар он равандҳо сурат мегиранд. Мо вакуумкунии мошин давом дорад. Автовакуум воқеан чӣ кор мекунад? Вай чанд сатрхои кухнаро мебурад. Агар дар айни замон мо дар бораи реплика дархосте дошта бошем, ки ин сатрҳои кӯҳнаро мехонад ва дар Мастер вазъияте ба амал омадааст, ки автовакуум ин сатрҳоро барои баргардонидани имкон қайд кардааст, пас мо онҳоро аз нав навиштем. Ва мо як бастаи маълумотро гирифтем, вақте ки ба мо лозим аст, ки он сатрҳоеро, ки дархост дар реплика лозим аст, аз нав нависем, раванди реплика то мӯҳлате, ки шумо танзим кардаед, интизор мешавад. Ва он гоҳ PostgreSQL қарор хоҳад дод, ки барои он чӣ муҳимтар аст. Ва репликатсия барои ӯ аз дархост муҳимтар аст ва ӯ дархостро барои ворид кардани ин тағирот дар реплика партоб мекунад.