Na HabrĆ©u nije bilo recenzija ābrže alternative za Redisā - . PoÅ”to sam stekao relativno nedavno iskustvo u njegovom koriÅ”tenju, želio bih popuniti ovu prazninu.
![KeyDB kao [potencijalna] zamjena za Redis](/wp-content/uploads/2020/02/9642ef3dc712ad2e6304104facb464b7.jpeg)
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 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](/wp-content/uploads/2020/02/c0f55ca1d9f28f8c305bb74cdc77a84a.jpeg)
Novi Relic je jasno identifikovao problem:
![KeyDB kao [potencijalna] zamjena za Redis](/wp-content/uploads/2020/02/ce72e290f84560d143f2d6c128358477.jpeg)
Evo statistike za operaciju: get u Redisu:
![KeyDB kao [potencijalna] zamjena za Redis](/wp-content/uploads/2020/02/31d98a6bb2985cfbe391976e24b8a8a6.jpeg)
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 . Ovo je Redis fork koji je razvio 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 , 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 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 , 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: 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](/wp-content/uploads/2020/02/8a3a168507ef75a8e1cdf69e1d30d996.jpeg)
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](/wp-content/uploads/2020/02/f46bf41bd6b8d190f5117d049ed2dce5.jpeg)
Latencija nove baze podataka (KeyDB) se takoÄer pogorÅ”ala, ali je ostala unutar prihvatljivih vrijednosti:
![KeyDB kao [potencijalna] zamjena za Redis](/wp-content/uploads/2020/02/b9e0a3103a51707628a9f500dfdd53ad.jpeg)
SljedeÄi grafikon jasno pokazuje da je broj zahtjeva za sam KeyDB sliÄan:
![KeyDB kao [potencijalna] zamjena za Redis](/wp-content/uploads/2020/02/0a067239194adb39eb3c3738fa73860e.jpeg)
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
