Det finns inga recensioner av "snabbare alternativ till Redis" pĂ„ HabrĂ© â . 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](/wp-content/uploads/2020/02/9642ef3dc712ad2e6304104facb464b7.jpeg)
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 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](/wp-content/uploads/2020/02/c0f55ca1d9f28f8c305bb74cdc77a84a.jpeg)
Enligt New Relic identifierades problemet entydigt:
![KeyDB som [potentiell] ersÀttning för Redis](/wp-content/uploads/2020/02/ce72e290f84560d143f2d6c128358477.jpeg)
HÀr Àr statistiken för operationen hÀmta i Redis:
![KeyDB som [potentiell] ersÀttning för Redis](/wp-content/uploads/2020/02/31d98a6bb2985cfbe391976e24b8a8a6.jpeg)
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 . Detta Àr en fork av Redis, utvecklad 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 , 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 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 , 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: 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](/wp-content/uploads/2020/02/8a3a168507ef75a8e1cdf69e1d30d996.jpeg)
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](/wp-content/uploads/2020/02/f46bf41bd6b8d190f5117d049ed2dce5.jpeg)
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](/wp-content/uploads/2020/02/b9e0a3103a51707628a9f500dfdd53ad.jpeg)
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](/wp-content/uploads/2020/02/0a067239194adb39eb3c3738fa73860e.jpeg)
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
