Om att flytta frÄn Redis till Redis-kluster

Om att flytta frÄn Redis till Redis-kluster

NÀr det kommer till en produkt som har utvecklats i mer Àn ett decennium Àr det inte alls förvÄnande att hitta förÄldrad teknik i den. Men vad hÀnder om du om sex mÄnader mÄste hÄlla belastningen 10 gÄnger högre, och kostnaden för fall kommer att öka hundratals gÄnger? I det hÀr fallet behöver du en cool Highload Engineer. Men i avsaknad av en piga anförtrodde de mig att lösa problemet. I den första delen av artikeln kommer jag att berÀtta hur vi gick frÄn Redis till Redis-kluster, och i den andra delen kommer jag att ge rÄd om hur du börjar anvÀnda klustret och vad du ska vara uppmÀrksam pÄ nÀr du anvÀnder det.

Teknikval

Är det sĂ„ illa? separata Redis (fristĂ„ende redis) i en konfiguration av 1 master och N slavar? Varför kallar jag det förĂ„ldrad teknik?

Nej, Redis Àr inte sÄ illa... Det finns dock nÄgra brister som inte gÄr att ignorera.

  • För det första stöder inte Redis mekanismer för Ă„terstĂ€llning efter ett huvudfel. För att lösa detta problem anvĂ€nde vi en konfiguration med automatisk överföring av VIPs till en ny master, Ă€ndrade rollen för en av slavarna och bytte resten. Denna mekanism fungerade, men den kunde inte kallas en pĂ„litlig lösning. För det första uppstod falsklarm, och för det andra var det engĂ„ngsbruk, och efter drift krĂ€vdes manuella Ă„tgĂ€rder för att ladda fjĂ€dern.

  • För det andra, att bara ha en mĂ€stare ledde till problemet med skĂ€rning. Vi var tvungna att skapa flera oberoende kluster "1 master och N slavar", sedan manuellt distribuera databaserna mellan dessa maskiner och hoppas att en av databaserna i morgon inte skulle svĂ€lla sĂ„ mycket att den skulle behöva flyttas till en separat instans.

Vad Àr alternativen?

  • Den dyraste och rikaste lösningen Ă€r Redis-Enterprise. Detta Ă€r en boxad lösning med full teknisk support. Trots att det ser idealiskt ut ur teknisk synvinkel passade det inte oss av ideologiska skĂ€l.
  • Redis-kluster. Out of the box finns stöd för master failover och sharding. GrĂ€nssnittet skiljer sig nĂ€stan inte frĂ„n den vanliga versionen. Det ser lovande ut, vi pratar om fallgroparna senare.
  • Tarantool, Memcache, Aerospike och andra. Alla dessa verktyg gör ungefĂ€r samma sak. Men var och en har sina egna brister. Vi bestĂ€mde oss för att inte lĂ€gga alla vĂ„ra Ă€gg i en korg. Vi anvĂ€nder Memcache och Tarantool för andra uppgifter, och nĂ€r vi ser framĂ„t kommer jag att sĂ€ga att det i vĂ„r praktik var fler problem med dem.

Specifikationer för anvÀndning

LÄt oss ta en titt pÄ vilka problem vi historiskt har löst med Redis och vilken funktionalitet vi anvÀnde:

  • Cache innan förfrĂ„gningar till fjĂ€rrtjĂ€nster som 2GIS | Golang

    GET SET MGET MSET "SELECT DB"

  • Cache före MYSQL | PHP

    GET SET MGET MSET SCAN "KEY BY PATTERN" "SELECT DB"

  • Huvudlagringen för tjĂ€nsten att arbeta med sessioner och förarkoordinater | Golang

    GET SET MGET MSET "SELECT DB" "ADD GEO KEY" "GET GEO KEY" SCAN

Som du kan se, ingen högre matematik. Vad Àr dÄ svÄrigheten? LÄt oss titta pÄ varje metod separat.

metod
beskrivning
Funktioner i Redis-kluster
beslutet

FÖRSTÄLL
Skriv/lÀs nyckel

MGET MSET
Skriv/lÀs flera nycklar
Nycklarna kommer att finnas pÄ olika noder. FÀrdiga bibliotek kan utföra flera operationer endast inom en nod
ErsÀtt MGET med en pipeline av N GET-operationer

VÄLJ DB
VĂ€lj den bas vi ska arbeta med
Stöder inte flera databaser
LĂ€gg allt i en databas. LĂ€gg till prefix till nycklar

SCAN
GĂ„ igenom alla nycklar i databasen
Eftersom vi har en databas Àr det för dyrt att gÄ igenom alla nycklar i klustret
BehÄll en invariant inom en nyckel och gör en HSCAN pÄ denna nyckel. Eller vÀgra helt

GEO
Operationer med en geonyckel
Geonyckeln Àr inte skÀrrad

NYCKEL EFTER MÖNSTER
Söker efter en nyckel efter mönster
Eftersom vi har en databas kommer vi att söka över alla nycklar i klustret. För dyr
Avvisa eller bibehÄll det invarianta, som i fallet med SCAN

Redis vs Redis-kluster

Vad förlorar vi och vad vinner vi nÀr vi byter till ett kluster?

  • Nackdelar: vi förlorar funktionaliteten i flera databaser.
    • Om vi ​​vill lagra logiskt orelaterade data i ett kluster mĂ„ste vi göra kryckor i form av prefix.
    • Vi förlorar alla "bas" operationer, sĂ„som SCAN, DBSIZE, CLEAR DB, etc.
    • Multioperationer har blivit mycket svĂ„rare att implementera eftersom det kan krĂ€va tillgĂ„ng till flera noder.
  • fördelar:
    • Feltolerans i form av master failover.
    • Sharding pĂ„ Redis-sidan.
    • Överför data mellan noder atomĂ€rt och utan stillestĂ„nd.
    • LĂ€gg till och omfördela kapacitet och laster utan stillestĂ„nd.

Jag skulle dra slutsatsen att om du inte behöver ge en hög feltolerans, sÄ Àr det inte vÀrt att flytta till ett kluster, eftersom det kan vara en icke-trivial uppgift. Men om du till en början vÀljer mellan en separat version och en klusterversion, bör du vÀlja ett kluster, eftersom det inte Àr vÀrre och dessutom kommer att lindra en del av huvudvÀrken

Förbereder för att flytta

LÄt oss börja med kraven för att flytta:

  • Det ska vara sömlöst. Ett komplett servicestopp i 5 minuter passar oss inte.
  • Det ska vara sĂ„ sĂ€kert och gradvis som möjligt. Jag vill ha lite kontroll över situationen. Vi vill inte dumpa allt pĂ„ en gĂ„ng och be över Ă„terstĂ€llningsknappen.
  • Minimal dataförlust nĂ€r du flyttar. Vi förstĂ„r att det kommer att vara mycket svĂ„rt att flytta atomĂ€rt, sĂ„ vi tillĂ„ter viss desynkronisering mellan data i vanliga och klustrade Redis.

KlusterunderhÄll

Strax innan flytten bör vi fundera pÄ om vi kan stödja klustret:

  • Diagram. Vi anvĂ€nder Prometheus och Grafana för att plotta CPU-belastning, minnesanvĂ€ndning, antal klienter, antal GET-, SET-, AUTH-operationer, etc.
  • Expertis. FörestĂ€ll dig att du imorgon kommer att ha ett enormt kluster under ditt ansvar. Om det gĂ„r sönder kan ingen annan Ă€n du fixa det. Om han börjar sakta ner kommer alla att springa mot dig. Om du behöver lĂ€gga till resurser eller omfördela belastningen, kom tillbaka till dig. För att inte bli grĂ„ vid 25 Ă€r det lĂ€mpligt att ta hand om dessa fall och kontrollera i förvĂ€g hur tekniken kommer att bete sig under vissa Ă„tgĂ€rder. LĂ„t oss prata om detta mer i detalj i avsnittet "Expert".
  • Övervakning och varningar. NĂ€r ett kluster gĂ„r sönder vill du vara den första att veta om det. HĂ€r begrĂ€nsade vi oss till ett meddelande om att alla noder returnerar samma information om klustrets tillstĂ„nd (ja, det hĂ€nder olika). Och andra problem kan upptĂ€ckas snabbare genom varningar frĂ„n Redis kundtjĂ€nst.

korsning

Hur vi ska flytta:

  • Först och frĂ€mst mĂ„ste du förbereda ett bibliotek för att arbeta med klustret. Vi tog go-redis som grund för Go-versionen och Ă€ndrade den lite för att passa oss sjĂ€lva. Vi implementerade Multi-metoder genom pipelines och korrigerade ocksĂ„ en aning reglerna för att upprepa förfrĂ„gningar. PHP-versionen hade fler problem, men vi bestĂ€mde oss sĂ„ smĂ„ningom pĂ„ php-redis. De introducerade nyligen klusterstöd och det ser bra ut enligt vĂ„r mening.
  • DĂ€refter mĂ„ste du distribuera sjĂ€lva klustret. Detta görs bokstavligen i tvĂ„ kommandon baserat pĂ„ konfigurationsfilen. Vi kommer att diskutera instĂ€llningen mer i detalj nedan.
  • För gradvis förflyttning anvĂ€nder vi torrlĂ€ge. Eftersom vi har tvĂ„ versioner av biblioteket med samma grĂ€nssnitt (en för den vanliga versionen, den andra för klustret) kostar det ingenting att skapa en wrapper som fungerar med en separat version och parallellt duplicera alla förfrĂ„gningar till klustret, jĂ€mför svar och skriv avvikelser i loggarna (i vĂ„rt fall i NewRelic). SĂ„ledes, Ă€ven om klusterversionen gĂ„r sönder under utrullningen, kommer vĂ„r produktion inte att pĂ„verkas.
  • Efter att ha rullat ut klustret i torrt lĂ€ge kan vi lugnt titta pĂ„ grafen över svarsavvikelser. Om felfrekvensen sakta men sĂ€kert rör sig mot nĂ„gon liten konstant sĂ„ Ă€r allt bra. Varför finns det fortfarande avvikelser? Eftersom inspelning i en separat version sker lite tidigare Ă€n i klustret, och pĂ„ grund av mikrofördröjning, kan data divergera. Allt som Ă„terstĂ„r Ă€r att titta pĂ„ avvikelseloggarna, och om de alla förklaras av postens icke-atomicitet, dĂ„ kan vi gĂ„ vidare.
  • Nu kan du byta torrlĂ€ge i motsatt riktning. Vi kommer att skriva och lĂ€sa frĂ„n klustret och duplicera det till en separat version. För vad? Under nĂ€sta vecka skulle jag vilja observera klustrets arbete. Om det plötsligt visar sig att det finns problem vid toppbelastning, eller om vi inte tagit hĂ€nsyn till nĂ„got, har vi alltid en nödĂ„terstĂ€llning till den gamla koden och aktuella data tack vare torrlĂ€ge.
  • Allt som Ă„terstĂ„r Ă€r att inaktivera torrlĂ€ge och demontera den separata versionen.

Expertis

Först, kortfattat om klusterdesignen.

För det första Àr Redis en nyckel-vÀrde butik. Godtyckliga strÀngar anvÀnds som nycklar. Tal, strÀngar och hela strukturer kan anvÀndas som vÀrden. Det finns vÀldigt mÄnga av de senare, men för att förstÄ den allmÀnna strukturen Àr detta inte viktigt för oss.
NÀsta abstraktionsnivÄ efter nycklar Àr slots (SLOTS). Varje nyckel tillhör en av 16 383 platser. Det kan finnas hur mÄnga nycklar som helst i varje fack. SÄledes Àr alla nycklar uppdelade i 16 383 disjunkta uppsÀttningar.
Om att flytta frÄn Redis till Redis-kluster

DÀrefter mÄste det finnas N masternoder i klustret. Varje nod kan ses som en separat Redis-instans som vet allt om andra noder inom klustret. Varje huvudnod innehÄller ett antal luckor. Varje slot tillhör endast en huvudnod. Alla platser mÄste fördelas mellan noder. Om nÄgra platser inte tilldelas kommer nycklarna som Àr lagrade i dem att vara oÄtkomliga. Det Àr vettigt att köra varje masternod pÄ en separat logisk eller fysisk maskin. Det Àr ocksÄ vÀrt att komma ihÄg att varje nod bara körs pÄ en kÀrna, och om du vill köra flera Redis-instanser pÄ samma logiska maskin, se till att de körs pÄ olika kÀrnor (vi har inte provat detta, men i teorin borde det fungera) . I huvudsak ger masternoder regelbunden sharding, och fler masternoder tillÄter skriv- och lÀsbegÀranden att skalas.

Efter att alla nycklar Àr fördelade bland luckorna, och luckorna Àr utspridda bland masternoderna, kan ett godtyckligt antal slavnoder lÀggas till varje masternod. Inom varje sÄdan master-slavlÀnk kommer normal replikering att fungera. Slavar behövs för att skala lÀsbegÀranden och för failover i hÀndelse av masterfel.
Om att flytta frÄn Redis till Redis-kluster

LÄt oss nu prata om operationer som det skulle vara bÀttre att kunna göra.

Vi kommer Ät systemet via Redis-CLI. Eftersom Redis inte har en enda ingÄngspunkt kan du utföra följande operationer pÄ nÄgon av noderna. Vid varje punkt uppmÀrksammar jag separat möjligheten att utföra operationen under belastning.

  • Det första och viktigaste vi behöver Ă€r klusternodoperationen. Den returnerar tillstĂ„ndet för klustret, visar en lista över noder, deras roller, slotdistribution, etc. Mer information kan erhĂ„llas med hjĂ€lp av klusterinformation och klusterplatser.
  • Det skulle vara trevligt att kunna lĂ€gga till och ta bort noder. För detta Ă€ndamĂ„l finns klustertrĂ€ffar och klusterglömverksamheter. Observera att klusterforget mĂ„ste tillĂ€mpas pĂ„ VARJE nod, bĂ„de master och repliker. Och klustermöten behöver bara anropas pĂ„ en nod. Denna skillnad kan vara oroande, sĂ„ det Ă€r bĂ€st att lĂ€ra sig om det innan du gĂ„r live med ditt kluster. Att lĂ€gga till en nod görs sĂ€kert i strid och pĂ„verkar inte driften av klustret pĂ„ nĂ„got sĂ€tt (vilket Ă€r logiskt). Om du ska ta bort en nod frĂ„n klustret bör du se till att det inte finns nĂ„gra luckor kvar pĂ„ den (annars riskerar du att förlora Ă„tkomst till alla nycklar pĂ„ denna nod). Ta inte heller bort en master som har slavar, annars kommer en onödig röst pĂ„ en ny master att utföras. Om noderna inte lĂ€ngre har slots sĂ„ Ă€r detta ett litet problem, men varför behöver vi extra val om vi kan ta bort slavarna först.
  • Om du mĂ„ste byta master- och slavpositioner med kraft, kommer kommandot för kluster-failover att fungera. NĂ€r du kallar det i strid mĂ„ste du förstĂ„ att befĂ€lhavaren kommer att vara otillgĂ€nglig under operationen. Vanligtvis sker omkopplingen pĂ„ mindre Ă€n en sekund, men Ă€r inte atomĂ€r. Du kan förvĂ€nta dig att vissa förfrĂ„gningar till mastern kommer att misslyckas under denna tid.
  • Innan du tar bort en nod frĂ„n klustret bör det inte finnas nĂ„gra spĂ„r kvar pĂ„ den. Det Ă€r bĂ€ttre att omfördela dem med kommandot cluster reshard. Slots kommer att överföras frĂ„n en master till en annan. Hela operationen kan ta flera minuter, det beror pĂ„ mĂ€ngden data som överförs, men överföringsprocessen Ă€r sĂ€ker och pĂ„verkar inte driften av klustret pĂ„ nĂ„got sĂ€tt. SĂ„ledes kan all data överföras frĂ„n en nod till en annan direkt under belastning och utan att behöva oroa sig för dess tillgĂ€nglighet. Men det finns ocksĂ„ finesser. För det första Ă€r dataöverföring förknippad med en viss belastning pĂ„ mottagar- och avsĂ€ndarnoderna. Om mottagarnoden redan Ă€r hĂ„rt belastad pĂ„ processorn, bör du inte ladda den med att ta emot nya data. För det andra, sĂ„ snart det inte finns en enda lucka kvar pĂ„ den sĂ€ndande mastern, kommer alla dess slavar omedelbart att gĂ„ till mastern till vilken dessa luckor överfördes. Och problemet Ă€r att alla dessa slavar kommer att vilja synkronisera data pĂ„ en gĂ„ng. Och du kommer att ha tur om det Ă€r partiell snarare Ă€n fullstĂ€ndig synkronisering. Ta hĂ€nsyn till detta och kombinera operationerna med att överföra slots och inaktivera/överföra slavar. Eller hoppas att du har tillrĂ€cklig sĂ€kerhetsmarginal.
  • Vad ska du göra om du under överföringen upptĂ€cker att du har tappat bort dina slots nĂ„gonstans? Jag hoppas att det hĂ€r problemet inte pĂ„verkar dig, men om det gör det finns det en klusterfixoperation. Åtminstone kommer hon att sprida luckorna över noderna i en slumpmĂ€ssig ordning. Jag rekommenderar att du kontrollerar dess funktion genom att först ta bort noden med distribuerade slots frĂ„n klustret. Eftersom data i oallokerade platser redan Ă€r otillgĂ€ngliga Ă€r det för sent att oroa sig för problem med tillgĂ€ngligheten av dessa platser. ÅtgĂ€rden kommer i sin tur inte att pĂ„verka distribuerade slots.
  • En annan anvĂ€ndbar operation Ă€r monitor. Det lĂ„ter dig se i realtid hela listan över förfrĂ„gningar som gĂ„r till noden. Dessutom kan du greppa den och ta reda pĂ„ om det finns den nödvĂ€ndiga trafiken.

Det Àr ocksÄ vÀrt att nÀmna master failover-proceduren. Kort sagt, det finns, och enligt mig fungerar det utmÀrkt. Tro dock inte att om du kopplar ur nÀtsladden pÄ en maskin med en masternod kommer Redis omedelbart att byta över och kunder kommer inte att mÀrka förlusten. I min praktik sker bytet pÄ nÄgra sekunder. Under denna tid kommer en del av datan att vara otillgÀnglig: befÀlhavarens otillgÀnglighet upptÀcks, noder röstar pÄ en ny, slavar vÀxlas, data synkroniseras. Det bÀsta sÀttet att försÀkra sig om att programmet fungerar Àr att genomföra lokala övningar. Höj klustret pÄ din bÀrbara dator, ge det en minimal belastning, simulera en krasch (till exempel genom att blockera portarna) och utvÀrdera vÀxlingshastigheten. Enligt min mening, först efter att ha spelat pÄ detta sÀtt i en dag eller tvÄ kan du vara sÀker pÄ att tekniken fungerar. Tja, eller hoppas att mjukvaran som hÀlften av Internet anvÀnder förmodligen fungerar.

konfiguration

Ofta Àr konfigurationen det första du behöver för att börja arbeta med verktyget. Och nÀr allt fungerar vill du inte ens röra konfigurationen. Det tar lite anstrÀngning att tvinga dig sjÀlv att gÄ tillbaka till instÀllningarna och gÄ igenom dem noggrant. I mitt minne hade vi minst tvÄ allvarliga fel pÄ grund av ouppmÀrksamhet pÄ konfigurationen. Var sÀrskilt uppmÀrksam pÄ följande punkter:

  • timeout 0
    Tid efter vilken inaktiva anslutningar stÀngs (i sekunder). 0 - stÀng inte
    Inte alla vĂ„ra bibliotek kunde stĂ€nga anslutningar korrekt. Genom att inaktivera den hĂ€r instĂ€llningen riskerar vi att nĂ„ grĂ€nsen för antalet klienter. Å andra sidan, om det finns ett sĂ„dant problem, kommer automatisk avslutning av förlorade anslutningar att maskera det, och vi kanske inte mĂ€rker det. Dessutom bör du inte aktivera den hĂ€r instĂ€llningen nĂ€r du anvĂ€nder bestĂ€ndiga anslutningar.
  • Spara xy & tillĂ€gg ja
    Sparar en RDB-ögonblicksbild.
    Vi kommer att diskutera RDB/AOF-frÄgor i detalj nedan.
  • stop-writes-on-bgsave-error no & slave-serve-stale-data ja
    Om den Àr aktiverad, om RDB-ögonblicksbilden gÄr sönder, kommer mastern att sluta acceptera ÀndringsförfrÄgningar. Om anslutningen till mastern bryts kan slaven fortsÀtta att svara pÄ förfrÄgningar (ja). Eller kommer att sluta svara (nej)
    Vi Àr inte nöjda med situationen dÀr Redis förvandlas till en pumpa.
  • repl-ping-slave-period 5
    Efter denna tidsperiod kommer vi att börja oroa oss för att mastern har gÄtt sönder och det Àr dags att utföra failover-proceduren.
    Du mÄste manuellt hitta en balans mellan falska positiva resultat och att utlösa en failover. I vÄr praktik Àr detta 5 sekunder.
  • repl-backlog-storlek 1024mb & epl-backlog-ttl 0
    Vi kan lagra exakt sÄ mycket data i en buffert för en misslyckad replik. Om bufferten tar slut mÄste du synkronisera helt.
    Övning tyder pĂ„ att det Ă€r bĂ€ttre att sĂ€tta ett högre vĂ€rde. Det finns mĂ„nga anledningar till varför en replik kan börja slĂ€pa efter. Om det slĂ€par, sĂ„ kĂ€mpar din mĂ€stare troligen redan för att klara sig, och full synkronisering kommer att vara droppen.
  • maxklienter 10000 XNUMX
    Maximalt antal engÄngskunder.
    Enligt vÄr erfarenhet Àr det bÀttre att sÀtta ett högre vÀrde. Redis hanterar 10k anslutningar bra. Se bara till att det finns tillrÀckligt med uttag pÄ systemet.
  • maxmemory-policy volatile-ttl
    Regeln enligt vilken nycklar tas bort nÀr den tillgÀngliga minnesgrÀnsen nÄs.
    Det viktiga hÀr Àr inte sjÀlva regeln, utan förstÄelsen för hur detta kommer att ske. Redis kan prisas för sin förmÄga att fungera normalt nÀr minnesgrÀnsen Àr nÄdd.

RDB och AOF problem

Även om Redis sjĂ€lv lagrar all information i RAM, finns det ocksĂ„ en mekanism för att spara data till disk. Mer exakt tre mekanismer:

  • RDB-snapshot - en komplett ögonblicksbild av all data. StĂ€ll in med SAVE XY-konfigurationen och lĂ€ser "Spara en fullstĂ€ndig ögonblicksbild av all data var X sekund om minst Y-nycklar har Ă€ndrats."
  • Enbart tillĂ€ggsfil - en lista över operationer i den ordning de utförs. LĂ€gger till nya inkommande operationer till filen var X:e sekund eller varje Y-operation.
  • RDB och AOF Ă€r en kombination av de tvĂ„ föregĂ„ende.

Alla metoder har sina fördelar och nackdelar, jag kommer inte att lista dem alla, jag kommer bara att uppmÀrksamma punkter som enligt min mening inte Àr uppenbara.

För det första mÄste du anropa FORK för att spara en RDB-ögonblicksbild. Om det finns mycket data kan detta hÀnga hela Redis under en period av nÄgra millisekunder till en sekund. Dessutom behöver systemet allokera minne för en sÄdan ögonblicksbild, vilket leder till behovet av att ha en dubbel tillgÄng pÄ RAM pÄ den logiska maskinen: om 8 GB tilldelas för Redis, bör 16 GB vara tillgÀngligt pÄ den virtuella maskinen med Det.

För det andra finns det problem med partiell synkronisering. I AOF-lÀge, nÀr slaven Àr Äteransluten, istÀllet för partiell synkronisering, kan full synkronisering utföras. Varför detta hÀnder kunde jag inte förstÄ. Men det Àr vÀrt att komma ihÄg detta.

Dessa tvÄ punkter fÄr oss redan att fundera pÄ om vi verkligen behöver dessa data pÄ disken om allt redan Àr duplicerat av slavar. Data kan bara gÄ förlorade om alla slavar misslyckas, och detta Àr ett problem med "brand i DC". Som en kompromiss kan du föreslÄ att spara data endast pÄ slavar, men i det hÀr fallet mÄste du se till att dessa slavar aldrig kommer att bli en master under katastrofÄterstÀllning (för detta finns en slavprioritetsinstÀllning i deras konfiguration). För oss sjÀlva funderar vi i varje specifikt fall pÄ om det Àr nödvÀndigt att spara data pÄ disken, och oftast Àr svaret "nej".

Slutsats

Sammanfattningsvis hoppas jag att jag kunde ge en allmÀn uppfattning om hur redis-cluster fungerar för dem som inte har hört talas om det alls, och Àven uppmÀrksammat nÄgra icke-uppenbara punkter för dem som har anvÀnt det under en lÄng tid.
Tack för din tid och som alltid Àr kommentarer om Àmnet vÀlkomna.

KĂ€lla: will.com

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