Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Kaugemas tulevikus muutub automaatne hĂ€vitamine ebaolulistest andmetest ĂŒheks oluliseks andmebaasi ĂŒlesandeks [1]. Praegu peame ise hoolitsema ebaoluliste andmete kustutamise vĂ”i vĂ€hem kulukatele salvestuslahendustele liikumise eest. Oletame, et soovite kustutada mitu miljonit rida. Suhteliselt lihtne ĂŒlesanne, eriti kui tingimus on teada ja Ă”ige indeks olemas. "DELETE FROM table1 WHERE col1 = :value" — mis vĂ”iks olla lihtsam, eks?

Video:

Vaata videot

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

  • Olen olnud Highloadi programmikomitees alates esimesest aastast, st 2007. aastast.

  • Ja Postgresiga olen ma alates 2005. aastast. Olen kasutanud seda paljudes projektides.

  • RĂŒhm RuPostgresest on samuti alates 2007. aastast.

  • Meie Meetupil on osalejate arv tĂ”usnud 2100+ni. See on maailmas teine koht pĂ€rast New Yorki, oleme San Franciscost ammu ette jĂ”udnud.

  • MĂ”ned aastad olen elanud Californias. Tegelen enamasti Ameerika ettevĂ”tetega, sealhulgas suurtega. Need on aktiivsed Postgresi kasutajad. Seal tekivad igasugused huvitavad olukorrad.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

https://postgres.ai/ – see on minu ettevĂ”te. Tegeleme ĂŒlesannete automatiseerimisega, mis eemaldavad arenduse aeglustumist.

Kui teete midagi, siis Postgres'i ĂŒmber tekivad vahel ummikud. Oletame, et peate ootama, kuni administraator kĂ€ivitab teile testkeskkonna, vĂ”i peate ootama, kuni DBA teie peale reageerib. Leiame selliseid kitsaskohti arenduse, testimise ja haldamise protsessis ja pĂŒĂŒame neid kĂ”rvaldada automatiseerimise ja uute lĂ€henemisviiside abil.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

https://www.seagate.com/files/www-content/our-story/trends/files/idc-seagate-dataage-whitepaper.pdf

Hiljuti olin Los Angeleses VLDB konverentsil. See on suurim andmebaaside konverents. Seal oli ettekande teema see, et tulevikus ei sÀilita andmebaasid mitte ainult andmeid, vaid ka automaatselt kustutavad neid. See on uus teemaarendus.

Andmete hulk maailmas suureneb – zettabait on 1 000 000 petabaiti. Ja praegu hinnatakse, et maailmas on salvestatud ĂŒle 100 zettabaiti andmeid. Ja neid on jĂ€rjest rohkem.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

https://vldb2019.github.io/files/VLDB19-keynote-2-slides.pdf

Ja mis sellega teha? Selge on, et need tuleb kustutada. Siin on link sellele huvitavale ettekandele. Kuid praegu ei ole seda andmebaasides realiseeritud.

Need, kes oskavad raha lugeda, soovivad kahte asja. Nad soovivad, et me kustutaksime, seetÔttu peaksime tehniliselt suutma seda teha.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Edasi rÀÀkides kĂ€sitlen teatud abstraktset olukorda, mis hĂ”lmab hulga reaalseid olukordi, st mingit kompileerimist sellest, mis on minuga ja ĂŒmbritsevate andmebaasidega tĂ”eliselt juhtunud korduvalt ja mitme aasta jooksul. Komplikatsioonid on igal pool ning nendesse astuvad pidevalt kĂ”ik.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Oletame, et meil on andmebaas vĂ”i mitu andmebaasi, mis kasvavad. Ja mĂ”ned kirjed on selgelt prĂŒgi. NĂ€iteks, kasutaja alustas midagi, kuid ei lĂ”petanud. Ja mingi aja pĂ€rast teame, et seda lĂ”petamata sisu saab juba kustutada. St, et teatud prĂŒgi soovime koristada, et sÀÀsta ruumi, parandada jĂ”udlust jne.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Üldiselt on eesmĂ€rgiks automatiseerida konkreetselt teatud asjade, teatud ridade eemaldamine mingist tabelist.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Ja meil on selline pÀring, millest me tÀna rÀÀgime, st prahi eemaldamisest.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Palusime kogenud arendajal see teostada. Ta vĂ”ttis selle pĂ€ringu, kontrollis enda juures – kĂ”ik töötab. Testis stagingus – kĂ”ik on hĂ€sti. LĂ€bi viidud – kĂ”ik töötab. Kord pĂ€evas kĂ€ivitame seda – kĂ”ik on hĂ€sti.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Andmed kasvavad pidevalt. Iga pÀev DELETE hakkab natuke aeglasemalt töötama.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Siis mĂ”istame, et meil on nĂŒĂŒd turunduskampaania ja liiklus suureneb mitu korda, mistĂ”ttu otsustame ajutiselt mĂ”ningad tarbetud asjad pausile panna. Ja unustame need tagasi tuua.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

MÔne kuu pÀrast meenutame. Ja see arendaja on lahkunud vÔi on millegi muuga hÔivatud, usaldame selle teise inimese kÀtte.

Ta kontrollis dev-is, staging-is – kĂ”ik on korras. Loomulikult, tuleb veel puhastada see, mis on kogunenud. Ta kontrollis, kĂ”ik töötab.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Mis edasi juhtub? Edasi lÀheb kÔik katki. Juhtuma hakkab nii, et mingil hetkel kukub kÔik kokku. KÔik on ƥokis, keegi ei saa aru, mis toimub. Ja siis selgub, et asi oli selle DELETE'is.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Mis lÀks valesti? Siin on nimekiri sellest, mis vÔis valesti minna. Mis on neist kÔige tÀhtsam?

  • NĂ€iteks, ei olnud review'd, see tĂ€hendab, et DBA-spetsialist ei vaadanud. Tema oleks oma kogemusega kohe probleemi leidnud, tal on ju juurdepÀÀs prod'ile, kus on kogunenud mitmeid miljoneid ridasid.

  • VĂ”ib-olla ei kontrollitud kuidagi Ă”igesti.

  • VĂ”ib-olla on riistvara aegunud ja selle andmebaasi jaoks on vajalik uuendus.

  • VĂ”i on probleem koos andmebaasiga ning peame Postgreselt MySQL-ile ĂŒle minema.

  • VĂ”i on operatsiooniga midagi valesti.

  • VĂ”ib-olla on töökorralduses vigu ning peaks kedagi vallandama ja palkama paremaid inimesi?

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

DBA kontrolli ei olnud. Kui DBA oleks olemas, oleks ta nĂ€inud neid paar miljonit rida ja isegi ilma katseteta öelnud: 'Nii ei tehta.' Oletame, et kui see kood oleks GitLabis, GitHubis ja oleks koodie ĂŒlevaatamise protsess, siis oleks selgelt DBA öelnud: 'Nii ei saa teha.'

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Ja ta oleks öelnud, et teil tekivad disk IO probleemid ning kÔik protsessid hakkavad Àrrituma, vÔivad tekkida lukud ning samuti blokeerite automaatse vakueerimise mitmeks minutiks, mis pole hea.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

http://bit.ly/nancy-hl2018-2

Teine viga on see, et kontrolliti vale kohta. JĂ€rgnevalt nĂ€gime, et tootmisjĂ€rgsetes andmetes on palju prĂŒgi ning arendajal ei olnud selles andmebaasis akumuleeritud andmeid, samuti ei loonud keegi stagingus seda prĂŒgi. SeetĂ”ttu oli seal 1 000 rida, mis töötasid kiiresti lĂ€bi.

Me mĂ”istame, et meie testid on nĂ”rgad, st. protsess, mis on ĂŒles ehitatud, ei tuvastanud probleeme. Adekvaatset andmebaasi eksperimenti ei viidud lĂ€bi.

Ideaalne eksperiment tuleks teha sarnasel seadmel. Sarnasel seadmel ei pruugi see alati Ônnestuda, kuid vÀga oluline on, et see oleks tÀismahus andmebaasi koopia. Seda olen ma predikaanud juba mitu aastat. Aasta tagasi rÀÀkisin sellest, vÔite YouTube'ist kÔik vaadata.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

VÔib-olla on meie seadmed halvad? Kui vaadata, siis latentsus on tÔusnud. Oleme nÀinud, et koormus on 100%. Loomulikult, kui need oleksid kaasaegsed NVMe kettad, siis oleks meil tÔenÀoliselt palju kergem. Ja vÔib-olla ei oleks me selle tÔttu kokku kukkunud.

Kui teil on pilved, siis seal on uuendamine lihtne. TĂ”stame uusi replikaid uuel raudvaral. Üleminek. Ja kĂ”ik on hĂ€sti. Suhteliselt lihtne.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Kas oleks vÔimalik ketastega mitte nii palju tegeleda? Ja siin saamegi DBA abil sukelduda teemasse, mida tuntakse kui checkpointi hÀÀlestamine. Selgub, et meil ei olnud checkpointi hÀÀlestamist tehtud.

Mis on checkpoint? See on olemas igas andmebaasisĂŒsteemis. Kui teie andmed mĂ€lus muutuvad, ei salvestata neid kohe kettale. Teave selle kohta, et andmed on muutunud, salvestatakse esmalt ettekujutuslogisse, write-ahead log'i. Ja mingil hetkel otsustab andmebaasisĂŒsteem, et on aeg juba reaalsed lehed kettale kirjutada, et juhul, kui meil tekib tĂ”rge, oleks vĂ€hem REDO't. See on nagu mĂ€ngus. Kui meid tapetakse, hakkame mĂ€ngu mĂ€ngima viimase checkpoint'ist. Ja kĂ”ik andmebaasisĂŒsteemid rakendavad seda.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Postgresi seaded on vananenud. Need on olnud arvutatud 10–15 aasta taguste andmemahu ja toimingute pealt. Ja checkpoint ei ole erand.

See teave on meie Postgresi kontrollimise aruandest, st automaatne tervisekontroll. Ja siin on mÔni tera bite suurune andmebaas. On hÀsti nÀha, et sunnitud checkpoint'id toimuvad peaaegu 90% juhtudest.

Mida see tÀhendab? Seal on kaks seadet. Checkpoint vÔib tekkida nÀiteks timeout'i jÀrgi, nÀiteks 10 minuti pÀrast. VÔi ta vÔib tekkida siis, kui on kogunenud piisavalt palju andmeid.

Ja vaikimisi on max_wal_size seadistatud 1 gigabaiti. Tegelikult juhtub see Postgresis tĂ”eliselt umbes 300–400 megabaidi jĂ€rel. Te olete muutnud nii palju andmeid ja teil toimub checkpoint.

Ja kui see pole keegi tuuninud, kuid teenus on kasvanud ja ettevĂ”te teenib suurt raha, on tal palju tehinguid, siis toimub kontroll iga minuti tagant, mĂ”nikord isegi iga 30 sekundi jĂ€rel, ja mĂ”nikord kattuvad need ĂŒksteisega. See on juba vĂ€ga halb.

Peame tegema nii, et see juhtuks harvem. Ehk saame suurendada max_wal_size'i. Siis toimub see harvem.

Kuid oleme vÀlja töötanud terve metoodika, kuidas seda Ôigesti teha, ehk kuidas teha otsuseid seadistuste valikute osas, tuginedes selgelt konkreetsetele andmetele.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

SeetÔttu viime lÀbi kaks katseringi andmebaasidega.

Esimene seeria — muudame max_wal_size'i. Ja teeme massilise operatsiooni. Esiteks teeme selle vaikeseadega 1 gigabait. Ja teeme massilise DELETE paljude miljonite ridade kaupa.

NÀeme, kui raske on. JÀlgime, et disk IO on vÀga halb. Kontrollime, kui palju WAL'i oleme genereerinud, kuna see on vÀga oluline. JÀlgime, kui mitu korda kontroll toimus. Ja nÀeme, et see ei ole hea.

JĂ€tkame max_wal_size suurendamisega. Kordame. Suurendame, kordame. Ja nii palju kordi. Üldiselt on 10 punkti hea, kus 1, 2, 4, 8 gigabaiti. Ja vaatame konkreetse sĂŒsteemi kĂ€itumist. Loomulikult peab siinne varustus olema nagu prod. Teil peaksid olema samad ketad, sama palju mĂ€lu ja samad Postgresi seadistused.

Nii me vahetame meie sĂŒsteemi ja teame, kuidas kĂ€itub andmebaas kehva massilise DELETE'i korral ning kuidas see checkpoint'ib.

Checkpoint eesti keeles – see on kontrollpunkt.

NĂ€ide: DELETE mitu miljonit rida indeksi kaudu, read on jaotatud lehtedele.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Siin on nĂ€ide. See on mingi andmebaas. Ja vaikeseadistuses 1 gigabaiti max_wal_size korral on vĂ€ga hĂ€sti nĂ€ha, et meie kirjutamised lĂ€hevad riiulisse. Selline pilt – see on tĂŒĂŒpiline sĂŒmptom vĂ€ga haigest patsiendist, st tal oli tĂ”eliselt halvasti. Ja siin oli ainult ĂŒks operatsioon, just DELETE mitu miljonit rida.

Kui sellist operatsiooni prod'isse saata, siis me kindlasti kukume, sest on nĂ€ha, et ĂŒks DELETE tapab meid riiulisse.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Edasi, kus 16 gigabaiti, nĂ€eme, et hammastega lĂ€hemale. Hambad - see on juba parem, st me koputame lakke, aga see pole enam nii halb. Seal on natuke vabadust. Paremal - see on kirje. Ja operatsioonide arv - teine graafik. NĂ€eme, et meil on nĂŒĂŒd kergem hingata, kui 16 gigabaiti.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Kus 64 gigabaiti, on nÀha, et asjad on mÀrgatavalt paremaks lÀinud. Hambad on selgelt vÀljendunud, tekib rohkem vÔimalusi, et teistele operatsioonidele ellu jÀÀda ja midagi kettaga teha.

Miks nii?

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Ma sukeldun veidi ĂŒksikasjadesse, kuid see teema, kuidas lĂ€bi viia checkpointi hÀÀlestust, vĂ”ib muutuda tervikuks ettekandeks, seega ma ei koorma end liiga palju, aga mainin mĂ”ningaid seal olevaid keerukusi.

Kui checkpoint toimub liiga sageli ja me uuendame oma ridu mitte jÀrjekorras, vaid leiame indeksi jÀrgi, siis see on hea, kuna me ei kustuta kogu tabelit; vÔib juhtuda, et esmalt puutume kokku esimese lehega, seejÀrel tuhande lehega ja seejÀrel naaseme esimesse. Ja kui nende visiitide vahel esimest lehte checkpoint juba kettale salvestas, siis salvestab ta selle veel kord, kuna me mÀssime seda teist korda.

Ja me sundime checkpoint'i seda palju kordi salvestama. Tekkivad ĂŒleliigsed toimingud selle jaoks.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Kuid see pole veel kĂ”ik. Postgresis on lehe suurus 8 kilobaiti, Linuxis 4 kilobaiti. On olemas seade full_page_writes. Selle vaikevÀÀrtus on sisse lĂŒlitatud. Ja see on Ă”ige, sest kui me selle vĂ€lja lĂŒlitame, on oht, et vale Ă€parduse korral salvestub vaid pool lehe sisu.

WAL-i ajakirja kirjutamise kÀitumine on selline, et kui meil on checkpoint ja me muudame lehte esmakordselt, siis satub kogu leht ajakirja, st kÔik 8 kilobaiti, kuigi me muutsime vaid 100 baitist koosneva rea. Oleme sunnitud kogu lehe salvestama.

JĂ€rgmistes muudatustes sisaldub ainult konkreetne tupel, kuid esmakordselt salvestame kogu lehe.

Seega, kui checkpoint toimub veel kord, peame jĂ€lle nullist alustama ja kogu leht taas salvestama. Tihedate checkpointide korral, kui liigume ĂŒhtede ja samade lehtede vahel, on full_page_writes = on genereeritud rohkem, kui see vĂ”iks olla, st genereerime rohkem WAL-i. Rohkem saadetakse replikatele, arhiivi, kettale.

Seega tekib meil kaks ĂŒleliigsust.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Kui me suurendame max_wal_size'i, kergendame nii checkpointi kui wal writeri tööd. Ja see on suurepÀrane.

Pange paika terabaidid ja elame sellega. Mis selles halba on? See on halb, sest kui juhtub viga, vÔib meil tÔusmine vÔtta tunde, sest checkpoint oli kaua tagasi ja palju on juba muutunud. Me peame kÔik REDO'i tegema. SeetÔttu teeme teise katsetuste seeria.

Me teeme operatsiooni ja vaatame, kui checkpoint on lÔpetamisele lÀhedal, siis teeme kill -9 Postgres'ile spetsiaalselt.

Ja seejĂ€rel kĂ€ivitame selle uuesti ja vaatame, kui kaua tal lĂ€heb sellel seadmel ĂŒles tĂ”usmiseks, st kui palju ta REDO't selle halva olukorra korral teeb.

Kordan kahekordselt, et olukord on halb. Esiteks, me kukkusime otse enne checkpointi lÔpetamist, seega peame palju kaotama. Teiseks, meil oli massiivne operatsioon. Ja kui checkpoints oleks olnud ajautumise jÀrgi, oleks tÔenÀoliselt vÀhem WAL'i genereeritud viimase checkpointi hetkest. See tÀhendab, et see on kahekordne ebaÔnnestumine.

Me mÔÔdame sellist olukorda erineva max_wal_size suurusega ja mĂ”istame, et kui max_wal_size on 64 gigabaiti, siis kahekordse halvemates situatsioonides tĂ”useme 10 minuti jooksul. Ja mĂ”tleme – kas see on meist rahuldav vĂ”i mitte. See on Ă€ri kĂŒsimus. Me peame selle olukorra nĂ€itama neile, kes vastutavad Ă€riliste otsuste eest, ja kĂŒsima: „Kui kaua me saame maksimaalselt probleemi korral ootama jÀÀda? Kas saame halvemates tingimustes olla 3–5 minutit?“. Ja teete otsuse.

Ja siin on huvitav moment. Meil on konverentsil paar ettekannet Patroni kohta. Ja juhtub, et kasutate seda. See on Postgresi jaoks autofailover. GitLab ja Data Egret rÀÀkisid sellest.

Ja kui teil on autofailover, mis aktiveerub 30 sekundi jooksul, siis vĂ”ib-olla saame me oodata ka 10 minutit? Sest selle ajaks lĂŒlitame ĂŒle replikale ja kĂ”ik lĂ€heb hĂ€sti. See on vaieldav kĂŒsimus. Ma ei tea kindlat vastust. Ma lihtsalt tunnen, et see teema ei puuduta ainult tegevusi pĂ€rast tĂ”rke taastamist.

Kui meil on pikk tÔrke taastamine, siis on meil paljudes teistes olukordades ebamugav. NÀiteks katsetes, kui teeme midagi ja oleme sunnitud mÔnikord ootama kuni 10 minutit.

Ma siiski ei soovitaks liiga kaugele minna, isegi kui meil on autofailover. Üldiselt on sellised vÀÀrtused nagu 64, 100 gigabaiti head. MĂ”nikord tasub valida isegi vĂ€hem. See on ĂŒldiselt Ă”rn teadus.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Te peate iteratsioone tegemiseks, nĂ€iteks max_wal_size = 1, 8, kordama suurt operatsiooni mitu korda. Te olete selle teinud. Ja samas andmebaasis soovite seda veel kord teha, kuid olete ju kĂ”ik juba kustutanud. Mis nĂŒĂŒd teha?

RÀÀgin hiljem meie lahendusest, mida me teeme, et sellistes olukordades iteratsioonide tegemine oleks vÔimalik. See on kÔige Ôigem lÀhenemine.

Kuid antud juhul meil vedas. Kui nagu siin on kirjutatud 'BEGIN, DELETE, ROLLBACK', siis saame DELETE'i korrata. See tĂ€hendab, et kui me selle ise tĂŒhistasime, saame seda korrata. Ja fĂŒĂŒsiliselt on teie andmed seal endiselt olemas. Te ei saa isegi mingit bloat’i. Saate selliste DELETE'ide peal iteratsiooni teha.

Selline DELETE koos ROLLBACK'iga on ideaalne checkpointi hÀÀlestamiseks, isegi kui teil pole korralikult ĂŒles seatud andmebaasist laboratooriume.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Me tegime tabeli, millel on ĂŒks veerg 'i'. Postgresel on teenindusveergud. Need on nĂ€htamatud, kui neid spetsiaalselt ei paluta. Need on: ctid, xmid, xmax.

Ctid on fĂŒĂŒsiline aadress. Nullleht, esimene korthus lehe sees.

On nÀha, et pÀrast ROOLBACKi jÀÀb rida samasse kohta. See tÀhendab, et vÔime proovida uuesti ja see kÀitub samamoodi. See on oluline.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Xmax on rida eluiga. See on mÀÀratud, kuid Postgres teab, et see tehing on tagasi vĂ”etud, seega on nii 0 kui ka tagasi vĂ”etud tehing — see ei ole oluline. See tĂ€hendab, et DELETE’i osas saab iterida ja kontrollida sĂŒsteemi massiivsete operatsioonide kĂ€itumist. Saame teha madala eelarvega andmebaasi laboratooriume.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

See rÀÀgib juba programmeerijatest. RÀÀgib ka DBA-dest, kes on alati programmeerijate kallal: 'Miks teete selliseid pikalt kestvaid ja keerulisi operatsioone?'. See on tĂ€iesti teine, risti vastupidine teema. Varem oli haldamine, nĂŒĂŒd tuleb arendamine.

On ilmne, et me ei jaganud osi. See on arusaadav. Sellist DELETE-d ei saa miljonite ridade korral osadeks jagamata teha. See vÔtab aega 20 minutit ja kÔik seisab. Kuid kahjuks teevad isegi kogenud arendajad vigu, isegi vÀga suurtes ettevÔtetes.

Miks on oluline jagada?

  • Kui nĂ€eme, et kettale on raske, siis aeglustame. Ja kui meil on see jagatud, saame lisada pause, saame aeglustada throttling'ut.

  • Ja me ei blokeeri teisi pikaks ajaks. MĂ”nel juhul pole oluline, kui kustutate tĂ”elist prĂŒgi, millega keegi ei tööta; tĂ”enĂ€oliselt ei blokeeri te kedagi peale autovacuum'i töö, kuna see ootab, kuni tehing on lĂ”pule viidud. Kuid kui kustutate midagi, mida keegi veel kĂŒsida vĂ”ib, siis nad jÀÀvad blokeerituks, tekib mingisugune ahelreaktsioon. Veebisaitidel ja mobiilirakendustes tuleb vĂ€ltida pikki tehinguid.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

https://postgres.ai/products/joe/

See on huvitav. Ma kohtan sageli, et arendajad kĂŒsivad: „Milline on sobiv partii suurus?”.

Selge, et mida suurem on partii suurus, seda vĂ€iksem on tehingu ĂŒlejÀÀk, st tĂ€iendavad tehingu kulud. Kuid samas suureneb selle tehingu kestus.

Mul on vĂ€ga lihtne reegel: vĂ”tke nii palju kui vĂ”imalik, kuid Ă€rge ĂŒletage tehingute tĂ€itmist sekundis.

Miks sekundi? Selgitus on vÀga lihtne ja arusaadav kÔigile, isegi mitte-tehnilistele inimestele. Me nÀeme reaktsiooni. VÔtame 50 millisekundit. Kui midagi on muutunud, reageerib meie silm. Kui vÀhem, siis on keerulisem. Kui midagi vastab 100 millisekundi pÀrast, nÀiteks kui te klÔpsasite hiirega ja see vastas teile 100 millisekundi pÀrast, tunnete juba seda vÀikest viivitust. Sekundit tajutakse juba kui pidurdust.

Seega, kui me jagame meie massilised operatsioonid 10-sekundiliste partii peale, on meil risk, et blokeerime kellegi. Ja ta töötab paar sekundit, ja seda inimesed juba mÀrkavad. SeetÔttu eelistan ma rohkem sekundeid mitte teha. Kuid samas ei taha ma ka liiga vÀikesteks partii kaupa jagada, sest transaction overhead on mÀrgatav. Andmebaasil on raskem, vÔivad esineda ka teised erinevad probleemid.

Me valime partii suuruse. Igas juhtumis vĂ”ime seda erinevalt teha. Seda saab automatiseerida. Ja veendume, et ĂŒhe partii töötlemine on tĂ”hus. St teeme DELETE ĂŒhe partiiga vĂ”i UPDATE.

Üksikasjalikult, mida ma rÀÀgin, kehtib mitte ainult DELETE'i jaoks. Nagu te juba arvasite, on see igasugused massilised operatsioonid andmetega.

Ja me oleme nÀinud, et plaan on suurepÀrane. On nÀha indeksi skaneerimisi, veel paremad on indeksi skaneerimised ainult. Ja meil on vÀike andmete hulk kaasatud. Ja kÔik toimib vÀhem kui sekundiga. Super.

Ja me peame veenduma, et degradaatsiooni ei esine. Juhtub, et esimesed partiid töötavad kiiresti, kuid seejÀrel lÀheb kÔik jÀrjest halvemaks. Protsess on selline, et katsetada tuleb palju. Selleks ongi vajalik database labs.

Ja me peame veel valmistama midagi, mis vÔimaldaks meil produziert Ôigesti jÀlgida. NÀiteks saame logi kirjutada aega, vÔime kirja panna, kus me praegu oleme ja keda me praegu kustutasime. See vÔimaldab meil hiljem mÔista, mis toimub. Ja juhul, kui midagi lÀheb valesti, leida probleem kiiresti.

Kui me peame kontrollima pĂ€ringute efektiivsust ja peame mitu korda iteratsiooni tegema, siis on olemas selline asi nagu kolleeg bot. Ta on juba valmis. Seda kasutavad kĂŒmned arendajad iga pĂ€ev. Ta suudab anda tohutu terabaiti andmebaasi teie pĂ€ringu alusel 30 sekundi jooksul, teie enda koopia. Ja te saate midagi seal eemaldada ja öelda RESET ning veel kord eemaldada. Te saate temaga sel viisil eksperimenteerida. Ma nĂ€en selle asja taga tulevikku. Ja me teeme seda juba.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

https://docs.gitlab.com/ee/development/background_migrations.html

Milliseid jagamise strateegiaid on olemas? Ma nÀen 3 erinevat jagamise strateegiat, mida arendajad pakis kasutavad.

Esimene on vĂ€ga lihtne. Meil on numbriline ID. Ja laseme selle erinevatesse vahemikesse jagada ja töötame selle peal. Miinus on arusaadav. Esimeses segmentis vĂ”ib meile sattuda 100 rida reaalset rĂ€mpsu, teises 5 rida vĂ”i ei satu ĂŒldse, vĂ”i kĂ”ik 1 000 rida osutuvad rĂ€mpsuks. Töö on vĂ€ga ebaĂŒhtlane, aga jagamine on lihtne. VĂ”tsime maksimaalse ID ja jagasime. See on naiivne lĂ€henemine.

Teine strateegia on tasakaalustatud lÀhenemine. Seda kasutatakse GitLabis. Tabel uuriti ja leiti ID-de partii piire nii, et igas partis oleks tÀpselt 10 000 kirjet. Need pandi mingisse jÀrjekorda ja töödeldakse edasi. Seda saab teha mitmes voos.

Esmases strateegias saab samuti teha mitmes voos. See pole keeruline.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

https://medium.com/@samokhvalov/how-partial-indexes-affect-update-performance-in-postgres-d05e0052abc

Aga on veel klassikaline ja optimaalsem lĂ€henemine. See on kolmas strateegia. Ja kui see on vĂ”imalik, tasub see ĂŒle valida. Me kasutame selleks spetsiaalset indeksi. Antud juhul on see tĂ”enĂ€oliselt meie rĂ€si ja ID indeksi alusel. Me lisame ID, et see oleks ainult indeksi skaneerimine, et me ei puutuks heap'iga.

Üldiselt on ainult indeksi skaneerimine kiirem kui indeksi skaneerimine.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Ja me kiiresti leidime need ID-d, mida soovime eemaldada. BATCH_SIZE mÀÀrame ette. Ja me neid mitte ainult ei saa, vaid saame need ka spetsiifiliselt ja lukustame kohe. Kuid lukustame nii, et kui need on juba lukustatud, siis ei lukusta me neid uuesti, vaid liigume edasi ja vĂ”tame jĂ€rgmised. See on 'for update skip locked'. See superfunktsioon Postgres vĂ”imaldab meil, kui soovime, töötada mitmes voos. Saame kasutada ka ĂŒhte voogu. Siin on CTE – see on ĂŒks pĂ€ring. Ja meie CTE teisel tasandil toimub tĂ”eline eemaldamine – returning *. Saame kasutada returning id, kuid parem on *, kui teil on iga rida jaoks vĂ€he andmeid.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Miks me seda vajame? Me vajame seda, et aru anda. Oleme praegu eemaldanud nii palju ridu tegelikult. Ja meie ID- vÔi created_at piirid on sellised. Saame teha min ja max. VÔime teha veel midagi. Siin saab palju asju teha. Ja see on monitoorimiseks vÀga mugav.

Indeksi kohta on veel ĂŒks tĂ€helepanek. Kui me oleme otsustanud, et selle ĂŒlesande jaoks on vajalik eriline indeks, siis peame veenduma, et see ei rikuks heap only tuples uuendusi. Postgreses on selline statistika olemas. Seda saab vaadata pg_stat_user_tables tabelis. Saate kontrollida, kas kasutatakse hot updates vĂ”i mitte.

On olukordi, kus teie uus indeks vÔib neid lihtsalt katkestada. Ja kÔik teised uuendused, mis juba töötavad, hakkavad aeglustuma. Mitte ainult seetÔttu, et indeks on lisatud (iga indeks aeglustab veidi uuendusi, aga mitte palju), vaid see rikub ka neid. Ja selle tabeli jaoks ei ole vÔimalik teha erilist optimeerimist. Selliseid asju juhtub aeg-ajalt. See on detail, millest vÀhesed mÀletavad. Ja nendel kividel on lihtne komistada. MÔnikord tuleb leida teine lÀhenemine ja ikkagi hakkama saada ilma selle uue indeksita, kas teha teine indeks vÔi leida mingi muu lahendus, nÀiteks saab kasutada teist meetodit.

Kuid see on kĂ”ige optimaalsem strateegia, kuidas jagada partiiidesse ja ĂŒhte pĂ€ringusse rĂŒnnata, eemaldada veidi korraga jt.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Pikad tehingud — https://gitlab.com/snippets/1890447

Blokeeritud autovacuum — https://gitlab.com/snippets/1889668

Blokeeriv probleem — https://gitlab.com/snippets/1890428

Viga nr 5 on suur. Nikolai Okmeterist rÀÀkis Postgres'i jÀlgimisest. Kahjuks ei eksisteeri ideaalseid Postgres'i jÀlgimise lahendusi. MÔned on lÀhemal, mÔned kaugemal. Okmeter on piisavalt lÀhedal, et olla ideaalne, kuid palju on puudu ja lisada tuleb. Sellega tuleb arvestada.

NĂ€iteks on dead tuples parem jĂ€lgida. Kui teie tabelis on palju surnud ridasid, siis on midagi valesti. Paremini reageerida nĂŒĂŒd, muidu vĂ”ib tekkida degradatsioon ja meid vĂ”ib ootamatult vĂ€lja lĂŒlitada. Sedasi juhtub.

Kui I/O on suur, siis on selge, et see ei ole hea.

Pikad tehingud ka. OLTP-s ei tohiks lubada pikki tehinguid. Siin on link klipi juurde, mis vĂ”imaldab selle klipi vĂ”tta ja juba teha mingit jĂ€lgimist pikkade tehingute ĂŒle.

Miks on pikad tehingud halvad? Sest kĂ”ik lukud vabanevad alles lĂ”pus. Ja me lukustame kĂ”iki. Lisaks blokeerime autovacuum'i töö kĂ”ikides tabelites. See ei ole ĂŒldse hea. isegi kui teil on replika hot standby sisse lĂŒlitatud, on see ikkagi halb. Üldiselt ei tohiks kuskil lubada pikki tehinguid.

Kui meil on palju tabeleid, mis ei vakumeeru, siis peab olema hÀire. Siin vÔib selline olukord tekkida. Me saame kaudselt mÔjutada autovacuum'i tööd. See on snippet Avitolt, mida ma natuke tÀiendasin. Tulemuseks on huvitav tööriist, et nÀha, kuidas autovacuum meil toimib. NÀiteks ootavad seal teatud tabelid ja ei saa oma jÀrjekorda. See tuleb ka monitooringusse panna ja hÀire peab olema.

Ja issue blokkide osas. Lukustuste puu mets. Mulle meeldib kelleltki midagi vÔtta ja seda tÀiustada. Siin vÔtsin Data Egret'ilt toreda rekursiivse CTE, mis nÀitab lukustuste puu metsa. See on hea tööriist diagnoosimiseks. Ja selle alusel saab ka monitooringu kokku seadma. Kuid seda tuleb teha ettevaatlikult. Tuleb endale seada vÀikene statement_timeout ja soovitavalt ka lock_timeout.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

MÔnikord esinevad kÔik need vead kokku.

Minu arvates on siin kĂ”ige olulisem viga – see on organisatsiooniline. See on organisatsiooniline, kuna tehnika ei pea vastu. Nummer 2 – me kontrollisime valesti.

Me kontrollisime valesti, kuna meil polnud production'i klooni, millel oleks lihtne testida. Arendajal ei pruugi ĂŒldse olla ligipÀÀsu production'ile.

Ja me ei kontrollinud seal. Kui oleksime seal kontrollinud, siis oleksime seda ise nÀinud. Arendaja mÀrkaks seda kÔik ilma DBA-ta, kui ta kontrollib seda heades tingimustes, kus andmeid on sama palju ja sama paigutusega. Ta nÀeks kogu seda deklareeritud halvenemist ja tal oleks piinlik.

Veel autovakuumist. PÀrast seda, kui me tegime massiivse koristamise mitme miljoni rea pealt, tuleb teha veel REPACK. See on eriti oluline indeksite jaoks. Neil lÀheb kehvasti pÀrast seda, kui me seal kÔik puhtaks tegime.

Ja kui soovite tagasi tuua igapĂ€evase koristamise, siis soovitaksin seda teha sagedamini, aga vĂ€iksemate kogustega. Saate seda teha iga minuti vĂ”i isegi sagedamini pisut. Peate korraldama jĂ€lgimise kahe asja ĂŒle: et selle asja puhul ei oleks vigu ja et see ei jÀÀks maha. See trikk, mida ma nĂ€itasin, aitab selle probleemi lahendada.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Meie tegevus pĂ”hineb avatud lĂ€htekoodil. See on saadaval GitLabis. Loome vĂ”imalusi, et inimesed saaksid isegi ilma DBA-ta kontrolle teha. Loome andmebaasi labori, st meie nn baaskomponendi, millel praegu töötab Joe. Saate vĂ”tta koopia tootmisest. NĂŒĂŒd on olemas Joe rakendus Slackis, kus saate öelda: „selgita seda pĂ€ringut” ja saada koheselt vastuse oma andmebaasi koopia kohta. Seal saate isegi DELETE-kĂ€su esitada ja keegi ei mĂ€rka seda.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

Oletame, et teil on 10 terabaiti, meie loome andmebaasi labori ka 10 terabaiti. Ja samas vĂ”ivad töötada 10 arendajat, kes kasutavad samaaegselt 10 terabaiti andmebaasi. IgaĂŒhel on vĂ”imalus teha seda, mida soovib. VĂ”ib eemaldada, kustutada jne. Just selline fantastika. Sellest me rÀÀgime homme.

Kallis DELETE. Nikolai Samohvalov (Postgres.ai)

See on tuntud kui Ă”huke provisionimine. Õhuke provisionimine on teatud fantastika, mis vĂ€hendab arenduse ja testimise viivitusi ning muudab maailma selles osas paremaks. See vĂ”imaldab teil vĂ€ltida probleeme massiliste toimingutega.

NÀide: 5 terabaiti andmebaasi koopia saamine alla 30 sekundi. Ja see ei sÔltu suurusest, st ei ole tÀhtis, kui palju terabaites.

Juba tÀna saate sisse logida Postgres.ai ja uurida meie tööriistu. Saate registreeruda ja vaadata, mis seal on. Saate endale selle boti paigaldada. See on tasuta. Kirjutage.

KĂŒsimused

Tegelikes olukordades juhtub sageli, et andmed, mis peaksid tabelis jÀÀma, on neid oluliselt vĂ€hem kui Need, mida tuleb kustutada. Sellises olukorras on sageli lihtsam lĂ€henemine, et luua uus objekt, kopeerida sinna ainult vajalikud andmed ja vanad tabelid tĂŒhjendada. Selge, et selleks on vaja programmilist lĂ€henemist, kuni vahetate. Milline on see lĂ€henemine?

See on vĂ€ga hea lĂ€henemine ja vĂ€ga hea ĂŒlesanne. See on vĂ€ga sarnane sellele, mida teeb pg_repack, see on vĂ€ga sarnane sellele, mida peate tegema, kui olete ID-d teinud 4-baidisteks. Paljud raamistikud tegid seda mĂ”ned aastat tagasi ja tabelid on tĂ”usnud ning neid tuleb konverteerida 8 baidiks.

See ĂŒlesanne on ĂŒsna keeruline. Me oleme seda teinud. Ja te peate olema vĂ€ga ettevaatlikud. Seal on lukud jne. Kuid see on teostatav. Ehk siis standardne lĂ€henemine on pg_repack. Te kuulutate sellise tabeli. Ja enne kui hakkate andmeid snapshot'ina sinna laadima, kuulutate veel ĂŒhe tabeli, mis kĂ”ik muudatused jĂ€lgib. Seal on nipp, et teatud muudatusi ei pea isegi jĂ€lgima. Seal on nĂŒansse. Ja siis lĂŒlitate ĂŒle, rakendades muudatused. Seal on lĂŒhike paus, mil me kĂ”iki lukustame, kuid ĂŒldiselt on see teostatav.

Kui vaatate pg_repack'i GitHubis, siis seal, kui oli ĂŒlesanne konverteerida ID int 4-st int 8-ks, siis oli mĂ”te kasutada ise pg_repack'i. See on samuti vĂ”imalik, kuid see on natuke hĂ€kkimisviis, aga sobib ka selleks. Te saate sekkuda triggereisse, mida pg_repack kasutab ja öelda: «Need andmed ei ole meile vajalikud», ehk siis me laadime ainult seda, mis meile vajalik. Ja siis see lihtsalt lĂŒlitub ja kĂ”ik.

Selle lĂ€henemisega saame veel ĂŒhe tabeli koopia, kus andmed on juba indekseeritud ja korralikult paigutatud ilusate indeksitega.

Bloat ei ole, see on hea lĂ€henemine. Kuid ma tean, et on tehtud katseid selle automatiseerimiseks, st luua universaalne lahendus. Ma saan teid selle automatiseerimisega ĂŒhendusse viia. See on kirjutatud Pythonis, vĂ€ga hea asi.

Ma olen lihtsalt veidi MySQL maailmast, seetÔttu tulin kuulama. Ja me kasutame sellist lÀhenemist.

Aga see on ainult juhul, kui meil on 90%. Kui meil on 5%, siis ei ole selle rakendamine kuigi hea.

AitÀh ettekande eest! Kui pole ressursse, et teha tÀis koopiat prod'ist, kas on olemas mingi algoritm vÔi valem, et arvutada koormust vÔi suurust?

Hea kĂŒsimus. Praegu suudame leida mitme terabaidi suuruseid andmebaase. Isegi kui seal on teine riistvara, nĂ€iteks vĂ€hem mĂ€lu, vĂ€hem protsessorit ja kettad ei ole tĂ€pselt samad, saame seda teha. Kui pole ĂŒldse kohta, siis tuleb mĂ”elda. Las ma mĂ”tlen homme, kui te tagasi tulete, saame suhelda, see on hea kĂŒsimus.

AitĂ€h ettekande eest! Alguses rÀÀkisite, et on olemas suurepĂ€rane Postgres, millel on sellised piirangud, kuid see areneb. Kuid see kĂ”ik on tegelikult hĂŒpe. Kas see ei lĂ€he vastuollu Postgres'i enda arenguga, kus vĂ”ib-olla ilmub mingi DELETE deferent vĂ”i midagi sarnast, mis peaks madalamal tasemel toetama seda, mida me siin pĂŒĂŒame mĂ”ne oma kummalise vahendiga katta?

Kui me SQL-is ĂŒtleme, et likvideerime vĂ”i uuendame palju salvestusi ĂŒhes tehingus, siis kuidas saab Postgres seda jaotada? Me oleme fĂŒĂŒsiliselt piiratud toimingutes. Me peame seda ikkagi tegema aeglaselt. Ja me lukustame selle ajal jne.

Indeksitega on ju nii tehtud.

Ma vĂ”in eeldada, et ka checkpoint'i seadistust oleks vĂ”inud automatiseerida. Ehk kunagi see juhtumisi toimub. Aga ma ei saa vĂ€ga hĂ€sti kĂŒsimusest aru.

KĂŒsimus on, kas seal ei ole mingit arengusuunda, mis liigub sealpool ja teie omad siinpool paralleelselt? See tĂ€hendab, et seal ei mĂ”elda veel sellele?

Ma rÀÀkisin pĂ”himĂ”tetest, mida saab praegu kasutada. On olemas teine bot. Nancy, selle abil on vĂ”imalik automatiseerida checkpoint'i hÀÀlestust. Kas see kunagi PostgreSQL'is olemas on? Ei tea, praegu ei arutata seda. Me oleme sellest veel kaugel. Kuid on teadlasi, kes loovad uusi sĂŒsteeme. Ja nad suunavad meid automaatsetesse indeksitesse. On arenguid. NĂ€iteks vĂ”ite vaadata auto hÀÀlestust. See valib parameetreid automaatselt. Kuid see ei tee teile checkpoint'i hÀÀlestust. See tĂ€hendab, et see valib teie jaoks performance, shell buffer jne.

Ja checkpoint'i hÀÀlestamiseks saab teha jÀrgmist: kui teil on tuhat klastrit ja erinevad riistvarad, erinevad virtuaalmasinad pilves, saate kasutada meie boti Nancy automatiseerimise tegemiseks. Ja max_wal_size valitakse automaatselt vastavalt teie sihtseadetele. Kuid kahjuks pole seda tuumas isegi ligidalt.

Tere pÀevast! Te rÀÀkisite pikaajaliste tehingute kahjulikkusest. Te mainisite, et autovacuum'id blokeeritakse kustutamisel. Mida veel me sellest kaotame? Sest me rÀÀgime rohkem ruumi vabastamisest ja selle kasutamise vÔimalustest. Mida me veel kaotame?

Autovacuum ei pruugi olla siin kĂ”ige suurem probleem. KĂŒll aga, pikas tehingus lukustatavus vĂ”ib teisi tehinguid rohkem ohustada. See olukord vĂ”ib esineda, aga ei pruugi. Kui see juhtub, on see vĂ€ga halb. Ja autovacuumiga on samuti probleem. OLTP-s on pikas tehingus kaks peamist probleemi: lukud ja autovacuum. Kui teil on kuum varukoopia tagasiside replikal lubatud, siis te peate veel taluma autovacuum'i lukustamise peamises andmebaasis, mis tuleb replikalt. Kuid seal ei ole lukke. Siin vĂ”ivad aga lukud tekkida. Me rÀÀgime andmete muutmisest, mistĂ”ttu lukud on siin oluline aspekt. Ja kui see kĂ”ik venib, siis lukustub ĂŒha rohkem tehinguid. Nad vĂ”ivad lukustada teisi tehinguid. Ja lukustuste puude tekkimine on vĂ”imalik. Toetasin eelnevalt lingiga snippet’i. See probleem muutub tĂ”enĂ€olisemaks ja silmatorkavamaks kui autovacuum'i probleem, mis vĂ”ib ainult kuhjuda.

AitĂ€h ettekande eest! Alustasite oma ettekannet vĂ€itega, et testisite valesti. Edasi arendasite ideed, et tuleb kasutada ĂŒhte ja sama varustust, samuti sama andmebaasi. Oletame, et andsime arendajale andmebaasi. Ja ta tĂ€itis pĂ€ringu. Ja tal tundub, et kĂ”ik on korras. Kuid ta ei kontrolli seda live keskkonnas, nĂ€iteks on meil seal koormus 60-70%. Ja isegi kui me kasutame seda hÀÀlestust, ei tuli ĂŒldiselt vĂ€lja eriti hĂ€sti.

Meeskonnas eksperdi olemasolu ja eksperdi DBA kasutamine, kes vĂ”ib prognoosi teha, mis juhtub reaalses taustakoormuses, on oluline. Kui me lihtsalt jooksutame meie puhtaid muudatusi, nĂ€eme pilti. Kuid edasijĂ”udnud lĂ€henemine on see, et me teeme sama uuesti, kuid simuleeritud tootmiskoormusega. See on tĂ”eliselt Ă€ge. Selleks peame veel arenema. See on tĂ€iskasvanute tasemel. Vaatasime lihtsalt, mis meil on, ja kontrollisime, kas meil on piisavalt ressursse. See on hea kĂŒsimus.

Kui me teeme juba prĂŒgi valiku ja meil on nĂ€iteks kustutuslipp.

See on see, mida autovacuum Postgres'is automaatselt teeb.

Ah, ta teeb seda?

Autovacuum ongi see prĂŒgikoguja.

AitÀh!

AitĂ€h ettekande eest! Kas on vĂ”imalus kohe kujundada andmebaas partitsioneerimisega nii, et kogu prĂŒgi eemaldatakse peamisest tabelist kuskile kĂ”rvale?

Muidugi, on.

Kas saame end siis kaitsta, kui lukustame tabeli, mida ei tohiks kasutada?

Muidugi, on. Aga see on kĂŒsimus nagu kana ja muna. Kui me kĂ”ik teaksime, mis tulevikus juhtuma hakkab, siis muidugi, teeksime kĂ”ik suurepĂ€raselt. Aga Ă€ri muutub, tekivad uued veerud, uued pĂ€ringud. Ja siis - oop, me tahame selle eemaldada. Kuid see on ideaalne olukord, elus juhtub seda, aga mitte alati. Kuid ĂŒldiselt on see hea idee. Lihtsalt truncate ja kĂ”ik.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster