KeyDB kao [potencijalna] zamjena za Redis

Na HabrĆ©u nije bilo recenzija ā€žbrže alternative za Redisā€œ - KeyDB. PoÅ”to sam stekao relativno nedavno iskustvo u njegovom koriÅ”tenju, želio bih popuniti ovu prazninu.

KeyDB kao [potencijalna] zamjena za Redis

Pozadina je prilično banalna: jednog dana, uz veliki priliv saobraćaja, zabilježena je značajna degradacija performansi aplikacije (naime, vrijeme odziva). U to vrijeme, nažalost, nije bilo moguće izvrÅ”iti normalnu dijagnozu deÅ”avanja, pa je naknadno planiran niz testova opterećenja. Nakon Å”to smo ih sproveli, uspjeli smo otkriti usko grlo, a to je bila keÅ” baze podataka u Redis-u. Kao Å”to se često deÅ”ava, problem nije mogao da se reÅ”i odmah i na pravi način - od strane programera (promenom logike rada). Stoga se upalila radoznalost i želja da se situacija prevaziđe na zaobilazni način. Ovako se pojavio ovaj članak.

Problemi

O Redisu općenito

Kao Å”to mnogi ljudi znaju, Redis je baza podataka s jednim niti. Tačnije, ovako je u kontekstu rada sa korisničkim podacima. Uostalom, od četvrte verzije, servis, interno poslovanje Redisa prevedeno za paralelno izvođenje. Međutim, ova promjena je utjecala samo na mali dio posla, budući da najveći dio posla dolazi od korisničkih podataka.

Nebrojene kopije su razbijene na ovu temu, ali Redis programeri tvrdoglavo odbijaju implementirati potpuni paralelizam, pominjući koliko će to zakomplikovati aplikaciju i povećati režijske troÅ”kove, kao i dodati joÅ” greÅ”aka. Njihov stav je sljedeći: ako ste suočeni s jednojezgrenim problemom, imate problema sa arhitekturom aplikacije i neÅ”to treba promijeniti u njoj. Među korisnicima, međutim, postoji i ā€œdrugi taborā€ - oni koji su zaglavljeni na jednom jezgru i tvrde da Redis sam sebi stvara usko grlo. U slučaju zaista velikih opterećenja - prije ili kasnije - neizbježno je naići na ovaj problem, koji nameće značajna ograničenja arhitekturi i/ili prisilne komplikacije u njoj.

Neću ocjenjivati ​​ovo ili ono miÅ”ljenje. Umjesto toga, podijelit ću naÅ” konkretan slučaj i kako smo ga rijeÅ”ili.

NaŔ slučaj

U jednom od projekata naiÅ”li smo na činjenicu da je razvojni tim konfigurisao izuzetno agresivno keÅ”iranje podataka iz baze podataka (PostgreSQL) preko Redisa. Ovo je bio jedini način koji je, tokom iznenadnih priliva saobraćaja, spasio sam PostgreSQL i, kao rezultat, aplikaciju od smrti.

Nakon niza testova opterećenja, analizirali smo situaciju i otkrili da je Redis ograničen na jedno jezgro (ono Å”to se zove ā€œpolicaā€), nakon čega je uslijedila prilično brza degradacija aplikacije. ā€žGuÅ”enjeā€œ je bilo eksponencijalno: čim je Redisova granica performansi dostignuta, sve je prestalo da radi.

Izgledalo je otprilike ovako:

KeyDB kao [potencijalna] zamjena za Redis

Novi Relic je jasno identifikovao problem:

KeyDB kao [potencijalna] zamjena za Redis

Evo statistike za operaciju: get u Redisu:

KeyDB kao [potencijalna] zamjena za Redis

Nakon Å”to je problem detaljno prijavljen razvojnom timu, pokazalo se da se ā€žproblem trenutno ne može rijeÅ”itiā€œ. Tako je počela potraga za rjeÅ”enjem na operativnoj strani, a već spomenuti KeyDB je bio odgovor.

Međutim, prije nego Å”to započnemo naÅ” pregled, vrijedi napomenuti da projekat koristi samostalni Redis, budući da je cluster rjeÅ”enje bazirano na Sentinelu mnogo inferiornije u smislu latencije. Jedno očigledno reÅ”enje bilo je kreiranje nekoliko replika keÅ”a: i pustiti aplikaciju da ide svuda sa balansiranjem! Međutim, nakon konsultacija sa programerima, bili smo primorani da odbacimo ovu opciju zbog aktivnog i složenog mehanizma za poniÅ”tavanje predmemorije aplikacije. Isti problem se proÅ”irio i na dijeljenje keÅ”a.

Brzi pogled na KeyDB

Dok smo tražili moguće rjeÅ”enje problema, otkrili smo aplikacija pod nazivom KeyDB. Ovo je Redis fork koji je razvio Kanadska kompanija i distribuira se pod besplatnom BSD licencom. Projekat je veoma mlad: postoji od početka 2019. Njegova istorija je da su se autori takođe jednom susreli sa ograničenjima Redisa... i odlučili da naprave sopstvenu viljuÅ”ku. Å taviÅ”e, ne samo da je rijeÅ”io poznate probleme, već je dobio i dodatne funkcije koje su dostupne samo u Enterprise verziji Redisa.

Za one koji žele detaljnije da se upoznaju sa KeyDB-om, postoji dobar uvodni članak o Medium, koji predstavlja DBMS i kratke benchmarkove upoređujući ga sa njegovim ā€œroditeljemā€ - Redis-om.

Prije svega, KeyDB nas je privuklo potencijalno rjeÅ”enje naÅ”ih problema, a ujedno su nas zanimale i neke dodatne mogućnosti. KoriÅ”tenje KeyDB obećava sljedeće prednosti:

  • dobivanje punog viÅ”enitnog rada;
  • puna i apsolutna kompatibilnost sa Redis-om (ovo je bilo posebno važno za nas, jer nije bilo moguće napraviti nikakve modifikacije na strani aplikacije), Å”to je takođe obećavalo migraciju bez problema;
  • ugrađeni backup mehanizam u S3 skladiÅ”te;
  • lako implementirati aktivnu replikaciju;
  • jednostavno grupisanje i dijeljenje bez Sentinela i drugog pratećeg softvera.

ViÅ”e od 3 hiljade zvjezdica i mnogi saradnici na GitHubu također su izgledali ohrabrujuće. Aplikacija je prilično aktivno razvijena i podržana, Å”to je jasno vidljivo u commitima, komunikaciji u pitanjima, kao i zatvorenim (prihvaćenim) PR-ovima. Odgovor glavnog održavaoca na svim frontovima je uvijek prijateljski i brz. Generalno, bilo je dosta argumenata.

Migracije i rezultati

Iako je projekat migracije bio malo kockanje (zbog novine KeyDB-a), nije se moglo mnogo izgubiti. Na kraju krajeva, vraćanje promjena je prilično brzo i jednostavno - na sreću, cjelokupna infrastruktura je raspoređena u Kubernetes-u, a ugrađeni mehanizmi Rolling Update Vrlo dobro rjeÅ”avaju takve probleme.

Općenito, pripremili smo Helm Å”ablone, prebacili aplikaciju u testnom okruženju na novu bazu podataka i sve to uveli, predavÅ”i je klijentovom QA odjelu.

Počelo je testiranje koje je trajalo oko nedelju dana i u čije detalje nismo ulazili. Znamo samo da je korisnik testirao standardne funkcije rada sa Redis-om koristeći PHP drajver phpredis, a također je sprovedeno QA testiranje korisničkog interfejsa. Nakon toga smo dobili zeleno svjetlo: nuspojave u koriÅ”tenju novog softvera nisu pronađene. To je Sa stanoviÅ”ta primjene, niÅ”ta se nije promijenilo.

Vrijedi napomenuti da nismo niÅ”ta mijenjali u konfiguraciji: doslovno, jednostavno smo zamijenili koriÅ”tenu sliku. Isto važi i za praćenje i izvoz metrike u Prometheus: najčeŔći od njih radi savrÅ”eno sa KeyDB i bez ikakvih modifikacija. Dakle, možemo sa sigurnoŔću reći da je sa operativne tačke glediÅ”ta ovo jednostavno idealan potez.

Zahvaljujući svemu tome, nakon prebacivanja aplikacije na novi DBMS, ne možete niÅ”ta promijeniti, ali kao ā€œmjeru stabilizacijeā€ možete je ostaviti u ovom obliku da radi u borbi neko vrijeme. Međutim, ako želite vidjeti povećanje performansi (ili bilo kakve promjene uopće), ne smijete to zaboraviti po defaultu KeyDB parametar odgovoran za viÅ”enitnost (server-threads), jednak je jedan, tj DBMS radi potpuno isto kao Redis.

Nakon prebacivanja, testiranja i određenog vremena života na novoj aplikaciji (sa KeyDB), odlučili smo da ponovimo testiranje opterećenja sa istim parametrima koji su koriÅ”teni za Redis. Kakvi su bili njeni rezultati?..

Prema grafikonu potroŔnje CPU-a, eliminacija problema sa "plafonom" jedne jezgre odmah je postala primjetna: proces je počeo koristiti dostupne resurse:

KeyDB kao [potencijalna] zamjena za Redis

A kasnije sam pokuŔao prilično snažno da "mučim" aplikaciju i vidio sam potroŔnju do tri jezgre...

Prema New Reliću, web aplikacija u cjelini, sa istim opterećenjem, počela je da se ponaÅ”a primjetno adekvatnije. JoÅ” uvijek je uočena određena degradacija performansi, međutim, u poređenju sa sličnim grafikonom iznad, možete sami procijeniti značajan napredak:

KeyDB kao [potencijalna] zamjena za Redis

Latencija nove baze podataka (KeyDB) se također pogorÅ”ala, ali je ostala unutar prihvatljivih vrijednosti:

KeyDB kao [potencijalna] zamjena za Redis

Sljedeći grafikon jasno pokazuje da je broj zahtjeva za sam KeyDB sličan:

KeyDB kao [potencijalna] zamjena za Redis

Da sumiramo ove sintetičke testove, možemo reći da i Redis i KeyDB pokazuju značajnu degradaciju performansi u kaÅ”njenju (40 ms+) uz značajno povećanje broja paralelnih veza (1000+). U naÅ”em slučaju, web aplikacija je uspjela ā€žprotraćitiā€œ Redisovo kaÅ”njenje čak i uz manji broj konekcija (400+), iako je za KeyDB takvo opterećenje ostalo prihvatljivo.

nalazi

Ovaj primjer jasno pokazuje snagu Open Source zajednice u razvoju projekata za koje je zainteresirana. Na internetu sam naiÅ”ao na odličnu izjavu čije se opÅ”te značenje svodilo na sljedeće: ā€žNeka velika kompanija napravi zanimljiv proizvod, otvori neke od svojih funkcija, ali ostavi najvažniji dio plaćenim. Zajednica to koristi i koristi, a onda neko odustane i napravi viljuÅ”ku, implementirajući iste plaćene funkcije u nju i otvarajući ih svima.ā€ Ovdje je KeyDB isti slučaj.

Å to se tiče same migracije, koja je bila iznenađujuće jednostavna, nismo dobili toliko značajno povećanje performansi, Å”to se može očekivati ​​gledajući grafikone autora KeyDB-a... Međutim, ovo je samo naÅ” poseban slučaj, u kojem može biti mnogo odstupanja, uključujući i ozloglaÅ”enu arhitekturu aplikacije (npr. ogroman broj komandi get u Redis-u umjesto učinkovitije opcije skupnih upita mget...). Ipak, uspjeli smo postići pozitivne rezultate, a uz njih i mnoge korisne funkcije koje ćemo implementirati u bliskoj budućnosti.

Generalno, KeyDB izgleda obećavajuće: kako budemo stekli praktično iskustvo sa ovim DBMS-om (a joÅ” ga moramo steći!) i razvijamo sam projekat, razmotrićemo mogućnost da ga koristimo u drugim situacijama.

Međutim, ovaj članak ne treba smatrati vodičem (a kamoli pozivom) na akciju za Å”iroko rasprostranjeno napuÅ”tanje Redisa u korist KeyDB-a. Uprkos naÅ”em pozitivnom iskustvu, jasno je da ovo nije srebrni metak. Slučaj je bio vrlo specifičan: upravo za rjeÅ”avanje trenutnog problema u situaciji kada je to bilo potrebno učiniti brzo i uz minimalne troÅ”kove, ovo rjeÅ”enje je bilo opravdano. Hoće li KeyDB biti koristan u vaÅ”em slučaju? Sada barem znate da ova potencijalna mogućnost postoji.

PS

Pročitajte i na naŔem blogu:

izvor: www.habr.com

Kupite pouzdan hosting za sajtove sa DDoS zaÅ”titom, VPS VDS servere šŸ”„ Kupite pouzdan web hosting sa DDoS zaÅ”titom, VPS VDS servere | ProHoster