Hoi
Myn namme is Vanya en ik bin in Java-ûntwikkelder. It bart sa dat ik in protte mei PostgreSQL wurkje - de database ynstelle, de struktuer, prestaasjes optimalisearje en in bytsje DBA yn 'e wykeinen spielje.
Koartlyn haw ik ferskate databases yn ús mikrotsjinsten opslein en in java-bibleteek skreaun
Disclaimer
De haadferzje fan PostgreSQL wêrmei ik wurkje is 10. Alle SQL-fragen dy't ik brûk wurde ek testen op ferzje 11. De minimale stipe ferzje is 9.6.
prehistoarje
It begon allegear hast in jier lyn mei in situaasje dy't my frjemd wie: it kompetitive oanmeitsjen fan in yndeks út 'e blau einige mei in flater. De yndeks sels, lykas gewoanlik, bleau yn 'e databank yn in ûnjildige steat. Log analyse liet in tekoart sjen
Probleem ien - standert konfiguraasje
Wierskynlik is elkenien aardich wurch fan 'e metafoar oer Postgres, dy't kin wurde útfierd op in kofjesetapparaat, mar ... de standertkonfiguraasje ropt echt in oantal fragen op. Op syn minst is it wurdich omtinken te jaan ûnderhâld_wurk_mem, temp_file_limit, statement_timeout и lock_timeout.
Yn ús gefal ûnderhâld_wurk_mem wie de standert 64 MB, en temp_file_limit eat om 2 GB - wy hawwe gewoan net genôch ûnthâld foar in meitsje in yndeks op in grutte tafel.
Dêrom, yn pg-index-sûnens Ik sammele in rige
Probleem twa - dûbele yndeksen
Us databases libje op SSD-skiven, en wy brûke HA-konfiguraasje mei meardere data sintra, master host en n- oantal replika's. Skiifromte is in tige weardefolle boarne foar ús; it is net minder wichtich as prestaasjes en CPU-konsumpsje. Dêrom hawwe wy oan 'e iene kant yndeksen nedich foar fluch lêzen, en oan' e oare kant wolle wy gjin ûnnedige yndeksen yn 'e databank sjen, om't se romte ite en it bywurkjen fan gegevens fertrage.
En no, alles restaurearre
Probleem trije - krusende yndeksen
De measte begjinnende ûntwikkelders meitsje yndeksen op ien kolom. Stadichoan, nei't se dit bedriuw yngeand ûnderfûn hawwe, begjinne minsken har fragen te optimalisearjen en kompleksere yndeksen ta te foegjen dy't ferskate kolommen omfetsje. Dit is hoe't yndeksen op kolommen ferskine A, A + B, A + B + C ensafuorthinne. De earste twa fan dizze yndeksen kinne feilich smiten wurde, om't se foarheaksels binne fan 'e tredde. Dit besparret ek in soad skiifromte en dêr binne diagnostyk foar
Probleem fjouwer - frjemde kaaien sûnder yndeksen
Postgres lit jo bûtenlânske kaaibeperkingen oanmeitsje sûnder in backing-yndeks op te jaan. Yn in protte situaasjes is dit gjin probleem, en kin it sels net manifestearje... Foar it momint...
It wie itselde mei ús: it is gewoan dat op in stuit in baan, dy't rint neffens in skema en it wiskjen fan de databank fan testopdrachten, begûn te "tafoege" oan ús troch de master host. CPU en IO gie te fergriemen, fersiken fertrage en waarden time-out, de tsjinst wie fiifhûndert. Fluch analyze
delete from <table> where id in (…)
Yn dit gefal wie d'r fansels in yndeks troch id yn 'e doeltabel, en hiel pear records waarden wiske neffens de betingst. It like derop dat alles wurkje soe, mar helaas, it die net.
De prachtige kaam te rêden ferklearje analysearje en sei dat njonken it wiskjen fan records yn 'e doeltabel, d'r ek in referinsjele yntegriteitskontrôle is, en op ien fan' e relatearre tabellen mislearret dizze kontrôle sekwinsjele scan troch it ûntbrekken fan in gaadlike yndeks. Sa waard diagnostyk berne
Probleem fiif - nul wearde yn yndeksen
Standert omfettet Postgres nulwearden yn btree-yndeksen, mar se binne dêr normaal net nedich. Dêrom besykje ik iverich dizze nulls (diagnostyk where <A> is not null
. Op dizze manier koe ik de grutte fan ien fan ús yndeksen ferminderje fan 1877 MB nei 16 KB. En yn ien fan 'e tsjinsten fermindere de databankgrutte yn totaal mei 16% (troch 4.3 GB yn absolute getallen) troch it útsluten fan nulwearden fan' e yndeksen. Enorme besparring yn skiifromte mei heul ienfâldige oanpassingen. 🙂
Probleem seis - gebrek oan primêre kaaien
Troch de aard fan it meganisme
Ien dei, ien prachtige migraasje naam en bywurke alle records yn in grutte en aktyf brûkte tabel. Wy krigen +100 GB oan 'e tafelgrutte út' e blau. It wie in ferrekte skande, mar dêr binne ús ûngelokken net ophâlden. Nei it autovacuum op dizze tafel einige 15 oeren letter, waard dúdlik dat de fysike lokaasje soe net werom. Wy koenen net stopje de tsjinst en meitsje VACUUM FULL, dus wy besletten om te brûken
Yn de bibleteek ferzje 0.1.5 De mooglikheid om gegevens te sammeljen út bloat fan tabellen en yndeksen en dêr op 'e tiid op te reagearjen is tafoege.
Problemen sân en acht - net genôch yndeksen en net brûkte yndeksen
De folgjende twa diagnostyk binne:
Lykas ik al skreau, brûke wy in konfiguraasje mei ferskate replika's, en de lêsbelesting op ferskate hosts is prinsipieel oars. As gefolch, de situaasje docht bliken dat guon tabellen en yndeksen op guon hosts wurde praktysk net brûkt, en foar analyze moatte sammelje statistiken fan alle hosts yn it kluster.
Dizze oanpak stelde ús ta om ferskate tsientallen gigabytes te bewarjen troch yndeksen te ferwiderjen dy't noait waarden brûkt, en ek ûntbrekkende yndeksen tafoegje oan selden brûkte tabellen.
As konklúzje
Fansels kinne jo foar hast alle diagnostyk konfigurearje
Guon diagnostyk kin wurde útfierd yn funksjonele tests direkt nei it útroljen fan databasemigraasjes. En dit is miskien ien fan 'e machtichste funksjes fan myn bibleteek. In foarbyld fan gebrûk is te finen yn
It makket sin om kontrôles út te fieren foar net brûkte of ûntbrekkende yndeksen, lykas ek foar bloat, allinich op in echte databank. De sammele wearden kinne wurde opnommen yn
Ik hoopje dat echt pg-index-sûnens sil nuttich en yn fraach wêze. Jo kinne ek bydrage oan de ûntwikkeling fan de bibleteek troch problemen te melden dy't jo fine en nije diagnostyk foarstelle.
Boarne: www.habr.com