PostgreSQL indeksite tervis Java arendaja silmade lÀbi

Tere.

Minu nimi on Vanya ja ma olen Java-arendaja. Olen töötanud palju PostgreSQL-iga – seadistades andmebaase, optimeerides struktuuri, tĂ”husust ja mĂ€ngides natuke DBA-d nĂ€dalavahetustel.

Viimase aja jooksul olen korrastanud mitmeid andmebaase meie mikroteenustes ja kirjutanud Java-raamatukogu pg-index-health, mis lihtsustab seda tööd, sÀÀstab minu aega ja aitab vĂ€ltida mĂ”ningaid tĂŒĂŒpilisi vigu, mida arendajad teevad. Just sellest raamatukogust rÀÀgime tĂ€na.

PostgreSQL indeksite tervis Java arendaja silmade lÀbi

MĂ€rkus

Peamine PostgreSQL versioon, millega ma töötan, on 10. Olen kontrollinud ka kÔiki kasutatavaid SQL-pÀringuid 11. versioonis. MinimumnÔudlik versioon on 9.6.

Eelalugu

KĂ”ik algas peaaegu aasta tagasi kummalise olukorraga minu jaoks: konkurentsivĂ”imeline indekseerimise loomine tĂŒhjal kohal lĂ”ppes veaga. Ise indeks, nagu ikka, jĂ€i vale olekusse andmebaasis. Logide analĂŒĂŒs nĂ€itas, et puudus temp_file_limit. Ja lĂ€ks lahti... SĂŒgavamale kaevudes leidsin hulga probleeme andmebaasi konfiguratsioonis ja ĂŒlesĂ€ratatud kĂ€tega, sĂ€demetega silmades, asusin neid parandama.

Esimene probleem – vaikimisi konfiguratsioon

TĂ”enĂ€oliselt on Postgres'e kohviaparatuuriga kĂ€ivitusmeetanid juba paljudele kĂ”vasti kĂ”rva jÀÀnud, kuid
 vaikeseaded tĂ”epoolest tekitavad mitmeid kĂŒsimusi. Esiteks tasub tĂ€helepanu pöörata maintenance_work_mem, temp_file_limit, statement_timeout ja lock_timeout.

Meie puhul maintenance_work_mem oli vaikimisi 64 MB, kuid temp_file_limit umbes 2 GB – meil lihtsalt ei jĂ€tkunud mĂ€lu suure tabeli indeksi loomiseks.

Seega pg-index-health koondasin mÔned olulised, minu arvates, parameetrid, mida tuleks iga DB jaoks seadistada.

Teine probleem – dubleeritud indeksid

Meie andmebaasid asuvad SSD kettadel ja kasutame HA- konfiguratsiooni mitmete andmekeskustega, peahostiga ja n- arvukate koopiatega. Kettaruumi on meie jaoks vĂ€ga vÀÀrtuslik ressurss; see on sama oluline kui jĂ”udlus ja CPU tarbimine. SeetĂ”ttu vajame, ĂŒhelt poolt, kiire lugemise jaoks indekseid, kuid teisalt ei soovi me DBs nĂ€ha liigseid indekseid, kuna need kulutavad ruumi ja aeglustavad andmete vĂ€rskendamist.

Ja nii, taastades kĂ”ik kehtetud indeksid ja vaadates Oleg Bartunovi ettekandeid, ma otsustasin korraldada «suure» puhastuse. Selgus, et arendajad ei armasta andmebaasi dokumentatsiooni lugeda. Nad ei armasta seda ĂŒldse. Selle tĂ”ttu tekivad kaks tĂŒĂŒpilist viga – kĂ€sitsi loodud indeks primaarvĂ”tmele ja sarnane «kĂ€sitsi» indeks unikaalsele veerule. Asi on selles, et need ei ole vajalikud – Postgres teeb kĂ”ik ise. Selliseid indekse saab julgelt eemaldada ja selleks on vĂ€lja töötatud diagnoos. duplicated_indexes.

Kolmas probleem – kattuvad indeksid

Enamik algajaid arendajaid loob indekseid ĂŒhe veeru pĂ”hjal. Aja jooksul, peale selle ettevĂ”tteks proovimist, hakkavad inimesed oma pĂ€ringute optimeerimist laiendama ja lisama keerulisemaid indekseid, mis hĂ”lmavad mitut veergu. Nii tekivad indeksid veergudele A, A+B, A+B+C jne. Esimese kahe indeksi vĂ”ib julgelt kĂ”rvaldada, kuna need on kolmanda prefiksid. See sÀÀstab ka korralikult kettaruumi ja selle jaoks on vĂ€lja kujundatud diagnoos. intersected_indexes.

Neljandaks probleemiks on vÀlisvÔtmed ilma indeksiteta.

Postgres vÔimaldab luua vÀlisvÔtme piiranguid ilma toetava indeksita. Paljudes olukordades ei ole see probleem, ega pruugi isegi vÀlja tulla... Kuni teatud hetkeni...

Nii juhtus ka meiega: jĂ€rsku hakkas ajastatud job, mis eemaldas testimisjĂ€rgud andmebaasist, meil „laduma” peahostit. CPU ja IO tĂ”usid lakke, pĂ€ringud aeglustusid ja katkestasid ajaĂŒlesande tĂ”ttu, teenus andis 500 viga. Kiire analĂŒĂŒs pg_stat_activity nĂ€itas, et seisma jĂ€id pĂ€ringud, mis nĂ€gid vĂ€lja nagu:

kustuta <table> kus id on (…)

Samuti oli siht tabelis loomulikult indeks id jĂ€rgi, ja kirjeid kustutati tingimuse alusel ĂŒsna vĂ€he. Tundus, et kĂ”ik peaks töötama, aga kahjuks ei töötanud.

Appi tuli imeline explain analyze ja nĂ€itas, et lisaks kirje kustutamisele siht tabelis tehakse veel viidete terviklikkuse kontroll ning ĂŒhe seotud tabeli osas see kontroll kukub jĂ€rjestikusse skaneerimisse sobiva indeksi puudumise tĂ”ttu. Nii sĂŒndis diagnoos foreign_keys_without_index.

Viies probleem – null vÀÀrtus indeksites

Vaikimisi sisaldab Postgres btree-indeksite seas null-vÀÀrtuseid, kuid need ei ole seal tavaliselt vajalikud. SeetĂ”ttu pĂŒĂŒan ma null'id eemaldada (diagnostika indexes_with_null_values), luues osalisi indekseid nullable-veergude tĂŒĂŒbi pĂ”hjal where is not null. Sel viisil olen suutnud vĂ€hendada ĂŒhe meie indeksi suurust 1877 MB-lt 16 KB-le. Ja ĂŒhes teenuses vĂ€henes andmebaasi suurus kokku 16% (4.3 GB absoluutsetes numbrites) null-vÀÀrtuste indeksitest vĂ€ljaarvamise tĂ”ttu. Kolossaalne ruumi kokkuhoid ĂŒsna lihtsate paranduste kaudu. 🙂

Probleem kuus – primaarsete vĂ”tmete puudumine

Postgres'i MVCC mehhanismi tÔttu on vÔimalik olukord, kus bloat, teie tabeli suurus kasvab kiiresti suure hulga surnud kirje tÔttu. Ma arvasin naiivselt, et see meid ei puuduta ja et meie andmebaasiga sellist ei juhtu, sest me, oi-oi!!!, oleme ju normaalsed arendajad
 Kui rumal ja naiivne ma olin


Ühel kaunil pĂ€eval tegi ĂŒks imeline migratsioon kĂ”igis suurtes ja aktiivselt kasutatavates tabelites kĂ”ik kirjed uuenduseks. Meie tabeli suurus suurenes jĂ€rsult +100 GB vĂ”rra. See oli ÀÀrmiselt frustreeriv, kuid meie katsumused sellega ei lĂ”ppenud. PĂ€rast 15 tunni möödumist autovakumeerimisest sel tabelil, sai selgeks, et fĂŒĂŒsiline koht ei naase. Me ei saanud teenust peatada ega teha VACUUM FULL-i, seetĂ”ttu otsustati kasutada pg_repack. Siis selgus, et pg_repack ei oska töödelda tabeleid, millel pole esmast vĂ”tmed vĂ”i mingit unikaalsuse piirangut, ja meie tabelil ei olnud esmast vĂ”tit. Nii sĂŒndis diagnostika tables_without_primary_key.

Raamatukogu versioonis 0.1.5 lisati vÔimalus koguda andmeid tabelite ja indeksite paisumise kohta ning sellele Ôigel ajal reageerida.

Probleemid seitse ja kaheksa – indeksite puudus ja kasutamata indeksid

Kaks jĂ€rgmist diagnostikat — tables_with_missing_indexes ja unused_indexes – ilmusid oma lĂ”plikus vormis suhteliselt hiljuti. Asi on selles, et neid ei saanud lihtsalt juurde lisada.

Nagu ma juba mainisin, kasutame mitme replikaga konfiguratsiooni, kus lugemiskoormus erinevates hostides on pĂ”himĂ”tteliselt erinev. Tulemuseks on olukord, kus mĂ”ned tabelid ja indeksid mĂ”nes hostis praktiliselt ei kasutata ning analĂŒĂŒsi jaoks tuleb koguda statistikat kĂ”ikidest klastris olevatest hostidest. Statistika lĂ€htestamine on samuti vajalik igas klastris asuvas hostis, ei saa seda teha ainult peahostis.

See lÀhenemine on vÔimaldanud meil sÀÀsta tosin gigabaidi vÔrra, eemaldades indeksid, mida kunagi ei kasutatud, ja lisades vajalikke indekseid harva kasutatavatele tabelitele.

KokkuvÔtteks

Muidugi saab peaaegu kÔiki diagnostikaid seadistada vÀljaarvamisnimekiri. Nii saab kiiresti rakendada kontrollid teie rakenduses, et vÀltida uute vigade ilmnemist, ja seejÀrel jÀrk-jÀrgult parandada vanu.

MĂ”ned diagnostikad vĂ”ivad toimuda juba funktsionaalsete testide kĂ€igus vahetult pĂ€rast andmebaasi rĂ€nde rakendamist. Ja see on tĂ”enĂ€oliselt ĂŒks vĂ”imsamaid vĂ”imalusi minu raamatukogus. NĂ€iteks kasutamise kohta saab vaadata demo.

Kasutamata vĂ”i puuduvate indeksite ning bloat'i kontrollid on mĂ”ttekad teha ainult reaalses andmebaasis. Kogutud vÀÀrtused vĂ”ivad olla salvestatud ClickHouse vĂ”i saadetud monitooringusĂŒsteemi.

Ma loodan tÔeliselt, et pg-index-health on kasulik ja nÔutud. Saate samuti toetada teegira arendamist, teavitades avastatud probleemidest ja pakkudes uusi diagnostikate.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster