Sveikinimai.
Mano vardas Vanya ir aš esu Java kūrėjas. Taip atsitiko, kad aš daug dirbu su PostgreSQL – nustatau duomenų bazę, optimizuoju struktūrą, našumą ir savaitgaliais pažaidžiu DBA.
Neseniai sutvarkiau keletą duomenų bazių mūsų mikroservisuose ir parašiau java biblioteką
Atsakomybės neigimas
Pagrindinė PostgreSQL versija, su kuria dirbu, yra 10. Visos mano naudojamos SQL užklausos taip pat išbandytos 11 versijoje. Mažiausiai palaikoma versija yra 9.6.
priešistorė
Viskas prasidėjo beveik prieš metus nuo man keistos situacijos: konkursinis indekso kūrimas netikėtai baigėsi klaida. Pats indeksas, kaip įprasta, liko duomenų bazėje netinkamos būsenos. Žurnalų analizė parodė trūkumą
Viena problema – numatytoji konfigūracija
Tikriausiai visi jau gerokai pavargę nuo metaforos apie Postgres, kurią galima paleisti kavos virimo aparatu, bet... numatytoji konfigūracija tikrai kelia nemažai klausimų. Bent jau verta atkreipti dėmesį priežiūros_darbo_mem, temp_file_limit, pareiškimo_laikas и lock_timeout.
Mūsų atveju priežiūros_darbo_mem buvo numatytasis 64 MB ir temp_file_limit maždaug 2 GB – tiesiog neturėjome pakankamai atminties didelės lentelės indeksui sukurti.
Todėl į pg-index-health Surinkau seriją
Antra problema – pasikartojantys indeksai
Mūsų duomenų bazės veikia SSD diskuose, ir mes naudojame HA-Konfigūracija su keliais duomenų centrais, pagrindiniu kompiuteriu ir n- kopijų skaičius. Vieta diske mums yra labai vertingas šaltinis; tai ne mažiau svarbu nei našumas ir procesoriaus suvartojimas. Todėl, viena vertus, mums reikia indeksų greitam skaitymui, kita vertus, nenorime duomenų bazėje matyti nereikalingų indeksų, nes jie užima vietą ir sulėtina duomenų atnaujinimą.
O dabar, viską atstačius
Trečia problema – susikertantys indeksai
Dauguma pradedančiųjų kūrėjų indeksus kuria viename stulpelyje. Palaipsniui, nuodugniai patyrę šį verslą, žmonės pradeda optimizuoti savo užklausas ir pridėti sudėtingesnių indeksų, kuriuose yra keli stulpeliai. Taip atsiranda stulpelių rodyklės A, A + B, A+B+C. ir taip toliau. Pirmuosius du iš šių indeksų galima saugiai išmesti, nes jie yra trečiojo priešdėliai. Tai taip pat sutaupo daug vietos diske ir tam yra diagnostika
Ketvirta problema – išoriniai raktai be indeksų
„Postgres“ leidžia kurti išorinio rakto apribojimus nenurodant atsarginio indekso. Daugeliu atvejų tai nėra problema ir gali net nepasireikšti... Kol kas...
Taip buvo ir su mumis: tiesiog tam tikru momentu darbą, vykdantį pagal grafiką ir išvalantį bandomųjų užsakymų duomenų bazę, mums pradėjo „pridėti“ pagrindinis šeimininkas. CPU ir IO nuėjo perniek, užklausos sulėtėjo ir baigėsi, paslauga buvo penki šimtai. Greita analizė
delete from <table> where id in (…)
Šiuo atveju, žinoma, tikslinėje lentelėje buvo indeksas pagal id ir labai mažai įrašų buvo ištrinta pagal sąlygą. Atrodė, kad viskas turėtų veikti, bet, deja, nepavyko.
Į pagalbą atėjo nuostabusis paaiškinti analizuoti ir pasakė, kad be įrašų ištrynimo tikslinėje lentelėje, taip pat yra tikrinamas nuorodos vientisumas, o vienoje iš susijusių lentelių šis patikrinimas nepavyko. nuoseklus nuskaitymas dėl tinkamo indekso trūkumo. Taip gimė diagnostika
Penkta užduotis – nulinė reikšmė indeksuose
Pagal numatytuosius nustatymus „Postgres“ į „btree“ indeksus įtraukia nulines reikšmes, tačiau paprastai jų ten nereikia. Todėl stropiai stengiuosi išmesti šiuos nulius (diagnostika where <A> is not null
. Tokiu būdu man pavyko sumažinti vieno iš mūsų indeksų dydį nuo 1877 MB iki 16 KB. Ir vienoje iš paslaugų duomenų bazės dydis iš viso sumažėjo 16% (4.3 GB absoliučiais skaičiais), nes iš indeksų neįtrauktos nulinės reikšmės. Didžiuliai sutaupoma vietos diske su labai paprastais pakeitimais. 🙂
Šešta problema – pirminių raktų trūkumas
Dėl mechanizmo pobūdžio
Vieną dieną viena nuostabi migracija paėmė ir atnaujino visus įrašus didelėje ir aktyviai naudojamoje lentelėje. Iš netikėtumo gavome +100 GB iki stalo dydžio. Buvo velniškai gaila, bet mūsų nesėkmės tuo nesibaigė. Po 15 valandų pasibaigus autovakuumui ant šio stalo tapo aišku, kad fizinė vieta nebegrįš. Negalėjome sustabdyti paslaugos ir padaryti VACUUM FULL, todėl nusprendėme pasinaudoti
Bibliotekos versijoje 0.1.5 Pridėta galimybė rinkti duomenis iš išpūstų lentelių ir indeksų ir laiku į juos reaguoti.
Septintos ir aštuntos problemos – nepakankami indeksai ir nenaudojami indeksai
Šios dvi diagnostikos yra:
Kaip jau rašiau, mes naudojame konfigūraciją su keliomis kopijomis, o skirtingų kompiuterių skaitymo apkrova iš esmės skiriasi. Dėl to situacija paaiškėja, kad kai kurios lentelės ir indeksai kai kuriuose kompiuteriuose praktiškai nenaudojami, o analizei reikia rinkti statistiką iš visų klasterio kompiuterių.
Šis metodas leido sutaupyti kelias dešimtis gigabaitų pašalinant indeksus, kurie niekada nebuvo naudojami, taip pat įtraukiant trūkstamus indeksus į retai naudojamas lenteles.
Kaip išvadą
Žinoma, beveik visos diagnostikos galite konfigūruoti
Kai kurios diagnostikos gali būti atliekamos atliekant funkcinius testus iš karto po duomenų bazės perkėlimo. Ir tai turbūt viena galingiausių mano bibliotekos funkcijų. Naudojimo pavyzdį galite rasti
Tikslinga tikrinti, ar nėra nenaudojamų ar trūkstamų indeksų, taip pat ar nėra išsipūtimo, tik tikroje duomenų bazėje. Surinktas vertes galima įrašyti
Aš tikrai to tikiuosi pg-index-health bus naudingi ir paklausūs. Taip pat galite prisidėti prie bibliotekos plėtros pranešdami apie rastas problemas ir siūlydami naujas diagnostikos priemones.
Šaltinis: www.habr.com