Iechyd mynegeion yn PostgreSQL trwy lygaid datblygwr Java

Helo

Fy enw i yw Vanya ac rwy'n ddatblygwr Java. Mae'n digwydd felly fy mod yn gweithio llawer gyda PostgreSQL - sefydlu'r gronfa ddata, optimeiddio'r strwythur, perfformiad, a chwarae ychydig o DBA ar y penwythnosau.

Yn ddiweddar rwyf wedi tacluso sawl cronfa ddata yn ein microwasanaethau ac wedi ysgrifennu llyfrgell java td-mynegai-iechyd, sy'n gwneud y gwaith hwn yn haws, yn arbed amser i mi ac yn fy helpu i osgoi rhai camgymeriadau cyffredin a wneir gan ddatblygwyr. Y llyfrgell hon y byddwn yn siarad amdani heddiw.

Iechyd mynegeion yn PostgreSQL trwy lygaid datblygwr Java

Ymwadiad

Y brif fersiwn o PostgreSQL rydw i'n gweithio gyda hi yw 10. Mae'r holl ymholiadau SQL a ddefnyddiaf hefyd yn cael eu profi ar fersiwn 11. Y fersiwn leiaf a gefnogir yw 9.6.

cynhanes

Dechreuodd y cyfan bron i flwyddyn yn Γ΄l gyda sefyllfa a oedd yn ddieithr i mi: daeth y broses gystadleuol o greu mynegai allan o'r glas i ben gyda gwall. Arhosodd y mynegai ei hun, fel arfer, yn y gronfa ddata mewn cyflwr annilys. Dangosodd dadansoddiad logiau brinder temp_file_limit. Ac i ffwrdd Γ’ ni... Wrth gloddio'n ddyfnach, darganfyddais griw cyfan o broblemau yng nghyfluniad y gronfa ddata ac, wrth dorchi fy llewys, dechreuais eu trwsio Γ’ disgleirdeb yn fy llygaid.

Problem un - cyfluniad diofyn

Mae'n debyg bod pawb wedi blino'n fawr ar y trosiad am Postgres, y gellir ei redeg ar wneuthurwr coffi, ond ... mae'r ffurfwedd ddiofyn yn codi nifer o gwestiynau mewn gwirionedd. Ar y lleiaf, mae'n werth rhoi sylw iddo cynnal_gwaith_mem, temp_file_limit, datganiad_amser terfyn ΠΈ cloi_amser allan.

Yn ein hachos ni cynnal_gwaith_mem oedd y rhagosodiad 64 MB, a temp_file_limit rhywbeth o gwmpas 2 GB - yn syml iawn nid oedd gennym ddigon o gof i greu mynegai ar fwrdd mawr.

Felly, yn td-mynegai-iechyd Cesglais gyfres cywair, yn fy marn i, y paramedrau y dylid eu ffurfweddu ar gyfer pob cronfa ddata.

Problem dau - mynegeion dyblyg

Mae ein cronfeydd data yn byw ar yriannau SSD, ac rydym yn defnyddio HA-configuration gyda chanolfannau data lluosog, gwesteiwr meistr a n-nifer o atgynyrchiadau. Mae gofod disg yn adnodd gwerthfawr iawn i ni; nid yw'n llai pwysig na pherfformiad a defnydd CPU. Felly, ar y naill law, mae angen mynegeion ar gyfer darllen cyflym, ac ar y llaw arall, nid ydym am weld mynegeion diangen yn y gronfa ddata, gan eu bod yn bwyta gofod ac yn arafu diweddaru data.

Ac yn awr, ar Γ΄l adfer popeth mynegeion annilys ac wedi gweled digon adroddiadau gan Oleg Bartunov, penderfynais drefnu purge β€œgwych”. Mae'n troi allan nad yw datblygwyr yn hoffi darllen dogfennaeth cronfa ddata. Nid ydynt yn ei hoffi yn fawr. Oherwydd hyn, mae dau wall nodweddiadol yn codi - mynegai wedi'i greu Γ’ llaw ar allwedd gynradd a mynegai "llaw" tebyg ar golofn unigryw. Y ffaith yw nad oes eu hangen - bydd Postgres yn gwneud popeth ei hun. Gellir dileu mynegeion o'r fath yn ddiogel, ac mae diagnosteg wedi ymddangos at y diben hwn mynegeion_dyblyg.

Problem tri - mynegeion croestorri

Mae'r rhan fwyaf o ddatblygwyr dibrofiad yn creu mynegeion ar un golofn. Yn raddol, ar Γ΄l profi'r busnes hwn yn drylwyr, mae pobl yn dechrau gwneud y gorau o'u hymholiadau ac ychwanegu mynegeion mwy cymhleth sy'n cynnwys sawl colofn. Dyma sut mae mynegeion ar golofnau yn ymddangos A, A + B., A + B + C. ac yn y blaen. Gellir taflu'r ddau gyntaf o'r mynegeion hyn allan yn ddiogel, gan mai rhagddodiaid y trydydd ydynt. Mae hyn hefyd yn arbed llawer o le ar ddisg ac mae diagnosteg ar gyfer hyn mynegeion_croesol.

Problem pedwar - allweddi tramor heb fynegeion

Mae Postgres yn caniatΓ‘u ichi greu cyfyngiadau allweddol tramor heb nodi mynegai cefndir. Mewn llawer o sefyllfaoedd nid yw hyn yn broblem, ac efallai na fydd hyd yn oed yn amlygu ei hun... Am y tro...

Roedd yr un peth Γ’ ni: dim ond ar ryw adeg mewn amser y dechreuodd swydd, yn rhedeg yn unol ag amserlen a chlirio'r gronfa ddata o orchmynion prawf, gael ei β€œychwanegu” atom gan y prif westeiwr. Aeth CPU ac IO i wastraff, arafodd ceisiadau a chawsant eu hamseru, roedd y gwasanaeth yn bum cant. Dadansoddiad cyflym pg_stat_gweithgaredd yn dangos bod ymholiadau fel:

delete from <table> where id in (…)

Yn yr achos hwn, wrth gwrs, roedd mynegai wrth id yn y tabl targed, ac ychydig iawn o gofnodion a ddilΓ«wyd yn Γ΄l yr amod. Roedd yn ymddangos fel y dylai popeth weithio, ond, gwaetha'r modd, ni wnaeth.

Daeth yr un gwych i'r adwy esbonio dadansoddi a dywedodd, yn ogystal Γ’ dileu cofnodion yn y tabl targed, fod yna hefyd wiriad cywirdeb cyfeiriol, ac ar un o'r tablau cysylltiedig mae'r gwiriad hwn yn methu sgan dilyniannol oherwydd diffyg mynegai addas. Felly ganwyd diagnosteg tramor_allweddi_heb_fynegai.

Problem pump – gwerth nwl mewn mynegeion

Yn ddiofyn, mae Postgres yn cynnwys gwerthoedd null mewn mynegeion btree, ond fel arfer nid oes eu hangen yno. Felly, rwy'n ddiwyd yn ceisio taflu'r nulls hyn (diagnosteg mynegeion_with_null_gwerthoedd), creu mynegeion rhannol ar golofnau nulladwy yn Γ΄l math where <A> is not null. Yn y modd hwn llwyddais i leihau maint un o'n mynegeion o 1877 MB i 16 KB. Ac yn un o'r gwasanaethau, gostyngodd maint y gronfa ddata gyfanswm o 16% (o 4.3 GB mewn niferoedd absoliwt) oherwydd eithrio gwerthoedd nwl o'r mynegeion. Arbedion enfawr yn y gofod disg gydag addasiadau syml iawn. πŸ™‚

Problem chwech – diffyg allweddi cynradd

Oherwydd natur y mecanwaith MVCC yn Postgres mae sefyllfa fel hon yn bosibl bloatpan fydd maint eich bwrdd yn tyfu'n gyflym oherwydd nifer fawr o gofnodion marw. Roeddwn i'n credu'n naΓ―f na fyddai hyn yn ein bygwth ni, ac na fyddai hyn yn digwydd i'n sylfaen ni, oherwydd rydyn ni, waw!!!, yn ddatblygwyr arferol ... Pa mor dwp a naΓ―f oeddwn i...

Un diwrnod, cymerodd un ymfudiad gwych a diweddaru'r holl gofnodion mewn tabl mawr a ddefnyddir yn weithredol. Cawsom +100 GB i faint y bwrdd allan o'r glas. Roedd yn drueni damniol, ond ni ddaeth ein hanffodion i ben yno. Ar Γ΄l i'r autovacuum ar y bwrdd hwn ddod i ben 15 awr yn ddiweddarach, daeth yn amlwg na fyddai'r lleoliad ffisegol yn dychwelyd. Ni allem atal y gwasanaeth a gwneud gwactod LLAWN, felly penderfynasom ddefnyddio pg_ail-bacio. Ac yna y trodd allan hynny pg_ail-bacio ddim yn gwybod sut i brosesu tablau heb allwedd gynradd neu gyfyngiad unigrywiaeth arall, ac nid oedd gan ein tabl allwedd gynradd. Felly ganwyd diagnosteg tablau_heb_cynradd_allwedd.

Yn fersiwn y llyfrgell 0.1.5 Ychwanegwyd y gallu i gasglu data o bloat o dablau a mynegeion ac ymateb iddo mewn modd amserol.

Problemau saith ac wyth - mynegeion annigonol a mynegeion nas defnyddiwyd

Y ddau ddiagnosteg canlynol yw: tablau_gyda_mynegai_ar goll ΠΈ mynegeion_heb eu defnyddio – ymddangos yn eu ffurf derfynol yn gymharol ddiweddar. Y pwynt yw na ellid eu cymryd a'u hychwanegu.

Fel yr ysgrifennais eisoes, rydym yn defnyddio cyfluniad gyda sawl atgynhyrchiad, ac mae'r llwyth darllen ar wahanol westeion yn sylfaenol wahanol. O ganlyniad, mae'r sefyllfa'n ymddangos nad yw rhai tablau a mynegeion ar rai gwesteiwyr yn cael eu defnyddio'n ymarferol, ac ar gyfer dadansoddi mae angen i chi gasglu ystadegau gan yr holl westeion yn y clwstwr. Ailosod ystadegau Mae hyn hefyd yn angenrheidiol ar bob gwesteiwr yn y clwstwr; ni allwch wneud hyn ar y meistr yn unig.

Roedd y dull hwn yn ein galluogi i arbed sawl degau o gigabeit trwy gael gwared ar fynegeion na ddefnyddiwyd erioed, yn ogystal ag ychwanegu mynegeion coll at dablau na ddefnyddir yn aml.

Fel casgliad

Wrth gwrs, ar gyfer bron pob diagnosteg gallwch chi ffurfweddu rhestr wahardd. Fel hyn, gallwch chi weithredu gwiriadau yn eich cais yn gyflym, gan atal gwallau newydd rhag ymddangos, ac yna trwsio hen rai yn raddol.

Gellir perfformio rhai diagnosteg mewn profion swyddogaethol yn syth ar Γ΄l cyflwyno mudo cronfa ddata. Ac efallai mai dyma un o nodweddion mwyaf pwerus fy llyfrgell. Ceir enghraifft o ddefnydd yn demo.

Mae'n gwneud synnwyr i gynnal gwiriadau ar gyfer mynegeion nas defnyddiwyd neu ar goll, yn ogystal ag ar gyfer bloat, dim ond ar gronfa ddata go iawn. Gellir cofnodi'r gwerthoedd a gasglwyd yn CliciwchHouse neu ei anfon i'r system fonitro.

Dwi wir yn gobeithio hynny td-mynegai-iechyd bydd yn ddefnyddiol ac y mae galw amdano. Gallwch hefyd gyfrannu at ddatblygiad y llyfrgell trwy adrodd am broblemau y byddwch yn dod o hyd iddynt ac awgrymu diagnosteg newydd.

Ffynhonnell: hab.com

Ychwanegu sylw