Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Zabbix Àr ett övervakningssystem. Precis som alla andra system stÄr det inför tre grundlÀggande problem som alla övervakningssystem möter: insamling och bearbetning av data, lagring av historik och dess rengöring.

Stegen för att erhÄlla, bearbeta och registrera data tar tid. Lite, men för ett större system kan det leda till betydande fördröjningar. Lagringsproblemet Àr en frÄga om datatillgÄng. De anvÀnds för rapportering, kontroller och triggers. Fördröjningar i datatillgÄng pÄverkar ocksÄ prestandan. NÀr databaser vÀxer mÄste förÄldrad data raderas. Radering Àr en resurskrÀvande operation som ocksÄ pÄverkar resurstillgÄngen.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Problemen med fördröjningar vid insamling och lagring i Zabbix löses med caching: flera typer av cache och caching i databasen. För att lösa det tredje problemet Ă€r caching inte tillrĂ€ckligt, dĂ€rför har Zabbix implementerat TimescaleDB. Mer om detta kommer att berĂ€ttas av Andrej Gushchin — teknisk supportingenjör Zabbix SIA. Andrej har arbetat med Zabbix-support i över 6 Ă„r och har direkt erfarenhet av prestanda.

Hur fungerar TimescaleDB, vilken prestanda kan det ge jÀmfört med vanligt PostgreSQL? Vilken roll spelar Zabbix för TimescaleDB? Hur börjar man frÄn noll och hur migrerar man frÄn PostgreSQL och vilken konfiguration ger bÀst prestanda? Allt detta kommer vi att diskutera.

Spela video

Prestandautmaningar

Varje övervakningssystem stÀlls inför specifika prestandautmaningar. Jag kommer att berÀtta om tre av dem: insamling och bearbetning av data, lagring och rensning av historik.

Snabb insamling och bearbetning av data. Ett bra övervakningssystem mĂ„ste snabbt samla in all data och bearbeta den enligt triggeruttryck — efter sina egna kriterier. Efter bearbetning mĂ„ste systemet ocksĂ„ snabbt spara dessa data i databasen för senare anvĂ€ndning.

Lagring av historik. Ett bra övervakningssystem mÄste lagra historik i databasen och ge enkel Ätkomst till mÀtdata. Historik Àr nödvÀndig för att anvÀndas i rapporter, diagram, triggers, tröskelvÀrden och berÀknade datatyper för notifieringar.

Rensning av historik. Ibland kommer en dag dÄ du inte behöver lagra metrik. Varför skulle du vilja ha data som samlades in för 5 Är sedan, för en mÄnad eller tvÄ: vissa noder har tagits bort, vissa vÀrdar eller metrik Àr inte lÀngre nödvÀndiga eftersom de har blivit förÄldrade och inte samlas in lÀngre. Ett bra övervakningssystem bör lagra historiska data och regelbundet ta bort dem för att förhindra att databasen vÀxer sig för stor.

Rensning av förÄldrad data Àr en akut frÄga som pÄverkar databasens prestanda kraftigt.

Caching i Zabbix

I Zabbix hanteras första och andra anrop genom caching. För insamling och bearbetning av data anvĂ€nds RAM. För lagring – historik i triggerar, diagram och berĂ€knade datakoder. PĂ„ databasens sida finns det viss caching för huvudfrĂ„gor, till exempel diagram.

Caching pÄ sjÀlva Zabbix-servern Àr:

  • ConfigurationCache;
  • ValueCache;
  • HistoryCache;
  • TrendsCache.

LÄt oss titta nÀrmare pÄ dem.

ConfigurationCache

Detta Ă€r den huvudsakliga cachen dĂ€r vi lagrar metrik, vĂ€rdar, datakoder, triggerar – allt som behövs för PreProcessing och datainsamling.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Allt detta lagras i ConfigurationCache för att undvika extra frÄgor till databasen. Efter serverstart uppdaterar vi denna cache och skapar och uppdaterar konfigurationer regelbundet.

Datainsamling

Schemat Ă€r ganska stort, men det viktigaste Ă€r insamlarna. Det Ă€r olika "pollers" – insamlingsprocesser. De ansvarar för olika typer av insamling: de hĂ€mtar data via SNMP, IPMI och överför allt detta till PreProcessing.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDBInsamlarna Àr markerade med en orange linje.

I Zabbix finns det berÀknade aggregationsdatakoder som behövs för att aggregera kontrollerna. Om vi har dem hÀmtar vi data för dem direkt frÄn ValueCache.

PreProcessing HistoryCache

Alla insamlare anvÀnder ConfigurationCache för att fÄ uppgifter. Sedan överför de dem till PreProcessing.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

PreProcessing anvÀnder ConfigurationCache för att hÀmta stegen i PreProcessing. Den bearbetar dessa data pÄ olika sÀtt.

Efter att ha bearbetat data med hjĂ€lp av PreProcessing sparar vi dem i HistoryCache för att bearbeta dem. HĂ€r slutar datainsamlingen och vi gĂ„r vidare till huvudprocessen i Zabbix – history syncer, eftersom det Ă€r en monolitisk arkitektur.

Obs: PreProcessing Àr en ganska resurskrÀvande operation. FrÄn version 4.2 har den flyttats till proxy. Om du har ett mycket stort Zabbix med mÄnga datakoder och hög insamlingsfrekvens underlÀttar detta kraftigt arbetsbördan.

ValueCache, historik och trender cache

Historiksynkroniseraren Àr den huvudsakliga processen som atomÀrt bearbetar varje dataval, det vill sÀga varje vÀrde.

Historiksynkroniseraren tar vÀrden frÄn HistoryCache och kontrollerar i Configuration om det finns triggers för berÀkningar. Om de finns - berÀknar den.

Historiksynkroniseraren skapar en hÀndelse, en eskalering, för att skapa meddelanden om det behövs enligt konfigurationen, och registrerar. Om det finns triggers för efterföljande bearbetning, sparar den detta vÀrde i ValueCache för att inte behöva hÀnvisa till historiktabellen. SÄ fylls ValueCache med data som behövs för berÀkning av triggers, berÀknade element.

Historiksynkroniseraren registrerar all data i databasen, och den - pÄ disken. Bearbetningsprocessen slutar hÀr.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Caching i databasen

PÄ databassidan finns det olika cachar nÀr du vill titta pÄ diagram eller rapporter om hÀndelser:

  • Innodb_buffer_pool pĂ„ MySQL-sidan;
  • shared_buffers pĂ„ PostgreSQL-sidan;
  • effective_cache_size pĂ„ Oracle-sidan;
  • shared_pool pĂ„ DB2-sidan.

Det finns mÄnga andra cacher, men detta Àr de huvudsakliga för alla databaser. De gör det möjligt att hÄlla data i RAM som ofta behövs för förfrÄgningar. De har sina egna teknologier för detta.

Databasens prestanda Àr kritiskt viktig

Zabbix-servern samlar stÀndigt in data och registrerar dem. Vid omstart lÀser den ocksÄ frÄn historiken för att fylla ValueCache. Skripten och rapporterna anvÀnder Zabbix API, som bygger pÄ webgrÀnssnittet. Zabbix API gör förfrÄgningar mot databasen och fÄr nödvÀndig data för diagram, rapporter, hÀndelselistor och senaste problemen.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

För visualisering - Grafana. Bland vÄra anvÀndare Àr det en populÀr lösning. Den kan skicka förfrÄgningar direkt genom Zabbix API bÄde till databasen och skapar en viss konkurrens för att hÀmta data. DÀrför behövs en mer finjusterad och bra konfiguration av databasen för att motsvara snabb resultatÄtergivning och testning.

Housekeeper

Det tredje prestandautmaningen i Zabbix Àr rensning av historik med Housekeeper. Den följer alla instÀllningar - i datatelemen anges hur lÀnge dynamikförÀndringar (trender) ska bevaras i dagar.

TrendsCache berÀknar vi i realtid. NÀr data kommer in aggregerar vi dem under en timme och registrerar dem i tabeller för dynamikförÀndringar av trender.

Housekeeper startar och tar bort information frÄn databasen med vanliga "selects". Detta Àr inte alltid effektivt, vilket kan förstÄs frÄn prestandadiagram för interna processer.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Det röda diagrammet visar att History syncer konstant Àr upptagen. Det orange diagrammet ovan Àr Housekeeper, som stÀndigt startar. Den vÀntar pÄ att databasen ska ta bort alla rader som den har begÀrt.

NÀr bör man stÀnga av Housekeeper? Till exempel, om det finns "Item ID" och man behöver ta bort de senaste 5 000 raderna under en viss tid. SjÀlvklart sker detta via index. Men vanligtvis Àr datasetet vÀldigt stort, och databasen lÀser fortfarande frÄn disken och laddar upp i cachen. Detta Àr alltid en mycket kostsam operation för databasen och kan, beroende pÄ storleken av databasen, leda till prestandaproblem.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Housekeeper kan enkelt stÀngas av. I webbgrÀnssnittet finns en instÀllning under "Administration general" för Housekeeper. Vi stÀnger av intern Housekeeping för intern trendhistorik, och den hanterar inte lÀngre detta.

Housekeeper har stÀngts av, och diagrammen har jÀmnat ut sig. Vilka problem kan uppstÄ i detta fall, och vad kan hjÀlpa till att lösa den tredje prestandautmaningen?

Partitioning — partitionering eller sektionering

Oftast konfigureras partitionering pÄ olika sÀtt i varje relationsdatabas, som jag har nÀmnt. Varje har sin egen teknik, men de Àr liknande i stort. Skapandet av en ny partition leder ofta till vissa problem.

Oftast anpassas partitioner beroende pĂ„ "setup" — mĂ€ngden data som skapas under en dag. Vanligtvis sĂ€tts Partitioning för en dag, detta Ă€r minimi. För trender sĂ€tts en ny partition för en mĂ„nad.

VÀrden kan Àndras i fall av ett mycket stort "setup". Om ett litet "setup" Àr upp till 5 000 nvps (nya vÀrden per sekund), medel Àr mellan 5 000 och 25 000, medan stort Àr över 25 000 nvps. Detta Àr stora och mycket stora installationer som krÀver noggrann databasjustering.

Vid mycket stora installationer kan ett intervall pÄ en dag vara suboptimalt. Jag har sett MySQL-partitioner pÄ 40 GB eller mer per dag. Detta Àr en mycket stor mÀngd data som kan leda till problem, och det bör minskas.

Vad ger Partitioning?

Sektionering av tabeller. Ofta Àr detta separata filer pÄ disken. FrÄgeplanen vÀljer mer optimalt en partition. Vanligtvis anvÀnds partitionering efter intervall - detta gÀller Àven för Zabbix. Vi anvÀnder dÀr "timestamp" - tiden sedan epoch. Hos oss Àr detta vanliga siffror. Du anger början och slutet av dagen - detta Àr en partition.

Snabb borttagning — TA BORT. En fil/subtabell vĂ€ljs, inte en radval för borttagning.

Ger avsevĂ€rt snabbare dataval VÄLJ — anvĂ€nder en eller flera partitioner, inte hela tabellen. Om du begĂ€r data frĂ„n tvĂ„ dagar sedan hĂ€mtas de snabbare frĂ„n databasen, eftersom det bara behöver laddas i cachen och endast ett fil, inte en stor tabell, behöver fĂ„s fram.

Ofta pĂ„skyndar detta mĂ„nga databaser ocksĂ„ INSÄTT — insĂ€ttningar i barn-tabellen.

TimescaleDB

För v 4.2 har vi noterat TimescaleDB. Det Àr ett tillÀgg för PostgreSQL med ett inbyggt grÀnssnitt. TillÀgget fungerar effektivt med tidsseriedata utan att förlora fördelarna med relationsdatabaser. TimescaleDB partitionerar ocksÄ automatiskt.

I TimescaleDB finns det en begrepp hypertabell (hypertable) som du skapar. Den innehĂ„ller chunkar — partitioner. Chunkar Ă€r automatiskt hanterade delar av hypertabellen, som inte pĂ„verkar andra delar. För varje chunk finns en egen tidsintervall.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

TimescaleDB vs PostgreSQL

TimescaleDB fungerar verkligen effektivt. Tillverkarna av tillÀgget hÀvdar att de anvÀnder en mer korrekt algoritm för att behandla förfrÄgningar, sÀrskilt <code>insÀttningar</code>. NÀr storleken pÄ datasetinsÀttningarna vÀxer, upprÀtthÄller algoritmen konstant prestanda.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Efter 200 miljoner rader börjar PostgreSQL vanligtvis att tappa prestanda kraftigt och tappar sin effektivitet till 0. TimescaleDB möjliggör effektiv insÀttning av "insÀttningar" oavsett datavolym.

Installation

Att installera TimescaleDB Àr ganska enkelt för alla paket. I dokumentationen Àr allt utförligt beskrivet - det beror pÄ de officiella PostgreSQL-paketen. TimescaleDB kan ocksÄ byggas och kompileras manuellt.

För Zabbix-databaser aktiverar vi helt enkelt tillÀgget:

echo "CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;" | sudo -u postgres psql zabbix

Du aktiverar tillÀgget och skapar det för Zabbix-databasen. Slutsteget Àr att skapa hypertabellen.

Migration av historiska tabeller till TimescaleDB

Det finns en speciell funktion för detta create_hypertable:

VÄLJ skapa_hypertable(‘history’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VÄLJ skapa_hypertable(‘history_unit’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VÄLJ skapa_hypertable(‘history_log’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VÄLJ skapa_hypertable(‘history_text’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VÄLJ skapa_hypertable(‘history_str’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VÄLJ skapa_hypertable(‘trends’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
VÄLJ skapa_hypertable(‘trends_unit’, ‘clock’, chunk_time_interval => 86400, migrate_data => true);
UPPDATERA config SET db_extension=’timescaledb’, hk_history_global=1, hk_trends_global=1

Funktionen har tre parametrar. Den första Ă€r tabellen i databasen, för vilken en hypertabell ska skapas. Den andra Ă€r fĂ€ltet, efter vilket man mĂ„ste skapa chunk_time_interval — intervall för partitionernas chunk, som ska anvĂ€ndas. I mitt fall Ă€r intervallet en dag — 86 400.

Den tredje parametern Ă€r migrera_data. Om man sĂ€tter true, flyttas alla nuvarande data till de förhands skapade chunkarna. Jag anvĂ€nde det. migrera_dataJag hade ungefĂ€r 1 TB, vilket tog över en timme. Även i vissa fall under testning raderade jag onödiga historiska data av typ strĂ€ng för att inte flytta dem.

Det sista steget Ă€r UPPDATERA: i db_extension sĂ€tter vi timescaledb, sĂ„ att databasen förstĂ„r att detta tillĂ€gg finns. Zabbix aktiverar det och anvĂ€nder korrekt syntax och frĂ„gor mot databasen — de funktioner som behövs för TimescaleDB.

HÄrdvarukonfiguration

Jag anvÀnde tvÄ servrar. Den första Àr VMware-maskin. Den Àr ganska liten: 20 processorer IntelŸ XeonŸ CPU E5-2630 v 4 @ 2.20GHz, 16 GB RAM och en SSD-disk pÄ 200 GB.

Jag installerade PostgreSQL 10.8 med Debian 10.8-1.pgdg90+1 och filsystemet xfs. Jag gjorde minimi-instÀllningar för att anvÀnda just denna databas, förutom att Zabbix kommer att anvÀnda den.

PÄ denna maskin fanns Zabbix-servern, PostgreSQL och lastningsagenter. Jag hade 50 aktiva agenter som anvÀnde LoadableModule, för att mycket snabbt generera olika resultat: siffror, strÀngar. Jag fyllde databasen med stora mÀngder data.

Initialt innehöll konfigurationen 5 000 datanoder per vÀrd. NÀstan varje nod innehöll en trigger för att likna verkliga installationer. I vissa fall fanns det mer Àn en trigger. PÄ en nod i nÀtverket fanns det 3 000-7 000 triggers.

Uppdateringsintervallet för datanoder Àr 4-7 sekunderJag justerade lasten genom att anvÀnda inte bara 50 agenter, utan jag lade ocksÄ till fler. Dessutom justerade jag lasten dynamiskt med hjÀlp av dataelement och sÀnkte uppdateringsintervallet till 4 s.

PostgreSQL. 35 000 nvps

Mitt första körning pĂ„ denna hĂ„rdvara var pĂ„ ren PostgreSQL — 35 000 vĂ€rden per sekund. Som man kan se, tar insĂ€ttning av data brĂ„kdelen av en sekund — allt fungerar bra och snabbt. Det enda Ă€r att SSD-disken pĂ„ 200 GB snabbt fylls.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Detta Ă€r den standardiserade prestationsöversikten för Zabbix — servrar.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Den första blĂ„ grafen visar antalet vĂ€rden per sekund. Den andra grafen till höger visar belastningen av byggprocesserna. Den tredje — belastningen av interna byggprocesser: history syncers och Housekeeper, som hĂ€r kördes under en tillrĂ€cklig tid.

Den fjĂ€rde grafen visar anvĂ€ndningen av HistoryCache. Detta Ă€r en typ av buffert före insĂ€ttning i databasen. Den gröna femte grafen visar anvĂ€ndningen av ValueCache, det vill sĂ€ga hur mĂ„nga trĂ€ffar ValueCache fĂ„r för triggarna — detta Ă€r flera tusen vĂ€rden per sekund.

PostgreSQL. 50 000 nvps

DÀrefter ökade jag lasten till 50 000 vÀrden per sekund pÄ samma hÄrdvara.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Vid belastning med Housekeeper registrerades 10 000 vÀrden pÄ 2-3 s.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB
Housekeeper börjar redan pÄverka arbetet.

FrĂ„n den tredje grafen kan man se att, övergripande, belastningen av trapper och history syncers fortfarande ligger pĂ„ 60%. PĂ„ den fjĂ€rde grafen börjar HistoryCache under Housekeepers arbete fyllas tillrĂ€ckligt aktivt. Det har fyllts till 20% — det Ă€r omkring 0,5 GB.

PostgreSQL. 80 000 nvps

DÀrefter ökade jag lasten till 80 000 vÀrden per sekund. Det Àr ungefÀr 400 000 dataelement och 280 000 triggar.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB
InsÀttningen med belastning frÄn trettio history syncers Àr redan ganska hög.

Jag ökade ocksÄ olika parametrar: history syncers, cache.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

PĂ„ min hĂ„rdvara ökade belastningen av history syncers till maximalt. HistoryCache fylldes snabbt med data — bufferten samlade data för bearbetning.

Hela tiden observerade jag hur processorn, RAM och andra systemparametrar anvÀndes, och jag upptÀckte att diskanvÀndningen var maximal.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Jag uppnÄdde anvÀndningen av diskens maximala kapacitet pÄ denna hÄrdvara och pÄ denna virtuella maskin. Vid sÄdan intensitet började PostgreSQL snabbt slÀppa data, och disken kunde inte lÀngre hÄlla jÀmna steg med skriv- och lÀsoperationer.

En andra server

Jag tog en annan server som redan hade 48 processorer och 128 GB RAM. Jag finjusterade den — installerade 60 history syncer och uppnĂ„dde acceptabel prestanda.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Faktiskt Àr detta redan prestationsgrÀnsen dÀr nÄgot mÄste göras.

TimescaleDB. 80 000 nvps

Mitt huvudsakliga mÄl Àr att testa TimescaleDB:s kapabiliteter under belastning frÄn Zabbix. 80 000 vÀrden per sekund Àr mycket, insamlingsfrekvensen för metric (utom Yandex, förstÄs) och en ganska stor "setup".

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

PĂ„ varje graf finns en nedgĂ„ng — det Ă€r just dataöverföringen. Efter nedgĂ„ngarna i Zabbix-servern Ă€ndrades belastningsprofilen för history syncer dramatiskt — den föll med tre gĂ„nger.

TimescaleDB gör det möjligt att införa data nÀstan tre gÄnger snabbare och anvÀnda mindre HistoryCache.

DÀrmed kommer dina data att levereras i rÀtt tid.

TimescaleDB. 120 000 nvps

DĂ€refter ökade jag antalet datapunkter till 500 000. HuvudmĂ„let var att testa TimescaleDB:s kapabiliteter — jag fick ett berĂ€knat vĂ€rde pĂ„ 125 000 vĂ€rden per sekund.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Detta Àr en fungerande "setup" som kan fungera lÀnge. Men eftersom min disk bara var 1,5 TB, fyllde jag den pÄ nÄgra dagar.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Det viktigaste Àr att nya partitioner i TimescaleDB ocksÄ skapades under samma tid.

För prestandan Àr detta helt omÀrkbart. NÀr partitioner skapas i MySQL, till exempel, Àr allt annorlunda. Vanligtvis sker detta pÄ natten, eftersom det blockerar all inmatning, arbetar med tabeller och kan skapa service degradation. I fallet med TimescaleDB finns detta inte.

Som exempel visar jag en graf frÄn mÄnga i community. I bilden Àr TimescaleDB aktiverat, vilket gör att belastningen pÄ io.weight pÄ processorn sjönk. AnvÀndningen av interna processer minskade ocksÄ. Dessutom Àr detta en vanlig virtuell maskin pÄ vanliga spinning disks, inte SSD.

Hög prestanda och inbyggd partitionering: Zabbix med stöd för TimescaleDB

Slutsatser

TimescaleDB Àr en bra lösning för smÄ "setup", som stöter pÄ diskprestanda. Det kommer att tillÄta att fortsÀtta arbeta bra tills databasens migration till snabbare hÄrdvara.

TimescaleDB Àr lÀtt att konfigurera, ger en prestationsökning, fungerar bra med Zabbix och har fördelar jÀmfört med PostgreSQL.

Om du anvÀnder PostgreSQL och inte planerar att byta, rekommenderar jag att anvÀnda PostgreSQL med TimescaleDB-tillÀgget i samverkan med Zabbix. Denna lösning fungerar effektivt upp till medelstora "setup".

NÀr vi sÀger "högpresterande" menar vi HighLoad++Det dröjer inte lÀnge innan vi fÄr bekanta oss med teknologier och metoder som gör det möjligt för tjÀnster att betjÀna miljontals anvÀndare. Listan över rapporter för den 7 och 8 november har vi redan sammanstÀllt, men möten kan fortfarande föreslÄs.

Prenumerera pÄ vÄr nyhetsbrev och telegram, dÀr vi avslöjar nyheter om den kommande konferensen och lÀr dig hur du fÄr ut maximalt.

KĂ€lla: habr.com

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster