KeyDB som [potentiell] ersÀttning för Redis

Det finns inga recensioner av "snabbare alternativ till Redis" pĂ„ HabrĂ© — KeyDB. Efter att ha fĂ„tt tillrĂ€ckligt med fĂ€rsk erfarenhet av dess anvĂ€ndning vill jag fylla denna lucka.

KeyDB som [potentiell] ersÀttning för Redis

Bakgrunden Ă€r ganska banal: en gĂ„ng, nĂ€r vi hade en stor trafikökning, registrerades en betydande prestationsdegradering av applikationen (specifikt svarstiden). Vid den tidpunkten lyckades vi tyvĂ€rr inte genomföra en ordentlig diagnos av vad som hĂ€nde, sĂ„ vi planerade senare att utföra flera belastningstester. Efter dessa tester upptĂ€ckte vi flaskhalsen, som visade sig vara Redis databasens cache. Som det ofta Ă€r fallet, kunde problemet inte lösas omedelbart och pĂ„ rĂ€tt sĂ€tt — med hjĂ€lp av utvecklarna (genom att Ă€ndra logiken). DĂ€rför satte nyfikenheten och viljan att (ovĂ€ntat) lösa situationen igĂ„ng. SĂ„ hĂ€r föddes denna artikel.

ProblemomrÄdet

Om Redis i allmÀnhet

Som mĂ„nga vet Ă€r Redis en enda trĂ„dad databas. För att vara mer exakt, Ă€r den sĂ„ i sammanhanget med anvĂ€ndardata. FrĂ„n och med version fyra klarar Redis översatte av parallell exekvering. ÄndĂ„ pĂ„verkade denna förĂ€ndring bara en liten del av belastningen, eftersom det mesta av arbetet handlar om anvĂ€ndardata.

Det har skrivits otaliga artiklar om detta Ă€mne, men Redis-utvecklarna vill envist inte införa riktig parallellitet, med hĂ€nvisning till hur mycket det skulle komplicera applikationen och öka overhead-kostnaderna, samt leda till fler buggar. Deras stĂ„ndpunkt Ă€r att om du stöter pĂ„ single-core problemet — har du problem med applikationens arkitektur och det finns nĂ„got som behöver Ă€ndras. Bland anvĂ€ndarna finns det dock ocksĂ„ "den andra sidan" — de som fastnat i en kĂ€rna och hĂ€vdar att Redis sjĂ€lva skapar flaskhalsar. Vid verkligt stora belastningar — kommer man раtt раtt att раtt stötas mot detta problem, vilket sĂ€tter betydande begrĂ€nsningar pĂ„ arkitekturen och/eller tvingar till kompliceringar i den.

Jag kommer inte att ge nÄgon bedömning av olika Äsikter. IstÀllet vill jag dela med mig av vÄrt specifika fall och hur vi löste det.

VÄr case study

Vid ett av projekten stötte vi pÄ problemet att utvecklingsteamet hade konfigurerat extremt aggressiv cachelagring av data frÄn databasen (PostgreSQL) via Redis. Detta var den enda vÀgen som under kraftiga trafiktoppar rÀddade PostgreSQL frÄn att krascha och dÀrmed Àven applikationen.

Efter en serie belastningstester genomförde vi en analys av situationen och upptÀckte att Redis kördes pÄ en enda kÀrna (det som kallas "i kö"), vilket snabbt ledde till en försÀmring av applikationen. "KvÀvningen" hade en geometrisk progression: sÄ fort prestandagrÀnsen för Redis nÄddes, slutade allt att fungera.

Det sÄg ungefÀr ut sÄ hÀr:

KeyDB som [potentiell] ersÀttning för Redis

Enligt New Relic identifierades problemet entydigt:

KeyDB som [potentiell] ersÀttning för Redis

HÀr Àr statistiken för operationen hÀmta i Redis:

KeyDB som [potentiell] ersÀttning för Redis

Efter att problemet hade redogjorts för utvecklarna i detalj framkom det att "problemet inte kan lösas just nu". SÄ började letandet efter en lösning pÄ driftssidan, och svaret blev den redan nÀmnda KeyDB.

Innan vi gÄr vidare med en översikt mÄste vi nÀmna att projektet anvÀnder standalone Redis, eftersom en klusterlösning baserad pÄ Sentinel har betydligt lÀngre fördröjningar (latency). En uppenbar lösning var att skapa flera repliker av cachen: och lÄt applikationen sprida sig överallt med lastbalansering! Men efter att ha diskuterat med utvecklarna tvingades vi överge detta alternativ pÄ grund av den aktiva och komplexa cacheinvalidationsmekanismen i applikationen. Samma problem gÀllde Àven shardningen av cachen.

En snabb översikt av KeyDB

I jakten pĂ„ en möjlig lösning av problemet upptĂ€ckte vi en applikation kallad KeyDB. Detta Ă€r en fork av Redis, utvecklad av ett kanadensiskt företag och distribueras under en öppen BSD-licens. Projektet Ă€r ganska ungt: det har funnits sedan början av 2019. Historien Ă€r att dess skapare ocksĂ„ en gĂ„ng stötte pĂ„ begrĂ€nsningar hos Redis
 och beslutade att göra sin egen fork. Dessutom har den inte bara löst kĂ€nda problem utan ocksĂ„ fĂ„tt ytterligare funktioner som bara Ă€r tillgĂ€ngliga i enterprise-versionen av Redis.

För den som vill lĂ€ra sig mer om KeyDB finns det en bra introduktionsartikel pĂ„ Medium, som presenterar databashanteringssystemet och korta benchmarkingresultat som jĂ€mför det med sin "förĂ€lder" — Redis.

Först och frÀmst drogs vi till KeyDB som en potentiell lösning pÄ vÄra problem, och vi var ocksÄ intresserade av nÄgra ytterligare funktioner. AnvÀndningen av KeyDB lovade följande fördelar:

  • att fĂ„ riktig multitrĂ„dad bearbetning;
  • full och absolut kompatibilitet med Redis (för oss var detta sĂ€rskilt viktigt, eftersom det inte var möjligt att göra nĂ„gra Ă€ndringar frĂ„n applikationen), vilket lovade en problemfri migration;
  • inbyggd backupmekanism till S3-lagring;
  • enkel att implementera aktiv replikering;
  • enkel klustring och sharding utan Sentinel eller annan stödprogramvara.

Över 3000 stjĂ€rnor och mĂ„nga bidragsgivare pĂ„ GitHub sĂ„g ocksĂ„ lovande ut. Applikationen utvecklas och underhĂ„lls ganska aktivt, vilket tydligt mĂ€rks genom commit, kommunikation i issues, samt stĂ€ngda (godkĂ€nda) PR. Svaren frĂ„n den huvudsakliga underhĂ„llaren Ă€r alltid vĂ€nliga och snabba. Sammanfattningsvis var argumenten tillrĂ€ckligt mĂ„nga.

Migration och resultat

Även om migrationsprojektet var en sorts Ă€ventyr (pĂ„ grund av nyheten i KeyDB), hade vi inte mycket att förlora. Att rulla tillbaka förĂ€ndringar Ă€r ganska snabbt och enkelt – tack vare att hela infrastrukturen Ă€r distribuerad i Kubernetes, och de inbyggda mekanismerna Rolling Update lösar sĂ„dana uppgifter utmĂ€rkt.

Sammanfattningsvis förberedde vi Helm-mallar, bytte applikationen i testmiljön till den nya databasen och rullade ut allt detta, vilket gavs till kundens QA-avdelning.

Testningen började och pÄgick i cirka en vecka, och vi gick inte in pÄ detaljerna. Vi vet bara att kunden testade de standardfunktioner som Redis erbjuder med hjÀlp av PHP-drivrutinen phpredis, och genomförde ocksÄ QA-testning av anvÀndargrÀnssnittet. Efter detta fick vi grönt ljus: inga biverkningar upptÀcktes vid anvÀndningen av den nya programvaran. Det vill sÀga i applikationens perspektiv förÀndrades ingenting överhuvudtaget..

Det Ă€r vĂ€rt att nĂ€mna att vi inte heller Ă€ndrade nĂ„got i konfigurationen: bokstavligen – vi bytte bara den anvĂ€nda imagen. Detsamma gĂ€ller för övervakning och export av mĂ€tdata till Prometheus: den mest anvĂ€nda av dem fungerar utmĂ€rkt med KeyDB utan nĂ„gra Ă€ndringar. SĂ„ledes kan vi tryggt sĂ€ga att det ur driftsynpunkt Ă€r en perfekt övergĂ„ng.

Tack vare allt detta, efter att ha vÀxlat applikationen till den nya databashanteraren kan man lÄta den vara som den Àr som en "stabiliseringsÄtgÀrd" och lÄta den arbeta i realtid en tid. Men om du vill se en prestandaförbÀttring (eller överhuvudtaget nÄgra förÀndringar) fÄr du inte glömma att standard parametern KeyDB, som ansvarar för flerkörning (server-threads), Àr instÀlld pÄ ett, vilket innebÀr att databashanteraren fungerar precis som Redis..

Efter att ha bytt, testat och haft en viss tid pÄ det nya programmet (med KeyDB) bestÀmde vi oss för att upprepa belastningstestningen med samma parametrar som anvÀndes för Redis. Vad blev resultaten?..

UtifrÄn CPU-anvÀndningsgrafen blev det snabbt tydligt att problemen med "taket" vid ett kÀrn har försvunnit: processen började anvÀnda de tillgÀngliga resurserna:

KeyDB som [potentiell] ersÀttning för Redis

Jag försökte sedan att verkligen "quÀsta" applikationen och sÄg konsumtion upp till tre kÀrnor...

Enligt New Relic upptrÀdde webbapplikationen i stort sett, med samma belastning, betydligt mer adekvat. Viss prestandaförsÀmring observerades ÀndÄ, men jÀmfört med den motsvarande grafen ovan kan du sjÀlv bedöma den betydande framsteg:

KeyDB som [potentiell] ersÀttning för Redis

FörseningsmÄttet pÄ den nya databasen (KeyDB) försÀmrades ocksÄ, men förblev inom acceptabla grÀnser:

KeyDB som [potentiell] ersÀttning för Redis

Den följande grafen visar tydligt att antalet förfrÄgningar till sjÀlva KeyDB Àr likadant:

KeyDB som [potentiell] ersÀttning för Redis

Sammanfattningsvis av dessa syntetiska tester kan man sÀga att bÄde Redis och KeyDB visar betydande prestandaförsÀmringar i latens (40 ms+) vid en avsevÀrd ökning av antalet parallella anslutningar (1000+). I vÄrt fall lyckades webbapplikationen "pressa" latensen hos Redis Àven vid ett lÀgre antal anslutningar (400+), Àven om denna belastning förblev acceptabel för KeyDB.

Slutsatser

I det hÀr exemplet syns tydligt styrkan hos Open Source-gemenskapen nÀr det gÀller utvecklingen av projekt som den Àr intresserad av. PÄ internet har jag stött pÄ ett utmÀrkt uttalande vars huvudsakliga budskap gÄr ut pÄ följande: "Ett stort företag skapar en intressant produkt, gör en del av dess funktioner öppna, men hÄller den viktigaste delen betalad. Gemenskapen anvÀnder det, och sedan slÀpper nÄgon pÄ ett kort och gör en fork, dÀr de implementerar just de betalade funktionerna och öppnar dem för alla." HÀr Àr KeyDB - det Àr det hÀr fallet.

NĂ€r det gĂ€ller sjĂ€lva migreringen, som gick förvĂ„nansvĂ€rt enkelt, fick vi inte sĂ„ mycket en betydande ökning av prestanda, som man kan förvĂ€nta sig, baserat pĂ„ KeyDB:s författares diagram... Men detta Ă€r bara vĂ„rt specifika fall, dĂ€r det kan finnas mĂ„nga avvikelser, Ă€ven nĂ€r det gĂ€ller den beryktade applikationsarkitekturen (till exempel ett stort antal kommandon hĂ€mta i Redis istĂ€llet för det mer prestandaeffektiva alternativet med aggregerade förfrĂ„gningar mget
). Trots detta har vi lyckats uppnĂ„ positiva resultat, och tillsammans med dem - mĂ„nga anvĂ€ndbara funktioner som vi fortfarande bara kommer att implementera inom kort.

Övergripande verkar KeyDB lovande: nĂ€r vi fĂ„r praktisk erfarenhet av att arbeta med denna databas (som vi fortfarande bara ska samla pĂ„ oss!) och projektet sjĂ€lv utvecklas, kommer vi att övervĂ€ga möjligheten att anvĂ€nda den i andra situationer.

Men den hĂ€r artikeln bör inte ses som en vĂ€gledning (och Ă€n mindre som en uppmaning) till att överallt avskaffa Redis till förmĂ„n för KeyDB. Trots vĂ„r positiva erfarenhet Ă€r det uppenbart att det inte Ă€r en silverkula. Fallet var mycket specifikt: specifikt för att lösa ett akut problem i en situation dĂ€r det behövdes göras snabbt och med minimala kostnader, har detta alternativ visat sig vara giltigt. Kommer KeyDB att vara anvĂ€ndbart i ditt fall? Åtminstone vet du nu att denna potentiella möjlighet finns.

P.S.

LÀs Àven i vÄr blogg:

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