Is-saħħa tal-indiċi f'PostgreSQL permezz tal-għajnejn ta 'żviluppatur Java

Hi

Jisimni Vanya u jien żviluppatur Java. Jiġri li naħdem ħafna ma 'PostgreSQL - inwaqqaf id-database, nottimizza l-istruttura, il-prestazzjoni, u nilgħab ftit DBA fi tmiem il-ġimgħa.

Riċentement ordnajt diversi databases fil-mikroservizzi tagħna u ktibt librerija java pg-index-saħħa, li jagħmel dan ix-xogħol aktar faċli, jiffranka l-ħin u jgħinni nevita xi żbalji komuni magħmula mill-iżviluppaturi. Hija din il-librerija li se nitkellmu dwarha llum.

Is-saħħa tal-indiċi f'PostgreSQL permezz tal-għajnejn ta 'żviluppatur Java

Ċaħda ta 'responsabbiltà

Il-verżjoni ewlenija ta 'PostgreSQL li naħdem magħha hija 10. Il-mistoqsijiet SQL kollha li nuża huma ttestjati wkoll fuq il-verżjoni 11. Il-verżjoni minima appoġġjata hija 9.6.

preistorja

Kollox beda kważi sena ilu b’sitwazzjoni li kienet stramba għalija: il-ħolqien kompetittiv ta’ indiċi mill-aqwa spiċċa bi żball. L-indiċi nnifsu, bħas-soltu, baqa' fid-database fi stat invalidu. L-analiżi taz-zkuk wriet nuqqas temp_file_limit. U mmorru... Tħaffir aktar fil-fond, skoprejt mazz sħiħ ta 'problemi fil-konfigurazzjoni tad-database u, xammar il-kmiem tiegħi, bdejt nirranġahom bi sparkle f'għajnejja.

Problema waħda - konfigurazzjoni default

Probabbilment kulħadd huwa pjuttost għajjien tal-metafora dwar Postgres, li tista 'titħaddem fuq magna tal-kafè, iżda... il-konfigurazzjoni default verament tqajjem numru ta' mistoqsijiet. Bħala minimu, ta 'min joqgħod attent għalih manutenzjoni_xogħol_mem, temp_file_limit, statement_timeout и lock_timeout.

Fil-każ tagħna manutenzjoni_xogħol_mem kien il-default 64 MB, u temp_file_limit xi ħaġa madwar 2 GB - sempliċement ma kellniex memorja biżżejjed biex noħolqu indiċi fuq mejda kbira.

Għalhekk, fi pg-index-saħħa Ġbart sensiela ċavetta, fl-opinjoni tiegħi, il-parametri li għandhom jiġu kkonfigurati għal kull database.

Problema tnejn - indiċi duplikati

Id-databases tagħna jgħixu fuq drives SSD, u nużaw HA-konfigurazzjoni ma 'ċentri tad-dejta multipli, host master u n-numru ta' repliki. L-ispazju tad-disk huwa riżorsa siewja ħafna għalina; mhuwiex inqas importanti mill-prestazzjoni u l-konsum tas-CPU. Għalhekk, min-naħa waħda, għandna bżonn indiċi għal qari veloċi, u min-naħa l-oħra, ma rridux naraw indiċijiet mhux meħtieġa fid-database, peress li jieklu l-ispazju u jnaqqsu l-aġġornament tad-dejta.

U issa, wara li rrestawra kollox indiċi invalidi u wara li rajt biżżejjed rapporti minn Oleg Bartunov, Iddeċidejt li norganizza tindif "kbir". Irriżulta li l-iżviluppaturi ma jħobbux jaqraw id-dokumentazzjoni tad-database. Ma tantx jogħġobhom. Minħabba dan, jinqalgħu żewġ żbalji tipiċi - indiċi maħluqa manwalment fuq ċavetta primarja u indiċi "manwali" simili fuq kolonna unika. Il-fatt hu li mhumiex meħtieġa - Postgres se jagħmel kollox hu stess. Indiċijiet bħal dawn jistgħu jitħassru b'mod sikur, u d-dijanjostiċi dehru għal dan il-għan duplikat_indiċi.

Problema tlieta - indiċijiet li jaqsmu

Ħafna mill-iżviluppaturi novizzi joħolqu indiċi fuq kolonna waħda. Gradwalment, wara li esperjenzaw sewwa dan in-negozju, in-nies jibdew jottimizzaw il-mistoqsijiet tagħhom u jżidu indiċijiet aktar kumplessi li jinkludu diversi kolonni. Hekk jidhru l-indiċi fuq il-kolonni A, A + B, A + B + C u l-bqija. L-ewwel tnejn minn dawn l-indiċi jistgħu jintremew b'mod sikur, peress li huma prefissi tat-tielet. Dan jiffranka wkoll ħafna spazju fuq id-diska u hemm dijanjostiċi għal dan intersected_indexes.

Problema erba - ċwievet barranin mingħajr indiċi

Postgres jippermettilek li toħloq restrizzjonijiet ewlenin barranin mingħajr ma tispeċifika indiċi ta 'appoġġ. F’ħafna sitwazzjonijiet din mhix problema, u tista’ lanqas timmanifesta ruħha... Għalissa...

Kien l-istess magħna: huwa biss li f'xi ħin xogħol, li jaħdem skond skeda u li jneħħi d-database ta 'ordnijiet tat-test, beda jiġi "miżjud" lilna mill-kaptan host. Is-CPU u l-IO marru għall-ħela, it-talbiet naqsu u ġew timed out, is-servizz kien ħames mija. Analiżi malajr pg_stat_activity wera li mistoqsijiet bħal:

delete from <table> where id in (…)

F'dan il-każ, ovvjament, kien hemm indiċi bl-id fit-tabella fil-mira, u ftit rekords tħassru skond il-kundizzjoni. Deher li kollox għandu jaħdem, iżda, sfortunatament, ma kienx.

L-isbaħ ġie għas-salvataġġ spjega janalizza u qal li minbarra t-tħassir tar-rekords fit-tabella fil-mira, hemm ukoll kontroll tal-integrità referenzjali, u fuq waħda mit-tabelli relatati dan il-kontroll ifalli scan sekwenzjali minħabba n-nuqqas ta’ indiċi adattat. Hekk twieldet id-dijanjostika ċwievet_barrani_mingħajr_indiċi.

Problema ħamsa - valur null fl-indiċi

B'mod awtomatiku, Postgres jinkludi valuri nulli f'indiċi btree, iżda ġeneralment mhumiex meħtieġa hemmhekk. Għalhekk, b'diliġenza nipprova nwarrab dawn in-nulls (dijanjostika indexes_with_null_values), joħolqu indiċi parzjali fuq kolonni nullable skond it-tip where <A> is not null. B'dan il-mod stajt inaqqas id-daqs ta' wieħed mill-indiċi tagħna minn 1877 MB għal 16 KB. U f'wieħed mis-servizzi, id-daqs tad-database naqas b'kollox b'16% (b'4.3 GB f'numri assoluti) minħabba l-esklużjoni ta 'valuri nulli mill-indiċi. Iffrankar enormi fl-ispazju tad-diska b'modifiki sempliċi ħafna. 🙂

Problema sitt - nuqqas ta 'ċwievet primarji

Minħabba n-natura tal-mekkaniżmu MVCC f'Postgres sitwazzjoni bħal din hija possibbli nefħameta d-daqs tal-mejda tiegħek qed jikber malajr minħabba numru kbir ta 'rekords mejta. Jiena naively nemmen li dan mhux se jheddidna, u li dan ma jiġrix lill-bażi tagħna, għax aħna, naqra!!!, huma żviluppaturi normali... Kemm kont stupidu u naive...

Ġurnata waħda, migrazzjoni waħda mill-isbaħ ħadet u aġġornat ir-rekords kollha f'tabella kbira u użata b'mod attiv. Aħna ltqajna + 100 GB għad-daqs tal-mejda mill-blu. Kienet tal-mistħija, imma d-diżavventuri tagħna ma spiċċawx hemm. Wara li l-awtovakwu fuq din il-mejda intemm 15-il siegħa wara, deher ċar li l-post fiżiku ma kienx se jirritorna. Ma stajniex inwaqqfu s-servizz u nagħmlu VACUUM FULL, għalhekk iddeċidejna li nużaw pg_repack. U mbagħad irriżulta li pg_repack ma jafx kif tipproċessa tabelli mingħajr ċavetta primarja jew restrizzjoni oħra ta 'uniċità, u t-tabella tagħna ma kellhiex ċavetta primarja. Hekk twieldet id-dijanjostika tables_without_primary_key.

Fil-verżjoni tal-librerija 0.1.5 Ġiet miżjuda l-abbiltà li tinġabar data minn nefħa ta 'tabelli u indiċi u tirrispondi għaliha fil-ħin.

Problemi sebgħa u tmienja - indiċi insuffiċjenti u indiċi mhux użati

Iż-żewġ dijanjostiċi li ġejjin huma: tables_with_missing_indexes и unused_indexes – dehru fil-forma finali tagħhom relattivament reċentement. Il-punt hu li ma setgħux jittieħdu u jiżdiedu biss.

Kif diġà ktibt, nużaw konfigurazzjoni b'diversi repliki, u t-tagħbija tal-qari fuq hosts differenti hija fundamentalment differenti. Bħala riżultat, is-sitwazzjoni tirriżulta li xi tabelli u indiċi fuq xi hosts prattikament ma jintużawx, u għall-analiżi għandek bżonn tiġbor statistika mill-hosts kollha fil-cluster. Irrisettja l-istatistika Dan huwa meħtieġ ukoll fuq kull host fil-cluster; ma tistax tagħmel dan biss fuq il-master.

Dan l-approċċ ippermetta li nsalvaw diversi għexieren ta 'gigabytes billi neħħew indiċi li qatt ma ntużaw, kif ukoll żid indiċi neqsin għal tabelli li rarament jintużaw.

Bħala konklużjoni

Naturalment, għal kważi d-dijanjostiċi kollha tista 'tikkonfigura lista ta 'esklużjoni. B'dan il-mod, tista 'timplimenta malajr kontrolli fl-applikazzjoni tiegħek, tevita żbalji ġodda milli jidhru, u mbagħad issolvi gradwalment dawk qodma.

Xi dijanjostiċi jistgħu jsiru f'testijiet funzjonali immedjatament wara t-tnedija tal-migrazzjonijiet tad-database. U din hija forsi waħda mill-aktar karatteristiċi qawwija tal-librerija tiegħi. Eżempju ta 'użu jista' jinstab fi demo.

Jagħmel sens li jsiru kontrolli għal indiċijiet mhux użati jew neqsin, kif ukoll għal bloat, biss fuq database reali. Il-valuri miġbura jistgħu jiġu rreġistrati fi IkklikkjaHouse jew mibgħuta lis-sistema ta’ monitoraġġ.

Verament nittama li pg-index-saħħa se jkun utli u fid-domanda. Tista' wkoll tikkontribwixxi għall-iżvilupp tal-librerija billi tirrapporta problemi li ssib u tissuġġerixxi dijanjostiċi ġodda.

Sors: www.habr.com

Żid kumment