KeyDB kui [potentsiaalne] asendus Redis'ile

Habr's reviews of "a faster alternative to Redis" are missing — KeyDB. After gaining sufficient recent experience with its use, I wanted to fill this gap.

KeyDB kui [potentsiaalne] asendus Redis'ile

The backstory is quite mundane: once, during a surge in traffic, significant application performance degradation was recorded (specifically — response times). At that time, unfortunately, it was not possible to conduct a proper diagnosis of what was happening, so we subsequently planned a series of load tests. After conducting these tests, we were able to identify the bottleneck, which was the database cache in Redis. As is often the case, the problem could not be solved instantly and correctly — by the developers (by changing the working logic). This sparked curiosity and a desire to tackle the situation through alternative means. Thus, this article came to be.

Problemaatika

About Redis in general

As many know, Redis is a single-threaded database. To be precise, it is in this context when dealing with user data. Since version four, Redis has moved internal operations to parallel execution. However, this change has only affected a small portion of the load, as most operations are related to user data.

Countless opinions have been formed on this topic, but Redis developers stubbornly do not want to implement full parallelism, citing how much it complicates the application and increases overhead costs, as well as introducing more bugs. Their stance is: if you are facing a single-core issue — then you have problems with your application architecture and something needs to change in it. Among users, however, there is also "another camp" — those who have hit a wall with a single core and assert that Redis themselves create a bottleneck. In the case of really high loads — sooner or later — you will inevitably encounter this issue, which imposes significant limitations on the architecture and/or forces complications within it.

I will not evaluate any opinion. Instead, I will share our specific case and how we resolved it.

Our case

Ühes meie projektidest kohtasime olukorda, kus arendustiim seadistas andmebaasi (PostgreSQL) andmete jaoks ÀÀrmiselt agressiivse vahemĂ€lu (cache) Redis'i kaudu. See oli ainus viis, mille abil teravate liiklusvoogude ajal pÀÀsteti PostgreSQL ise ja seega ka rakendus eluga.

PĂ€rast jĂ€rjestikuseid koormusteste viisime lĂ€bi olukorra analĂŒĂŒsi ja avastasime, et Redis töötas ĂŒhes tuumas (nagu öeldakse, "puuri sees"), misjĂ€rel jĂ€rgnes ĂŒsna kiire rakenduse halvenemine. "Uputamine" toimus geomeetrilise progresiooniga: niipea, kui Redis'i jĂ”udluse limiit saavutati, lakkas kĂ”ik olemast.

See nÀgi vÀlja umbes nii:

KeyDB kui [potentsiaalne] asendus Redis'ile

New Relici poolt tuvastati probleem ĂŒheselt:

KeyDB kui [potentsiaalne] asendus Redis'ile

Ja siin on statistika operatsiooni get Redis'is:

KeyDB kui [potentsiaalne] asendus Redis'ile

PĂ€rast seda, kui probleem detaliseeritult arendustiimile edastati, selgus, et "hetkel ei saa probleemi lahendada". Nii algasid lahenduse otsingud halduspoolel ja vastusena leidus juba mainitud KeyDB.

Kuid enne, kui asume selle ĂŒlevaate juurde, tasub mainida, et projektis kasutatakse iseseisvat Redis't, kuna klastrilahendus Sentinel'i pĂ”hjal on latentsuse osas oluliselt kehvem. Üks ilmne lahendus oleks olnud luua mitu vahemĂ€lu koopiat: ja lasta rakendusel liikuda igal pool koormuse tasakaalustamisega! Kuid pĂ€rast arendajatega arutlemist pidime selle variandi kĂ”rvale heitma arvestades rakenduse aktiivset ja keerukat vahemĂ€lu kehtetuks kuulutamise mehhanismi. Sama probleem ulatus ka vahemĂ€lu jagamisele.

KeyDB kiire ĂŒlevaade

Otsides vĂ”imalikke lahendusi probleemile, avastasime rakenduse nimega KeyDB. See on Redis'e fork, mille on arendanud Kanada ettevĂ”tte ja see on vabalt levitatav BSD litsentsi alusel. Projekt on ĂŒsna noor: see on eksisteerinud alates 2019. aastast. Selle ajalugu on selline, et autorid kohtasid omal ajal ka Redis'i piiranguid... ja otsustasid teha oma forki. Ning see ei lahendanud mitte ainult tuntud probleeme, vaid omandas ka lisafunktsioone, mis on saadaval ainult Redis'e ettevĂ”tteversioonis.

Neile, kes soovivad rohkem teada saada KeyDB-st, on olemas hea alustav artikkel Medium'is, mis tutvustab andmebaasi ja lĂŒhikesi benchmark'e, mis vĂ”rdlevad seda selle "vanemaga" — Redis'iga.

Esiteks köitis meid KeyDB potentsiaalne lahendus meie probleemidele, samuti huvitusid meid mÔned lisafunktsioonid. KeyDB kasutamine lubas jÀrgmisi eeliseid:

  • tĂ€isvÀÀrtuslik multithreading;
  • tĂ€ielik ja absoluutne ĂŒhilduvus Redisiga (meie jaoks oli see eriti oluline, kuna rakenduse poolel mingeid kohandusi teha ei olnud vĂ”imalik), mis tĂ”otas ka probleemideta migratsiooni;
  • sisseehitatud varundusmehhanism S3 salvestusse;
  • lihtne rakendada active-replikatsioon;
  • lihtne klasterdamine ja sharding ilma Sentinel'i ja muu abivahendita.

Rohkem kui 3000 tĂ€hte ja palju koostööpartnereid GitHubis nĂ€gid samuti lootustandvad vĂ€lja. Rakendus arendatakse ja toetatakse aktiivselt, mida on hĂ€sti nĂ€ha commit'ide, suhtluse issues ja samuti suletud (aktsepteeritud) PR-idest. PĂ”hihalduri tagasiside on alati sĂ”bralik ja kiire. Üldiselt oli argumente piisavalt.

Migratsioon ja tulemused

Kuigi migratsiooniprojekt oli omamoodi riskialti ettevĂ”tmine (KDB uudsuse tĂ”ttu), ei olnud meil eriti midagi kaotada. LĂ”ppude lĂ”puks oli muudatusi ĂŒsna lihtne ja kiire tagasi tagasi rullida — kuna kogu infrastruktuur on ĂŒles ehitatud Kuberneteses ning sisseehitatud mehhanismid Rolling Update lahendavad sellised ĂŒlesanded suurepĂ€raselt.

Valmistame ette Helm-malle, lĂŒlitasime rakenduse testkeskkonnas uuele andmebaasile ja viisime kĂ”ik vĂ€lja, andes ĂŒle kliendi QA-osakonnale.

Alustati testimist, mis kestis umbes nĂ€dal ja mille detailidesse me ei sĂŒvenenud. Meile on teada, et klient testis Redisiga töötamiseks standardseid funktsioone PHP draiveri phpredis, samuti viis lĂ€bi kasutajaliidese QA testimise. PĂ€rast seda anti meile roheline tuli: uusi tarkvarasid kasutades ei leitud mingeid kĂ”rvaltoimeid. Nii et rakenduse seisukohalt ei ole ĂŒldse midagi muutunud.

Tuleb mĂ€rkida, et ka konfiguratsioonis me midagi ei muutnud: lihtsalt — asendasime kasutatava pildi. Sama kehtib ka monitorimise ja metrikate ekspordi kohta Prometheuses: kĂ”ige levinum neist töötas suurepĂ€raselt KeyDB-ga ja ilma igasuguste tĂ€iendusteta. Seega vĂ”ib julgelt öelda, et ka töökeskkonna seisukohalt on see lihtsalt ideaalne ĂŒleminek.

TĂ€nu sellele saab rakendust uue andmebaasi sĂŒsteemi (SUS) korralikku tööle jĂ€tta ilma muudatusteta, ning kui soovite seda kasutada "stabiliseerimise meetmena", vĂ”ite jĂ€tta selle selliseks ja lasta tal mĂ”nda aega tootmisreĆŸiimis töötada. Siiski, kui soovite nĂ€ha jĂ”udluse paranemist (vĂ”i ĂŒldse mingeid muudatusi), tuleb meeles pidada, et vaikimisi KeyDB parameeter, mis vastutab mitme lĂ”ime eest (server-threads), on ĂŒks, mis tĂ€hendab, et SUS töötab tĂ€pselt samamoodi nagu Redis..

PĂ€rast ĂŒleminekut, testimist ja teatud aega uue rakendusega (KeyDB) otsustasime korrata koormustestimist samade parameetritega, mida kasutati Redis’e jaoks. Millised olid tulemused?..

CPU tarbimise graafikult oli kohe nĂ€ha, et probleem "ĂŒhe tuuma lae" elimineerimisega on lahendatud: protsess hakkas kasutama saadaval olevaid ressursse:

KeyDB kui [potentsiaalne] asendus Redis'ile

Ja hiljem proovisin ma rakendust ĂŒsna intensiivselt "piinata" ja nĂ€gin tarbimist kuni kolme tuuma ulatuses...

New Relici nÀitude kohaselt kÀitus veebirakendus kogu koormuse juures mÔistlikumalt. Teatud jÔudluse langust siiski tÀheldati, kuid vÔrreldes eespool toodud graafikuga saate ise hinnata olulisi edusamme:

KeyDB kui [potentsiaalne] asendus Redis'ile

Uue andmebaasi (KeyDB) latentsuse nÀitaja halvenes samuti, kuid jÀi vastuvÔetavate piiride sisse:

KeyDB kui [potentsiaalne] asendus Redis'ile

JÀrgmise graafiku pÔhjal on hÀsti nÀha, et pÀringute arv KeyDB-s on sarnane:

KeyDB kui [potentsiaalne] asendus Redis'ile

KokkuvĂ”tteks nende sĂŒnteetiliste testide pĂ”hjal vĂ”ib öelda, et nii Redis kui KeyDB nĂ€itavad oluliselt halvenenud jĂ”udlust latentsuses (40 ms+) suure paralleelsete ĂŒhenduste arvu (1000+) juures. Meie juhul suutis veebirakendus "langetada" Redis'e latentsust madalama ĂŒhenduste arvuga (400+), kuigi KeyDB selline koormus jÀÀb endiselt vastuvĂ”etavaks.

JĂ€reldused

Antud nĂ€ites on selgelt nĂ€ha Open Source kogukonna jĂ”ud projektide arengus, milles see on huvitatud. Internetis olen kohanud suurepĂ€rast vĂ€idet, mille ĂŒldine mĂ”te oli jĂ€rgmine: "MĂ”ni suur ettevĂ”te loob huvitava toote, teeb osa selle funktsioone avatuks, kuid kĂ”ige olulisema osa jĂ€tab tasuliseks. Kogukond kasutab ja kasutab, kuni keegi ei viitsi enam ning teeb fork'i, rakendades seal need tasulised funktsioonid ja avades need kĂ”igile." Siin on KeyDB - see on tĂ€pselt see juhtum.

RÀÀkides aga ise migreerimisest, mis toimus ĂŒllatavalt lihtsalt, ei saanud me niivĂ”rd olulist jĂ”udluse kasvu, mida oleks oodata autori KeyDB graafikute vaatamise pĂ”hjal... Siiski, see on vaid meie erijuhtum, kus vĂ”ib olla palju kĂ”rvalekaldeid, sealhulgas kurikuulus rakenduse arhitektuur (nĂ€iteks tohutult palju kĂ€ske get Redis, mitte rohkem jĂ”udlusele suunatud kogutud pĂ€ringute variandi juures mget
). Siiski, positiivsete tulemuste saavutamine Ă”nnestus ning koos nendega - palju kasulikke funktsioone, mida me alles kavandame lĂ€hitulevikus rakendada.

Üldiselt paistab KeyDB lubav: praktilise kogemuse saamisel selle andmebaasi kasutamisel (mida peab veel omandama!) ja projekti arendamise kĂ€igus kaalume selle rakendamise vĂ”imalust ka teistes olukordades.

Kuid seda artiklit ei peaks pidama juhendiks (ja veel vĂ€hem - kutseks) tegevusele Redisest KeyDB-le ĂŒlemineku osas. Vaatamata meie positiivsele kokemusele on selge, et see ei ole hĂ”bepadrun. Juhtum oli vĂ€ga spetsiifiline: konkreetselt kiire lahenduse leidmiseks olukorras, kus tuli toimida kiiresti ja minimaalsete kuludega, Ă”igustas see lahendust. Kas KeyDB on teie puhul kasulik? Igatahes te now, et see potentsiaalne vĂ”imalus olemas on.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster