Ilera ti awọn atọka ni PostgreSQL nipasẹ awọn oju ti idagbasoke Java kan

Bawo

Orukọ mi ni Vanya ati pe Mo jẹ oludasile Java kan. O ṣẹlẹ pe Mo ṣiṣẹ pupọ pẹlu PostgreSQL - ṣeto ibi ipamọ data, iṣapeye eto, iṣẹ ṣiṣe, ati ṣiṣere DBA diẹ ni awọn ipari ose.

Laipẹ Mo ti ṣe atunṣe ọpọlọpọ awọn data data ninu awọn iṣẹ microservices wa ati kọ ile-ikawe java kan pg-index-ilera, eyi ti o mu ki iṣẹ yii rọrun, fi akoko pamọ ati iranlọwọ fun mi lati yago fun awọn aṣiṣe ti o wọpọ ti awọn olupilẹṣẹ ṣe. Ile-ikawe yii ni a yoo sọrọ nipa loni.

Ilera ti awọn atọka ni PostgreSQL nipasẹ awọn oju ti idagbasoke Java kan

be

Ẹya akọkọ ti PostgreSQL ti Mo ṣiṣẹ pẹlu jẹ 10. Gbogbo awọn ibeere SQL ti Mo lo tun ni idanwo lori ẹya 11. Ẹya atilẹyin ti o kere julọ jẹ 9.6.

prehistory

Gbogbo rẹ bẹrẹ ni ọdun kan sẹyin pẹlu ipo ti o jẹ ajeji si mi: ẹda ifigagbaga ti atọka lati inu buluu ti pari pẹlu aṣiṣe kan. Atọka funrararẹ, gẹgẹbi iṣe deede, wa ninu ibi ipamọ data ni ipo aiṣedeede. Iṣiro akọọlẹ fihan aito kan temp_file_limit. Ati pe a lọ ... N walẹ jinle, Mo ṣe awari gbogbo awọn iṣoro ni iṣeto data data ati, yiyi awọn apa aso mi, bẹrẹ si ṣatunṣe wọn pẹlu didan ni oju mi.

Isoro ọkan - aiyipada iṣeto ni

Boya gbogbo eniyan ni o rẹwẹsi pupọ fun apẹẹrẹ nipa Postgres, eyiti o le ṣiṣẹ lori alagidi kọfi kan, ṣugbọn… iṣeto aiyipada ga gaan ni nọmba awọn ibeere. Ni o kere ju, o tọ lati san ifojusi si itọju_iṣẹ_mem, temp_file_limit, gbólóhùn_akoko и lock_timeout.

Ninu ọran tiwa itọju_iṣẹ_mem je aiyipada 64 MB, ati temp_file_limit nkankan ni ayika 2 GB - a nìkan ko ni to iranti to a ṣẹda ohun Ìwé lori kan ti o tobi tabili.

Nitorina, ninu pg-index-ilera Mo ti gba a jara bọtini, ninu ero mi, awọn paramita ti o yẹ ki o tunto fun data data kọọkan.

Isoro meji - àdáwòkọ atọka

Awọn apoti isura infomesonu wa n gbe lori awọn awakọ SSD, ati pe a lo HA-iṣeto ni pẹlu ọpọ data awọn ile-iṣẹ, titunto si ogun ati n-nọmba ti replicas. Aaye disk jẹ ohun elo ti o niyelori pupọ fun wa; o jẹ ko kere pataki ju iṣẹ ati Sipiyu agbara. Nitorinaa, ni apa kan, a nilo awọn atọka fun kika iyara, ati ni apa keji, a ko fẹ lati rii awọn atọka ti ko wulo ninu ibi ipamọ data, nitori wọn jẹ aaye ati fa fifalẹ imudojuiwọn data.

Ati nisisiyi, ntẹriba pada ohun gbogbo invalid atọka ati ntẹriba ri to Awọn ijabọ nipasẹ Oleg Bartunov, Mo ti pinnu lati ṣeto kan "nla" purge. O wa jade pe awọn olupilẹṣẹ ko nifẹ lati ka awọn iwe data data. Wọn ko fẹran rẹ pupọ. Nitori eyi, awọn aṣiṣe aṣoju meji dide - atọka ti a ṣẹda pẹlu ọwọ lori bọtini akọkọ ati atọka “Afowoyi” ti o jọra lori iwe alailẹgbẹ kan. Otitọ ni pe wọn ko nilo - Postgres yoo ṣe ohun gbogbo funrararẹ. Iru awọn atọka le jẹ paarẹ lailewu, ati pe awọn iwadii ti han fun idi eyi duplicated_indexes.

Isoro mẹta - awọn atọka intersecting

Pupọ awọn olupilẹṣẹ alakobere ṣẹda awọn atọka lori iwe kan. Diẹdiẹ, ti o ni itọwo iṣowo yii daradara, awọn eniyan bẹrẹ lati mu awọn ibeere wọn pọ si ati ṣafikun awọn atọka eka diẹ sii ti o pẹlu awọn ọwọn pupọ. Eyi ni bi awọn atọka lori awọn ọwọn ṣe han A, A + B, A+B+C ati bẹbẹ lọ. Meji akọkọ ninu awọn atọka wọnyi le jẹ danu kuro lailewu, nitori wọn jẹ awọn ami-iṣaaju ti ẹkẹta. Eyi tun ṣafipamọ ọpọlọpọ aaye disk ati pe awọn iwadii aisan wa fun eyi intersected_indexes.

Isoro mẹrin - awọn bọtini ajeji laisi awọn atọka

Postgres gba ọ laaye lati ṣẹda awọn idiwọ bọtini ajeji laisi asọye atọka atilẹyin. Ni ọpọlọpọ awọn ipo eyi kii ṣe iṣoro, ati pe o le ma ṣe afihan ararẹ paapaa ... Fun akoko naa ...

O jẹ kanna pẹlu wa: o kan pe ni akoko kan ni akoko iṣẹ kan, ṣiṣe ni ibamu si iṣeto kan ati sisọ data data ti awọn ibere idanwo, bẹrẹ si "fikun" si wa nipasẹ oluwa oluwa. Sipiyu ati IO lọ si egbin, awọn ibeere fa fifalẹ ati pe akoko ti jade, iṣẹ naa jẹ ẹdẹgbẹta. Ayẹwo kiakia pg_stat_akitiyan fihan pe awọn ibeere bii:

delete from <table> where id in (…)

Ni idi eyi, dajudaju, itọka kan wa nipasẹ id ni tabili ibi-afẹde, ati pe awọn igbasilẹ pupọ diẹ ti paarẹ ni ibamu si ipo naa. O dabi pe ohun gbogbo yẹ ki o ṣiṣẹ, ṣugbọn, alas, ko ṣe.

Iyanu naa wa si igbala se alaye itupale o si sọ pe ni afikun si piparẹ awọn igbasilẹ ninu tabili ibi-afẹde, ayẹwo iṣotitọ itọkasi tun wa, ati lori ọkan ninu awọn tabili ti o jọmọ ayẹwo yii kuna. lesese scan nitori aini atọka ti o yẹ. Bayi ni a bi awọn iwadii aisan awọn bọtini_ajeji_lai_index.

Isoro marun - asan iye ninu awọn atọka

Nipa aiyipada, Postgres pẹlu awọn iye asan ni awọn atọka btree, ṣugbọn wọn kii nilo nigbagbogbo nibẹ. Nitorinaa, Mo fi taratara gbiyanju lati jabọ awọn asan wọnyi (awọn iwadii aisan indexes_with_null_values), ṣiṣẹda awọn atọka apakan lori awọn ọwọn asan ni iru where <A> is not null. Ni ọna yii Mo ni anfani lati dinku iwọn ọkan ninu awọn atọka wa lati 1877 MB si 16 KB. Ati ninu ọkan ninu awọn iṣẹ naa, iwọn data data dinku lapapọ nipasẹ 16% (nipasẹ 4.3 GB ni awọn nọmba pipe) nitori iyasoto ti awọn iye asan lati awọn atọka. Awọn ifowopamọ nla ni aaye disk pẹlu awọn iyipada ti o rọrun pupọ. 🙂

Isoro mẹfa - aini awọn bọtini akọkọ

Nitori awọn iseda ti awọn siseto MVCC ni Postgres iru ipo bẹẹ ṣee ṣe gbuurunigbati iwọn tabili rẹ n dagba ni iyara nitori nọmba nla ti awọn igbasilẹ ti o ku. Mo ni irọra gbagbọ pe eyi kii yoo halẹ wa, ati pe eyi kii yoo ṣẹlẹ si ipilẹ wa, nitori awa, wow !!!, jẹ awọn olupilẹṣẹ deede… Bawo ni aṣiwere ati aimọgbọnwa Mo jẹ…

Ni ọjọ kan, ijira iyalẹnu kan mu ati ṣe imudojuiwọn gbogbo awọn igbasilẹ ni tabili nla ati ti nṣiṣe lọwọ. A ni + 100 GB si iwọn tabili lati buluu naa. O jẹ itiju nla, ṣugbọn awọn aburu wa ko pari nibẹ. Lẹhin ti autovacuum lori tabili yii pari awọn wakati 15 lẹhinna, o han gbangba pe ipo ti ara kii yoo pada. A ko le da iṣẹ naa duro ki a ṣe VACUUM FULL, nitorinaa a pinnu lati lo pg_repack. Ati lẹhinna o wa ni pe pg_repack ko mọ bi o ṣe le ṣe ilana awọn tabili laisi bọtini akọkọ tabi idiwọ iyasọtọ miiran, ati pe tabili wa ko ni bọtini akọkọ. Bayi ni a bi awọn iwadii aisan tabili_lai_primary_bọtini.

Ni awọn ìkàwé version 0.1.5 Agbara lati gba data lati bloat ti awọn tabili ati awọn atọka ati dahun si ni ọna ti akoko ti ṣafikun.

Awọn iṣoro meje ati mẹjọ - awọn atọka ti ko to ati awọn atọka ti ko lo

Awọn iwadii aisan meji wọnyi ni: tabili_pẹlu_missing_indexes и ajeku_indexes – han ni won ase fọọmu jo laipe. Koko-ọrọ ni pe wọn ko le kan mu ati ṣafikun.

Bi Mo ti kọ tẹlẹ, a lo iṣeto ni pẹlu ọpọlọpọ awọn ẹda, ati fifuye kika lori awọn ọmọ ogun oriṣiriṣi yatọ ni ipilẹ. Bi abajade, ipo naa wa jade pe diẹ ninu awọn tabili ati awọn atọka lori diẹ ninu awọn agbalejo ni a ko lo ni adaṣe, ati fun itupalẹ o nilo lati gba awọn iṣiro lati gbogbo awọn ọmọ-ogun ninu iṣupọ naa. Awọn iṣiro tunto Eyi tun jẹ pataki lori gbogbo agbalejo ninu iṣupọ; o ko le ṣe eyi lori oluwa nikan.

Ọna yii gba wa laaye lati ṣafipamọ ọpọlọpọ awọn mewa gigabytes nipa yiyọ awọn atọka ti a ko lo tẹlẹ, bakannaa fifi awọn atọka ti o padanu si awọn tabili ti a ko lo.

Bi ipari

Nitoribẹẹ, fun fere gbogbo awọn iwadii aisan o le tunto iyasoto akojọ. Ni ọna yii, o le ṣe awọn sọwedowo ni kiakia ninu ohun elo rẹ, idilọwọ awọn aṣiṣe tuntun lati han, ati lẹhinna ṣatunṣe awọn ti atijọ.

Diẹ ninu awọn iwadii aisan le ṣee ṣe ni awọn idanwo iṣẹ-ṣiṣe lẹsẹkẹsẹ lẹhin yiyi awọn ijira data jade. Ati pe eyi jẹ boya ọkan ninu awọn ẹya ti o lagbara julọ ti ile-ikawe mi. Apeere ti lilo le ṣee ri ninu demo.

O jẹ oye lati ṣe awọn sọwedowo fun awọn atọka ti a ko lo tabi ti o padanu, ati fun bloat, nikan lori aaye data gidi kan. Awọn iye ti a gba le ṣe igbasilẹ ni Tẹ Ile tabi ranṣẹ si eto ibojuwo.

Mo nireti pe pg-index-ilera yoo wulo ati ni eletan. O tun le ṣe alabapin si idagbasoke ile-ikawe nipa jijabọ awọn iṣoro ti o rii ati didaba awọn iwadii aisan tuntun.

orisun: www.habr.com

Fi ọrọìwòye kun