KeyDB kui [potentsiaalne] asendus Redis jaoks

Habrast ei leidunud ĂŒlevaateid "kiirematest Redis alternatiividest" — KeyDB. Saades piisavalt vĂ€rsket kogemust selle kasutamisest, soovin selle puuduse tĂ€ita.

KeyDB kui [potentsiaalne] asendus Redis jaoks

Eellugu on piisavalt banaalne: ĂŒhel pĂ€eval, kui liiklus oli suur, fikseeriti rakenduse tĂ”hususe mĂ€rkimisvÀÀrne halvenemine (tĂ€psemalt — vastamise aega). Sel ajal ei Ă”nnestunud kahjuks probleemi korralikult diagnoosida, seega planeerisime hiljem mitmeid koormusteste. PĂ€rast nende lĂ€biviimist suudeti leida kitsaskoht, mis osutus Redis'i andmebaasi vahemikuks. Nagu sageli juhtub, ei saanud probleemi lahendada kohe ja Ă”igesti — arendajate abiga (töölogika muutmise teel). SeetĂ”ttu tekkis uudishimu ja soov olukorda ringi ajada. Nii see artikkel sĂŒndis.

Probleemistik

Redis'ist ĂŒldiselt

Nagu paljudele teada, on Redis ĂŒhesuunaline andmebaas. TĂ€psemalt öeldes on see selline kasutajate andmetega töötamise kontekstis. Alates neljandast versioonist on teenuslikud, sisemised Redis toimingud tĂ”lgitud paralleelselt töötamiseks. Siiski puudutas see muudatus vaid vĂ€hest koormust, kuna peamine töö koondub kasutajate andmetele.

Sellel teemal on rikutud lugematul hulgal koopiaid, kuid Redis arendajad ei soovi kategooriliselt tĂ€isparalleelsust rakendada, tuues esile, kui keeruliseks see rakendust muudab ja kui palju toob kaasa ĂŒleliigseid kulusid ning vigade arvu kasvu. Nende seisukoht on, et kui te leiate, et teil on ĂŒhe tuuma probleem — siis probleem on rakenduse arhitektuuris ja peate seda muutma. Siiski on olemas ka 'teine leer' — need, kes on korduvate ĂŒhe tuuma probleemide juures ja vĂ€idavad, et Redis loob endale pudelikaelad. Reaalselt suurte koormuste korral — varem vĂ”i hiljem — tuleb selle probleemiga kokku puutuda, mis seab tohutuid piiranguid arhitektuurile ja/vĂ”i sunnib selle keerukust suurendama.

Ei hakka hindama ĂŒhtegi arvamust. Selle asemel jagan meie konkreetset juhtumit ja seda, kuidas me selle lahendasime.

Meie juhtum

Üks meie projektidest seisis silmitsi olukorraga, kus arendusmeeskond seadistas ÀÀrmiselt agressiivse andmete vahemĂ€lestamise PostgreSQL-ist Redis'i kaudu. See oli ainus viis, mis Ă€kiliste liiklusrĂŒnnakute ajal pÀÀstis PostgreSQL-i surmast ja seega ka rakenduse.

PĂ€rast rida koormusteste tegime olukorra analĂŒĂŒsi ja avastasime, et Redis jĂ”udis ĂŒhe tuumani (nagu öeldakse, "pulk") ning seejĂ€rel jĂ€rgnes suhteliselt kiire rakenduse halvenemine. „HĂ€da“ toimus geomeetrilise progresiooniga: niipea, kui Redis jĂ”udis jĂ”udluse piiri, lakkas kĂ”ik toimimast.

See nÀgi vÀlja umbes nii:

KeyDB kui [potentsiaalne] asendus Redis jaoks

New Relicu poolt tuvastati probleem ĂŒheselt:

KeyDB kui [potentsiaalne] asendus Redis jaoks

Aga siin on statistika operaatsiooni get Redises:

KeyDB kui [potentsiaalne] asendus Redis jaoks

PĂ€rast seda, kui probleem arendusteamile ĂŒksikasjalikult edastati, selgus, et "praegu probleemi lahendada ei saa". Nii algasid lahenduse otsingud opereerimise poolel, mille vastuseks sai juba mainitud KeyDB.

Kuid enne, kui asume selle ĂŒlevaate juurde, on oluline mainida, et projektis kasutatakse standalone Redis'i, kuna klasterpĂ”hine lahendus Sentinel'i peal on oluliselt suuremate latentsustega. Üks ilmne lahendus oleks olnud luua mitu vahemĂ€lu koopiat: ja lasta rakendusel igal pool ringi minna tasakaalustamisega! Siiski, arendajatega konsulteerides olime sunnitud selle variandi loobuma, kuna rakendusel on aktiivne ja keeruline vahemĂ€lu tĂŒhistamise mehhanism. Sama probleem kehtis ka vahemĂ€lu jagamise kohta.

Kiire ĂŒlevaade KeyDB-st

Otsides vĂ”imalikke lahendusi probleemile, avastasime rakenduse nimega KeyDB. See on Redis'i fork, mille on vĂ€lja töötanud Kanada ettevĂ”te ja mida jagatakse BSD vaba litsentsi alusel. Projekt on ĂŒsna noor: see on eksisteerinud alates 2019. aastast. Selle ajaloo kohaselt on autorid samuti kunagi kokku puutunud Redis'i piirangutega... ja otsustasid teha oma forki. Ja see ei lahendanud mitte ainult tuntud probleeme, vaid sai ka lisa omadusi, mis on saadaval ainult Redis'i ettevĂ”tte versioonis.

Need, kes soovivad KeyDB-st rohkem teada saada, saavad lugeda head sissejuhatavat artiklit Mediumis, mis esindab andmebaasi ja lĂŒhikesi benchmark'e, vĂ”rreldes seda oma «vanemaga» — Redis.

Esiteks, meid tÔi KeyDB potentsiaalne lahendus meie probleemidele ning olid huvitavad ka mÔned lisafunktsioonid. KeyDB kasutamine lubas jÀrgmisi eeliseid:

  • tĂ€ielik mitme protsessi tugi;
  • tĂ€ielik ja absoluutne ĂŒhilduvus Redis'iga (meie jaoks oli see eriti oluline, sest rakenduse poolt muudatuste tegemine polnud vĂ”imalik), mis lubas ka probleemideta migratsiooni;
  • sisseehitatud varundamismehhanism S3-hoidlas;
  • lihtne rakendada aktiivne replikatsioon;
  • lihtne rĂŒhmamine ja jaotamine ilma Sentinel'i ja muu abiprogrammita.

Rohkem kui 3000 tĂ€hte ja palju kaastöötajaid GitHub'is nĂ€gid samuti lootustandvad vĂ€lja. Rakendus areneb ja toetatakse piisavalt aktiivselt, mida on hĂ€sti mĂ€rgata commit'ide, probleemide arutelude ja suletud (vastu vĂ”etud) PR'ide pĂ”hjal. Peamine hooldaja reageerib alati kĂ”ikidel rindel sĂ”bralikult ja kiiresti. Üldiselt osutus argumente olevat kĂŒllaga.

Migratsioon ja tulemused

Kuigi migratsiooniprojekt oli omamoodi seiklus (tĂ€nu KeyDB uudsusele), polnud meil tegelikult midagi kaotada. Muudatuste tagasivĂ”tmine on piisavalt kiire ja lihtne — Ă”nneks on kogu infrastruktuur ĂŒles seatud Kuberneteses ning sisseehitatud mehhanismid Rolling Update lahendavad sellised ĂŒlesanded suurepĂ€raselt.

KokkuvĂ”ttes valmisime Helm-mallid, lĂŒlitasime rakenduse testkeskkonnas uuele andmebaasile ja tĂ”ime selle kĂ”ik vĂ€lja, et anda QA-osakonnale kliendi kĂ€tte.

Algas testimine, mis kestis umbes nĂ€dala ja mille detailidesse me ei sĂŒĂŒvinud. Meil on teada vaid, et tellija kontrollis Redis'e pĂ”hifunktsioone PHP-draiveri abil phpredis, samuti teostas kasutajaliidese QA-testimist. PĂ€rast seda sai meilt roheline tuli: uusi tarkvara kasutamisel ei leitud mingeid kĂ”rvaltoimeid. See tĂ€hendab, et rakenduse seisukohalt ei muutunud ĂŒldse midagi.

Tasub mainida, et me ei teinud ka konfiguratsioonis mingeid muudatusi: lihtsalt — vahetasime kasutatava pildi. Sama kehtib ka jĂ€lgimise ja metrikate eksportimise kohta Prometheuses: kĂ”ige levinum neist töötab suurepĂ€raselt KeyDB-ga ilma igasuguste muudatusteta. Seega vĂ”ib rahulikult öelda, et ka kasutusmugavuse seisukohalt on see ideaalne ĂŒleminek.

KĂ”ige selle tĂ”ttu, pĂ€rast rakenduse suunamist uuele andmebaasitarkvarale ei pea midagi muutma ja stabiliseerimise meetmena vĂ”ib jĂ€tta selle kujul töötama mingiks ajaks. Siiski, kui soovite nĂ€ha jĂ”udluse kasvu (vĂ”i vĂ€hemalt mingit muutust), Ă€rge unustage, et vaikimisi KeyDB parameeter, mis vastutab mitme lĂ”ime eest (server-threads), on vĂ”rdne ĂŒhega, st andmebaas töötab tĂ€pselt nagu Redis..

PĂ€rast ĂŒleminekut, testimist ja mĂ”ningast elu uut rakendust (KeyDB-ga) otsustasime korrata koormustestimist samade parameetritega, mida kasutati Redis'e jaoks. Millised olid selle tulemused?..

CPU tarbimise graafikul oli kohe nĂ€htav ĂŒhte tuuma ‘lae’ probleemide kĂ”rvaldamine: protsess hakkas kasutama saadaval olevaid ressursse:

KeyDB kui [potentsiaalne] asendus Redis jaoks

Hiljem proovisin ĂŒsna korralikult rakendust ‘piinata’ ja nĂ€gin tarbimist kuni kolme tuumani...

New Relici andmete kohaselt kĂ€itub veebirakendus kokkuvĂ”ttes, olles sama koormuse all, mĂ€rgatavalt paremini. MĂ”ningast jĂ”udluse halvenemist siiski tĂ€heldati, kuid vĂ”rreldes ĂŒlaltoodud sarnase graafikuga, vĂ”ite ise hinnata olulist edusammu:

KeyDB kui [potentsiaalne] asendus Redis jaoks

Uue andmebaasi (KeyDB) latentsus on samuti halvenenud, kuid jÀi lubatavate vÀÀrtuste piiridesse:

KeyDB kui [potentsiaalne] asendus Redis jaoks

JÀrgmise graafiku pÔhjal on selgelt nÀha, et pÀringute arv KeyDB-le on sarnane:

KeyDB kui [potentsiaalne] asendus Redis jaoks

KokkuvĂ”ttes nende sĂŒnteetiliste testide pĂ”hjal vĂ”ib öelda, et nii Redis kui ka KeyDB nĂ€itavad mĂ€rkimisvÀÀrset jĂ”udluse halvenemist latentsuse osas (40 ms+) koos oluliselt suureneva paralleelsete ĂŒhenduste arvuga (1000+). Meie juhul suudeti veebirakendusel Redis'i latentsust madalamana hoida isegi vĂ€iksema ĂŒhenduste arvuga (400+), kuigi KeyDB jaoks jĂ€i selline koormus vastuvĂ”etavaks.

JĂ€reldused

Selles nĂ€ites on suurepĂ€raselt nĂ€ha Open Source’i kogukonna mĂ”ju projektide arengus, milles nad on huvitatud. Internetis olen kohanud toredat ĂŒtlust, mille peamine mĂ”te oli jĂ€rgmine: „MĂ”ni suur ettevĂ”te loob huvitava toote, avab osa selle funktsioonidest, kuid jĂ€tab kĂ”ige olulisema osa tasuliseks. Kogukond kasutab seda, kuni keegi loob fork'i, rakendades seal need tasulised funktsioonid ja avades need kĂ”igile.” Just niimoodi on KeyDB — see on selline juhtum.

Mis puutub aga migratsiooni, siis see lĂ€ks ĂŒllatavalt lihtsalt ja me ei saanud nii suurt tĂ”usu jĂ”udluses, nagu oleks oodata, vaadates KeyDB autorite graafikuid... Siiski on see vaid meie erijuhtum, kus vĂ”ivad esineda mitmed kĂ”rvalekalded, sealhulgas ka kurikuulus rakenduse arhitektuur (nĂ€iteks tohutu hulk kĂ€ske get Redis’s, selle asemel, et kasutada paremat aggregeeritud pĂ€ringute varianti mget
KĂŒll aga on Ă”nnestunud saavutada positiivseid tulemusi, koos nendega ka hulk kasulikke funktsioone, mida me plaanime lĂ€hitulevikus rakendada.

Üldiselt nĂ€eb KeyDB vĂ€lja lubav: kui saame praktiseerida selle andmebaasi kasutamist (mida on veel ees!) ning arendada ise projekti, vaatame vĂ”imalust selle rakendamiseks ka teistes olukordades.

Kuid Ă€rge kĂ€sitage seda artiklit juhisena (veel vĂ€hem kutse tegevusele) Redis'i tĂ€ielikuks loobumiseks KeyDB kasuks. Hoolimata meie positiivsest kogemusest on selge, et see ei ole hĂ”bedane kuul. Juhtum oli vĂ€ga spetsiifiline: antud juhul, kus lahendus oli vajalik kiiresti ja minimaalseid kulusid silmas pidades, Ă”igustas see ennast. Kas KeyDB on teie puhul kasulik? VĂ€hemalt teate nĂŒĂŒd, et selline potentsiaalne vĂ”imalus eksisteerib.

P.S.

Lugege ka meie blogist:

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster