Tere.
Mina nimi on Vanya ja olen Java arendaja. Juhtus nii, et töötan palju PostgreSQL-iga â tegeleme andmebaasi seadistamise, struktuuri optimeerimise, jĂ”udluse ning natuke mĂ€ngin DBA nĂ€dalavahetustel.
Viimasel ajal olen korrastanud mitmeid andmebaase meie mikroteenustes ja kirjutanud java-raamatukogu , mis lihtsustab seda tööd, sÀÀstab minu aega ja aitab vĂ€ltida mĂ”ningaid tĂŒĂŒpilisi vigu, mida arendajad teevad. Just sellest raamatukogust tĂ€na ka jutt.

MĂ€rkus
Peamine PostgreSQL versioon, millega ma töötan, on 10. KÔik minu kasutatavad SQL pÀringud on samuti kontrollitud 11. versioonis. Minimaalne toetatud versioon on 9.6.
Eellugu
KĂ”ik algas peaaegu aasta tagasi kummalise olukorraga: konkurentsi kĂ€igus indeksi loomine ebaĂ”nnestus. Ise indeks, nagu ikka, jĂ€i andmebaasi kehtetuks. Logide analĂŒĂŒs nĂ€itas, et puudub . Ja siis lĂ€ks lahti... Kaevudes sĂŒgavamale, avastasin terve hunniku probleeme andmebaasi konfiguratsioonis ja tĂ”ukasin kĂ€ised ĂŒles, pannes sĂ€rama silmad, hakkasin neid parandama.
Esimene probleem â vaikesĂ€tte
TĂ”enĂ€oliselt on metafoor Postgresist, mida saab kĂ€ivitada kohvimasinal, kĂ”igil juba kĂ”rini, aga... vaikeconfiguraatsioon tĂ”epoolest tekitab kĂŒsimusi. VĂ€hemalt tasub tĂ€helepanu pöörata maintenance_work_mem, temp_file_limit, statement_timeout ja lock_timeout.
Meie puhul maintenance_work_mem oli vaikesÀteteks 64 MB, kuid temp_file_limit ligikaudu 2 GB - meil oli lihtsalt puudu mÀlu indeksi loomise jaoks suurel tabelil.
SeetÔttu olen pg-index-health koondanud mitmed , minu arvates, parameetrid, mida tasub iga andmebaasi jaoks seadistada.
Teine probleem - dubleeritud indeksid
Meie andmebaasid asuvad SSD ketastel ja kasutame HA-konfiguratsiooni mitme andmekeskusega, meistriserveri ja n-arvu koopiatega. Ruumi kettal on meie jaoks ÀÀrmiselt vÀÀrtuslik ressurss; see on sama oluline kui jĂ”udlus ja CPU tarbimine. SeetĂ”ttu vajame ĂŒhtepidi indekseid kiireks lugemiseks, aga teisest kĂŒljest ei soovi me nĂ€ha andmebaasis liigseid indekseid, kuna need söövad ruumi ja aeglustavad andmete uuendamist.
Ja nii, taastades kĂ”ik ja olles vaadanud , otsustasin teha âsuureâ puhastuse. Selgus, et arendajad ei armasta andmebaasi dokumentatsiooni lugeda. Ăkski neist ei armasta. Selle tĂ”ttu tekivad kaks tĂŒĂŒpilist viga â kĂ€sitsi loodud indeks pĂ”hivĂ”tmele ja sarnane âkĂ€siâ indeks unikaalsele veerule. Asjaolu on see, et neid pole vaja â Postgres teeb kĂ”ik ise. Sellised indeksid vĂ”ib julgelt kustutada ja nende jaoks on vĂ€lja antud diagnostika. .
Kolmas probleem â kattuvad indeksid
Enamik algajaid arendajaid loob indekseid ĂŒhe veeru jaoks. Aja jooksul, kui nad hakkavad seda protsessi korralikult hindama, hakkavad nad optimeerima oma pĂ€ringuid ja lisama keerulisemaid indekseid, mis hĂ”lmavad mitmeid veerge. Nii tekivad indeksid veergudele A, A+B, A+B+C jne. Esimesed kaks neist indeksitest vĂ”ib julgelt vĂ€lja visata, kuna need on kolmanda prefiksid. See sÀÀstab ka diskiruumi ja selleks on olemas diagnostika. .
Neljas probleem â vĂ€lisvĂ”tmed ilma indeksiteta
Postgres vĂ”imaldab luua vĂ€lisvĂ”tme piiranguid nĂ€itamata toetavat indeksi. Paljudes olukordades ei ole see probleemiks, ja isegi ei pruugi end kuidagi ilmutada⊠Kuni hetkeniâŠ
Nii oli ka meiega: lihtsalt mingil hetkel ajastatud töö, mis kustutatakse testtellimustest, hakkas âkogumaâ meile meistrihostit. CPU ja IO lĂ€ksid lakke, pĂ€ringud pidurdusid ja aegusid, teenus andis 500 viga. Kiire analĂŒĂŒs nĂ€itas, et takerdusid pĂ€ringud tĂŒĂŒpi:
kustuta <table> kus id on (…)Samas, indeks ID jĂ€rgi sihtlaudas oli loomulikult olemas ja kirjeid kustutati tingimuse jĂ€rgi ĂŒsna vĂ€he. Tundus, et kĂ”ik peaks töötama, kuid kahjuks ei töötanud.
Abi tuli imelise explain analyze ja ĂŒtles, et lisaks kirje eemaldamisele sihtlaudades toimub ka linkide terviklikkuse kontroll ja ĂŒhel seotud laual jĂ”uab see kontroll jĂ€rjestikusse skaneerimisse sobiva indeksi puudumise tĂ”ttu. Nii sĂŒndis diagnostika. .
Viies probleem â null vÀÀrtus indeksites
Vaikimisi sisaldab Postgres null-vÀÀrtusi btree-indeksites, kuid need ei ole seal reeglina vajalikud. SeetĂ”ttu ĂŒritan ma need nullid hoolikalt eemaldada (diagnostika ), luues osutilised indeksid nullitavate veergude jaoks, nagu kus ei ole nullSel viisil suutsin ma vĂ€hendada ĂŒhe meie indeksi suurust 1877 MB-st 16 KB-ks. Ja ĂŒhes teenuses vĂ€henes andmebaasi kogu suurus 16% (valus mÔÔtudes 4,3 GB) nullvÀÀrtuste eemaldamise tĂ”ttu indeksitest. Kolossaalne ruumi kokkuhoid ĂŒsna lihtsate tĂ€iustuste kaudu. đ
Probleem kuues â esmase vĂ”tme puudumine
Seoses mehhanismi eripĂ€radega on vĂ”imalik olukord, kus teie tabeli suurus kasvab kiiresti suurte hulkade surnud kirjeid tĂ”ttu. Ma arvasin naiivselt, et me ei pea selle pĂ€rast muretsema, ja et meie andmebaas ei satu sellesse situatsiooni, kuna me, vĂ€hemasti, oleme normaalsed arendajad⊠Kui rumal ja naiivne ma olinâŠ
Ăks ilus pĂ€ev uue migratsiooni kĂ€igus vĂ€rskendati kĂ”iki kirjeid suures ja aktiivselt kasutuses olevas tabelis. Saime +100 GB tabeli suurenduseks niisama. See oli kohutavalt kurb, kuid meie seiklused sellega ei lĂ”ppenud. PĂ€rast 15 tunni jooksul lĂ”ppenud automaatsest tĂŒhjendamisest selgus, et fĂŒĂŒsiline ruum ei naase. Me ei saanud teenust peatada ja teha VACUUM FULL, seetĂ”ttu otsustati kasutada . Ja siis selgus, et pg_repack ei oska töötada tabelitega, kus puudub esmane vĂ”ti vĂ”i muu unikaalsuse piirang, ning meie tabelil ei olnud esmase vĂ”ti. Niimoodi sĂŒndis diagnostika .
Raamatukogu versioonis 0.1.5 ilmnes vÔimalus koguda andmeid tabelite ja indeksite paisumise kohta ning sellele Ôigel ajal reageerida.
Probleemid seitse ja kaheksa â indeksite puudumine ja kasutamata indeksid
Kaks jĂ€rgmist diagnostikat â ja ilmnesid oma lĂ”plikus vormis suhteliselt hiljuti. Asi on selles, et neid ei saanud lihtsalt niisama lisada.
Nagu ma juba mainisin, kasutame mitme koopia konfigureerimist ja lugemise koormus erinevatel hostidel on sisuliselt erinev. LĂ”ppkokkuvĂ”ttes tekib olukord, kus teatud tabelid ja indeksid mĂ”nel hostil praktiliselt ei kasutata, ja analĂŒĂŒsimiseks on vajalik koguda statistikat kĂ”igilt klastris olevatelt hostidelt. on samuti vajalik igas hostis klastri sees, ei saa seda teha ainult meistril.
Selle lÀhenemisega suutsime sÀÀsta mitu tosinat gigabaiti, kustutades indekseid, mida kunagi ei kasutatud, ning lisades puuduolevad indekseid harva kasutatavatele tabelitele.
KokkuvÔtteks
Muidugi on enamikku diagnostikast vÔimalik seadistada . Nii saab kiiresti rakendada kontrolle teie rakenduses, vÀltides uusi vigu ja seejÀrel jÀrk-jÀrgult vana parandades.
MĂ”ne diagnostika vĂ”ib teostada juba funktsionaalsetes testides kohe pĂ€rast andmebaasi migratsioonide rakendamist. Ja see on tĂ”enĂ€oliselt ĂŒks minu teegi kĂ”ige vĂ”imsamaid funktsioone. Kasutamise nĂ€idet saab vaadata .
Kontrollid mittekasutatud vĂ”i puuduvate indeksete ning bloat'i osas on mĂ”ttekas teostada ainult reaalsetes andmebaasides. Kogutud vÀÀrtused vĂ”ivad olla salvestatud vĂ”i saadetud jĂ€lgimisse sĂŒsteemi.
Loodan vÀga, et pg-index-health osutub kasulikuks ja nÔutuks. Samuti saate aidata teegi arengut, teavitades avastatud probleemidest ja pakkudes uusi diagnostikaid.
Allikas: habr.com
