Hello.
Nire izena Vanya da eta Java garatzailea naiz. Gertatzen da PostgreSQL-rekin asko lan egiten dudala: datu-basea konfiguratzen, egitura, errendimendua optimizatzen eta asteburuetan DBA pixka bat jolasten.
Duela gutxi gure mikrozerbitzuetan hainbat datu-base txukundu eta java liburutegi bat idatzi dut
Lege-oharra
Lan egiten dudan PostgreSQL-ren bertsio nagusia 10 da. Erabiltzen ditudan SQL kontsulta guztiak 11 bertsioan ere probatzen dira. Onartutako gutxieneko bertsioa 9.6 da.
historiaurrea
Duela ia urtebete hasi zen dena arraroa egin zitzaidan egoera batekin: indize baten sorrera lehiakorra akats batekin amaitu zen. Indizea bera, ohi bezala, datu-basean geratu da egoera baliogabean. Erregistroen azterketak eskasia bat erakutsi zuen
Arazo bat - lehenetsitako konfigurazioa
Seguruenik denak nahiko nekatuta daude Postgres-i buruzko metaforaz, kafe-makina batean exekutatu daitekeena, baina... konfigurazio lehenetsiak galdera ugari sortzen ditu benetan. Gutxienez, merezi du arreta jartzea mantentze_lanak_mem, temp_fitxategi_muga, adierazpena_denbora-muga ΠΈ lock_timeout.
Gure kasuan mantentze_lanak_mem lehenetsia zen 64 MB, eta temp_fitxategi_muga 2 GB inguruko zerbait; besterik gabe, ez genuen nahikoa memoria mahai handi batean indize bat sortzeko.
Horregatik, urtean pg-index-osasuna Serie bat bildu nuen
Bigarren arazoa - indize bikoiztuak
Gure datu-baseak SSD unitateetan bizi dira, eta erabiltzen ditugu HA-konfigurazioa hainbat datu-zentrorekin, ostalari nagusiarekin eta n-erreplika kopurua. Disko espazioa oso baliabide baliotsua da guretzat; ez da errendimendua eta CPU kontsumoa baino garrantzitsuagoa. Horregatik, alde batetik, irakurketa azkarra egiteko indizeak behar ditugu, eta, bestetik, ez dugu datu basean beharrezkoak ez diren indizerik ikusi nahi, lekua jaten baitute eta datuen eguneratzea moteltzen baitute.
Eta orain, dena berreskuratuta
Hiru arazoa - gurutzatutako indizeak
Garatzaile hasiberri gehienek zutabe bakarrean sortzen dituzte indizeak. Pixkanaka-pixkanaka, negozio hau ondo bizi izan ondoren, jendea bere kontsultak optimizatzen hasten da eta hainbat zutabe biltzen dituzten indize konplexuagoak gehitzen hasten dira. Horrela agertzen dira zutabeetako indizeak A, + B A, A + B + C eta abar. Indize horietako lehenengo biak segurtasunez bota daitezke, hirugarrenaren aurrizkiak baitira. Honek ere diskoko leku asko aurrezten du eta horretarako diagnostikoak daude
Lau arazoa - atzerriko gakoak indizerik gabe
Postgres-ek atzerriko gakoen mugak sortzeko aukera ematen dizu, babes-indizerik zehaztu gabe. Egoera askotan hori ez da arazoa, eta agian ez da agertzea... Momentuz...
Berdin gertatu zen gurekin: momenturen batean lan bat, egutegi baten arabera exekutatzen eta proba-aginduen datu-basea garbituz, ostalari nagusiak "gehitzen" hasi zitzaigula. CPU eta IO alferrik galdu ziren, eskaerak moteldu ziren eta denbora-muga amaitu zuten, zerbitzua bostehun zen. Azterketa azkarra
delete from <table> where id in (β¦)
Kasu honetan, noski, helburu-taulan idaren araberako indize bat zegoen, eta oso erregistro gutxi ezabatu ziren baldintzaren arabera. Bazirudien denak funtzionatu behar zuela, baina, tamalez, ez zen horrela izan.
Zoragarria erreskatera etorri zen azaldu aztertu eta esan zuen xede-taulan erregistroak ezabatzeaz gain, erreferentziazko osotasunaren egiaztapena ere badagoela, eta erlazionatutako tauletako batean egiaztapen horrek huts egiten duela. eskaneatze sekuentziala indize egokirik ez dagoelako. Horrela jaio zen diagnostikoa
Bost problema - balio nulua indizeetan
Lehenespenez, Postgres-ek balio nuluak barne hartzen ditu btree indizeetan, baina normalean ez dira bertan behar. Hori dela eta, arreta handiz saiatzen naiz nulu horiek (diagnostikoak where <A> is not null
. Horrela, gure indizeetako baten tamaina 1877 MBtik 16 KBra murriztu ahal izan nuen. Eta zerbitzuetako batean, datu-basearen tamaina % 16 gutxitu zen guztira (4.3 GB kopuru absolutuetan) indizeetatik balio nuluak baztertu direlako. Ikaragarrizko aurreztea diskoko espazioan aldaketa oso sinpleekin. π
Sei arazoa - gako nagusien falta
Mekanismoaren izaera dela eta
Egun batean, migrazio zoragarri batek taula handi eta aktibo batean erabilitako erregistro guztiak hartu eta eguneratu zituen. +100 GB lortu ditugu mahaiaren tamainara. Pena madarikatua izan zen, baina gure ezbeharrak ez ziren hor amaitu. Mahai honen auto-husketa amaitu eta 15 ordu geroago, argi geratu zen kokapen fisikoa ez zela itzuliko. Ezin izan dugu zerbitzua gelditu eta HUTSAK BETETA egin, horregatik erabiltzea erabaki dugu
Liburutegiko bertsioan 0.1.5 Taulen eta indizeen puzketetatik datuak biltzeko eta haiei garaiz erantzuteko gaitasuna gehitu da.
Zazpi eta zortzi problemak - indize nahikoak eta erabili gabeko indizeak
Bi diagnostiko hauek dira:
Dagoeneko idatzi dudan bezala, hainbat erreplika dituen konfigurazio bat erabiltzen dugu, eta ostalari ezberdinetan irakurtzeko karga funtsean ezberdina da. Ondorioz, egoera bihurtzen da ostalari batzuen taula eta indize batzuk ia ez direla erabiltzen, eta analisirako klusterreko ostalari guztien estatistikak bildu behar dituzu.
Ikuspegi honi esker, zenbait hamarnaka gigabyte aurreztu ahal izan ditugu inoiz erabili ez ziren indizeak kenduz, baita gutxi erabiltzen diren tauletan falta diren indizeak gehituz ere.
Ondorio gisa
Jakina, ia diagnostiko guztietarako konfigura dezakezu
Diagnostiko batzuk proba funtzionaletan egin daitezke datu-baseen migrazioak zabaldu eta berehala. Eta hau da agian nire liburutegiaren ezaugarririk indartsuenetako bat. Erabilera adibide bat aurki daiteke
Zentzuzkoa da erabiltzen ez diren edo falta diren indizeen egiaztapenak egitea, baita puztuta ere, benetako datu-base batean soilik. Bildutako balioak bertan erregistratu daitezke
Benetan espero dut hori pg-index-osasuna erabilgarria eta eskaria izango da. Liburutegiaren garapenean ere lagundu dezakezu aurkitzen dituzun arazoen berri emanez eta diagnostiko berriak iradokiz.
Iturria: www.habr.com