Sveicieni.
Mani sauc Vanja, un es esmu Java izstrÄdÄtÄjs. GadÄs, ka es daudz strÄdÄju ar PostgreSQL - izveidoju datubÄzi, optimizÄju struktÅ«ru, veiktspÄju un nedÄļas nogalÄs spÄlÄju nedaudz DBA.
Nesen esmu sakÄrtojis vairÄkas datu bÄzes mÅ«su mikropakalpojumos un uzrakstÄ«jis java bibliotÄku
Atbildības noraidīŔana
GalvenÄ PostgreSQL versija, ar kuru es strÄdÄju, ir 10. Visi manis izmantotie SQL vaicÄjumi ir arÄ« pÄrbaudÄ«ti 11. versijÄ. MinimÄlÄ atbalstÄ«tÄ versija ir 9.6.
AizvÄsture
Viss sÄkÄs gandrÄ«z pirms gada ar situÄciju, kas man bija dÄ«vaina: konkurÄtspÄjÄ«ga indeksa izveide no zila gaisa beidzÄs ar kļūdu. Pats rÄdÄ«tÄjs, kÄ parasti, palika datubÄzÄ nederÄ«gÄ stÄvoklÄ«. Baļķu analÄ«ze parÄdÄ«ja trÅ«kumu
PirmÄ problÄma - noklusÄjuma konfigurÄcija
Laikam jau visiem ir diezgan apnikusi metafora par Postgres, ko var darbinÄt uz kafijas automÄta, bet... noklusÄjuma konfigurÄcija tieÅ”Äm rada virkni jautÄjumu. Vismaz ir vÄrts pievÄrst uzmanÄ«bu apkopes_darba_atmiÅa, temp_file_limit, paziÅojums_noildze Šø lock_timeout.
MÅ«su gadÄ«jumÄ apkopes_darba_atmiÅa bija noklusÄjuma 64 MB, un temp_file_limit kaut kas ap 2 GB - mums vienkÄrÅ”i nebija pietiekami daudz atmiÅas, lai izveidotu indeksu uz lielas tabulas.
TÄpÄc iekÅ”Ä pg-index-veselÄ«ba Es savÄcu sÄriju
OtrÄ problÄma ā dublÄti indeksi
MÅ«su datu bÄzes darbojas uz SSD diskdziÅiem, un mÄs to izmantojam HA-konfigurÄcija ar vairÄkiem datu centriem, galveno resursdatoru un n-reprodukciju skaits. Diska vieta mums ir ļoti vÄrtÄ«gs resurss; tas ir ne mazÄk svarÄ«gi kÄ veiktspÄja un CPU patÄriÅÅ”. TÄpÄc, no vienas puses, mums ir nepiecieÅ”ami indeksi Ätrai lasÄ«Å”anai, un, no otras puses, mÄs nevÄlamies datu bÄzÄ redzÄt nevajadzÄ«gus indeksus, jo tie aizÅem vietu un palÄnina datu atjauninÄÅ”anu.
Un tagad, visu atjaunojis
TreÅ”Ä problÄma ā krustojoÅ”ie indeksi
LielÄkÄ daļa iesÄcÄju izstrÄdÄtÄju veido indeksus vienÄ kolonnÄ. PamazÄm, pamatÄ«gi pieredzÄjuÅ”i Å”o biznesu, cilvÄki sÄk optimizÄt savus vaicÄjumus un pievienot sarežģītÄkus indeksus, kas ietver vairÄkas kolonnas. Å Ädi parÄdÄs indeksi kolonnÄs A, A + B, A+B+C. un tÄ tÄlÄk. Pirmos divus no Å”iem indeksiem var droÅ”i izmest, jo tie ir treÅ”Ä prefiksi. Tas arÄ« ietaupa daudz vietas diskÄ, un tam ir diagnostika
CeturtÄ problÄma - ÄrÄjÄs atslÄgas bez indeksiem
Postgres ļauj izveidot ÄrÄjÄs atslÄgas ierobežojumus, nenorÄdot atbalsta indeksu. DaudzÄs situÄcijÄs tÄ nav problÄma un var pat neizpausties... PagaidÄm...
Ar mums bija tÄpat: tikai kÄdÄ brÄ«dÄ« galvenais saimnieks mums sÄka āpievienotā darbu, kas darbojas pÄc grafika un notÄ«ra testa pasÅ«tÄ«jumu datubÄzi. CPU un IO aizgÄja velti, pieprasÄ«jumi palÄninÄjÄs un tika beidzies, pakalpojums bija pieci simti. Ätra analÄ«ze
delete from <table> where id in (ā¦)
Å ajÄ gadÄ«jumÄ, protams, mÄrÄ·a tabulÄ bija indekss pÄc id, un saskaÅÄ ar nosacÄ«jumu tika izdzÄsti ļoti maz ierakstu. Å Ä·ita, ka visam vajadzÄtu darboties, bet diemžÄl tas nenotika.
BrÄ«niŔķīgais nÄca palÄ«gÄ izskaidrot analÄ«zi un teica, ka papildus ierakstu dzÄÅ”anai mÄrÄ·a tabulÄ ir arÄ« atsauces integritÄtes pÄrbaude, un vienÄ no saistÄ«tajÄm tabulÄm Ŕī pÄrbaude neizdodas. secÄ«ga skenÄÅ”ana piemÄrota indeksa trÅ«kuma dÄļ. TÄ radÄs diagnostika
PiektÄ problÄma ā nulles vÄrtÄ«ba indeksos
PÄc noklusÄjuma Postgres btree indeksos iekļauj nulles vÄrtÄ«bas, taÄu tÄs parasti tur nav vajadzÄ«gas. TÄpÄc es cÄ«tÄ«gi cenÅ”os izmest Ŕīs nulles (diagnostika where <A> is not null
. TÄdÄ veidÄ es varÄju samazinÄt viena mÅ«su indeksa izmÄru no 1877 MB lÄ«dz 16 KB. Un vienÄ no pakalpojumiem datu bÄzes lielums kopumÄ samazinÄjÄs par 16% (absolÅ«tos skaitļos par 4.3 GB), jo no indeksiem tika izslÄgtas nulles. MilzÄ«gs diska vietas ietaupÄ«jums ar ļoti vienkÄrÅ”Äm modifikÄcijÄm. š
SestÄ problÄma ā primÄro atslÄgu trÅ«kums
MehÄnisma rakstura dÄļ
KÄdu dienu viena brÄ«niŔķīga migrÄcija paÅÄma un atjauninÄja visus ierakstus lielÄ un aktÄ«vi izmantotÄ tabulÄ. MÄs saÅÄmÄm +100 GB lÄ«dz galda izmÄram no zila gaisa. Tas bija sasodÄ«ti kauns, bet ar to mÅ«su nelaimes nebeidzÄs. PÄc tam, kad 15 stundas vÄlÄk beidzÄs autovakuums uz Ŕī galda, kļuva skaidrs, ka fiziskÄ atraÅ”anÄs vieta neatgriezÄ«sies. MÄs nevarÄjÄm pÄrtraukt pakalpojumu un padarÄ«t VACUUM FULL, tÄpÄc mÄs nolÄmÄm izmantot
BibliotÄkas versijÄ 0.1.5 Ir pievienota iespÄja apkopot datus no uzpÅ«stÄm tabulÄm un indeksiem un laicÄ«gi uz tiem reaÄ£Ät.
SeptÄ«tÄ un astotÄ problÄma - nepietiekami indeksi un neizmantoti indeksi
Å Ä«s divas diagnostikas metodes ir:
KÄ jau rakstÄ«ju, mÄs izmantojam konfigurÄciju ar vairÄkÄm replikÄm, un lasÄ«Å”anas slodze uz dažÄdiem saimniekiem bÅ«tiski atŔķiras. RezultÄtÄ situÄcija izrÄdÄs, ka dažas tabulas un indeksi dažos saimniekdatoros praktiski netiek izmantotas, un analÄ«zei ir jÄapkopo statistika no visiem klastera resursdatoriem.
Å Ä« pieeja ļÄva mums ietaupÄ«t vairÄkus desmitus gigabaitu, noÅemot indeksus, kas nekad netika izmantoti, kÄ arÄ« pievienojot trÅ«kstoÅ”os indeksus reti izmantotajÄm tabulÄm.
KÄ secinÄjums
Protams, gandrÄ«z visu diagnostiku varat konfigurÄt
Dažu diagnostiku var veikt funkcionÄlÄs pÄrbaudÄs tÅ«lÄ«t pÄc datu bÄzes migrÄcijas ievieÅ”anas. Un Ŕī, iespÄjams, ir viena no manas bibliotÄkas jaudÄ«gÄkajÄm funkcijÄm. LietoÅ”anas piemÄru var atrast
Ir lietderÄ«gi pÄrbaudÄ«t neizmantotos vai trÅ«kstoÅ”os indeksus, kÄ arÄ« uzpÅ«sties, tikai reÄlÄ datu bÄzÄ. SavÄktÄs vÄrtÄ«bas var ierakstÄ«t
Es to ļoti ceru pg-index-veselÄ«ba bÅ«s noderÄ«gi un pieprasÄ«ti. Varat arÄ« dot ieguldÄ«jumu bibliotÄkas attÄ«stÄ«bÄ, ziÅojot par atrastajÄm problÄmÄm un iesakot jaunas diagnostikas metodes.
Avots: www.habr.com