În prezent, industria IT abundă de termeni precum NoSQL, Big Data sau NewSQL. De multe ori, persoanele cu putere decizonală au dificultăți în alegerea soluției potrivite. În condițiile în care soluțiile clasice - bazele de date relaționale sunt folosite de mai bine de două decenii, de ce ar trebui încercate soluțiile alternative? Marile companii apelează deja de câțiva ani la soluțiile alternative ceea ce le permite să economisească bani, să inoveze rapid și să ajungă cu produsele finale pe piață mult mai repede decât o făceau înainte. Scopul acestui articol e să prezinte soluția NoSQL bazată pe documente, care este Couchbase. Pe lângă detaliile tehnice se vor găsi și motivele pentru care această tehnologie merită să fie aleasă și câteva exemple de proiecte în care Couchbase este folosit cu succes.
Una din cele mai importante decizii luate de arhitecți, ține de alegerea tehnologiei potrivite pentru rezolvarea problemelor specifice produselor ce urmează a fi dezvoltate. În acest context, când vine vorba de alegerea între o bază de date relațională și o soluție NoSQL, este important să se ia în considerare câteva aspecte.
Modelul relațional este foarte potrivit pentru datele ce au o structură tabulară, cum ar fi un registru contabil. Datele complexe, care conțin multe nivele de imbricare, sunt mai greu de modelat folosind structuri bidimensionale. În astfel de cazuri, alegerea bazelor de date de tip NoSQL pare a fi potrivită, pentru că datele pot fi stocate în formatul JSON. Acest format este suportat de marea majoritate a tehnologiilor NoSQL.
Un alt aspect îl reprezintă volatilitatea datelor. Este important să se știe cât de des se va schimba și va evolua modelul de date . De cele mai multe ori, modelul de date nu este bine definit de la început și flexibilitatea este necesară. Rigiditatea modelului de date este una dintre potențialele probleme pe care o putem avea cu baze de date relaționale.
Agilitatea și rapiditatea de dezvoltare sunt caracteristicile cele mai importante în cadrul unui proces de dezvoltare. În acest sens, tehnologiile NoSQL și-au demonstrat avantajul. Folosirea formatului de tip JSON pentru modelarea datelor, le dă posibilitatea programatorilor de a elabora versiuni inițiale ale produselor într-un timp mult mai scurt.
Creșterea volumului de date și a numărului de utilizatori, duce la degradarea performanței. Unica soluție oferită în astfel de cazuri de către tehnologiile relaționale, este bazată pe scalare pe verticală (hardware) care este foarte costisitoare. Pe de altă parte, tehnologiile NoSQL oferă posibilitatea de a scala pe orizontală, prin adăugarea mai multor servere care, deși nu sunt foarte performante, nu necesită investiții la fel de mari ca în primul caz.
Modelele de date relaționale sunt potrivite pentru interogări sofisticate de date și reprezintă o alegere bună când interogarea complexă și crearea de rapoarte este critică.
Analiza în timp real a datelor operaționale este mult mai potrivită pentru tehnologii NoSQL.
Couchbase Server este o bază de date NoSQL bazată pe documente pentru aplicații web interactive. Aceasta oferă avantajele clasice unei soluții NoSQL, cum ar fi flexibilitatea modelului de date, ușurința , performanța și capacitatea de a oferi disponibilitate 100%.
Couchbase a apărut ca urmare a îmbinării a două tehnologii populare NoSQL:
Couchbase folosește documentele în formatul JSON pentru reprezentarea obiectelor aplicației și a relațiilor dintre obiecte. Acest model e suficient de flexibil pentru a suporta schimbări ulterioare ale obiectelor fără a fi necesară migrarea schemei bazei de date sau planificarea unei perioade de mentenanță ce ar putea perturba disponibilitatea aplicației. Un alt avantaj al modelului bazat pe document este ușurința cu care pot fi reprezentate obiectele din lumea reală, cu posibilitatea de a folosi mai multe nivele de imbricare, precum și folosirea atributelor pentru a reprezenta relațiile dintre obiecte.
E foarte ușor să scalezi aplicația folosind Couchbase Server, atât în cadrul unui cluster de servere cât și la nivel de _cluster-_e aflate în centre de date diferite. Se pot adăuga noduri noi pentru a întâmpina nevoia de a face față unui trafic crescut specific perioadelor de vârf. Ce e și mai important, adăugarea de servere nu necesită întreruperea operațională a aplicației sau schimbarea codului aplicației. Noile servere pot prelua traficul adițional și păstreză distribuția echilibrată a datelor. Couchbase oferă o partajare automată și rebalansare a datelor, ceea ce permite redimensionarea cluster-ului în funcție de nevoile aplicației.
Couchbase oferă o suită de librării pentru diverse limbaje de programare cum ar fi: Java / .NET / PHP / Ruby / C / Python / Node.js. Aceste librării facilitează integrarea soluției în orice tip de aplicație.
Pentru operația de citire, Couchbase oferă un mecanism de căutare bazat pe chei. Clientul cere un document pe baza unei chei și doar serverul responsabil de găzduirea partiției în care se află cheia, va fi contactat.
Couchbase oferă și un mecanism de căutare bazat pe interogarea unui index (View). Căutarea este distribuită la toate serverele din cluster și rezultatele găsite pe toate nodurile sunt agregate într-un singur răspuns și trimise înapoi la client.
Pentru operația de scriere, Couchbase oferă un mecanism de modificare bazat pe chei. Clientul trimite o solicitare de modificare, în care e trimis atât documentul modificat cât și cheia asociată documentului. Serverul trimite răspuns solicitării clientului imediat ce documentul este salvat în memoria nodului primar (responsabil de găzduirea acelui document), ceea ce facilitează obținerea unei latențe mici pentru operațiile de scriere.
Designul Couchbase-ului este centrat pe concurență performanță și randament (throughput) ridicat. Acesta oferă timp de răspuns de ordinul milisecundelor, ceea ce îmbunătățește experiența utilizatorului final. De asemenea, serverul distribuie automat procesarea la toate nodurile din cluster pentru a menține performanța constantă și a reduce încărcarea excesivă a unui singur nod.
Couchbase oferă posibilitatea de a controla accesul la date pe baza combinației username/parola. Credențialele sunt transmise într-un mod securizat prin rețea. Datele senzitive sunt protejate în timpul transmiterii de la client la aplicație și viceversa.
Fiabilitatea Couchbase-ului este dată de faptul că nu există un singur nod care ar putea provoca indisponibilitatea sistemului, atâta timp cât datele sunt replicate pe mai multe noduri. Funcționalitățile precum XDCR (Cross Data Center Replication), failover, backup și restore ajută asigurarea unei disponibilități a sistemului în cazul unor probleme neprevăzute, fie la nivel de nod sau de centru de date.
Unitatea de bază de stocare în Couchbase Server o reprezintă documentele. De cele mai multe ori, formatul preferat este JSON, ceea ce permite aplicațiilor să modeleze datele fără să aibă constrângeri specifice modelelor de date relaționale, legate de flexibilitatea modelului. Aceasta se datorază faptului că datele sunt stocate sub formă de documente, nefiind necesare migrări de scheme.
Conținutul documentelor poate fi și în alt format decât JSON -cum ar fi date binare- , dar avantajele folosirii formatului JSON sunt posibilitatea de a indexa și a interoga datele. Couchbase oferă un motor de căutare bazat pe JavaScript ce permite căutarea datelor bazate pe valorile câmpurilor din documente.
Datele sunt stocate în cluster-ul Couchbase folosind așa numitele Data Buckets. Buckets-urile sunt containere virtuale izolate, ce formează un group logic de date în cadrul unui cluster. Un Bucket este echivalentul unei baze de date. Bucket-urile oferă un mecanism securizat de organizare, configurare (memorie, numărul de replici, etc.) și analiză a datelor stocate.
Un vBucket este o entitate logică responsabilă de un subset din spațiul de chei ale unui cluster Couchbase, fiind folosite pentru distribuția uniformă a informației în cluster. Acestea sunt responsabile atât de distribuția datelor cât și de suportul replicilor pe mai multe noduri.
Fiecare identificator de document (cheie) aparține unui vBucket. O funcție de mapare este folosită pentru determinarea _vBucket-_ului de care aparține un document. Această funcție ia ca parametru ID-ul documentului și returnează un identificator de vBucket. Odată calculat, se consultă un tabel ce ține mapările dintre _vBucket-uri ș_i nodurile gazdă. Acest tabel conține un rând pentru fiecare vBucket. Un server poate fi responsabil pentru mai multe vBucket-uri.
Toate datele salvate în Couchbase reprezintă documente cu chei asociate. Cheile reprezintă identificatori unici per document, iar valorile pot fi documente în format JSON sau un stream de biți sau alte obiecte serializate într-o altă formă.
Cheile sunt cunoscute și ca ID-uri de documente și reprezintă similarea un chei primare în SQL. O cheie poate fi formată din orice caractere și trebuie să fie unică.
Toate documentele conțin metadate. Metadatale sunt stocate împreună cu documentele și sunt folosite pentru administrarea acestora. Ele sunt de trei tipuri:
Cunoscut și sub numele de librării-client, acesta reprezintă uneltele de dezvoltare pentru diverse limbaje de programare. Sunt responsabile de comunicarea cu un Couchbase Server și oferă interfețe specifice limbajelor de programare necesare pentru a efectua operații pe baza de date. Librăriile-client știu să citească și să scrie datele direct de pe nodul primar. Odată cu schimbarea topologiei, librăriile-client redirecționează solicitările ce urmează către noile noduri gazdă.
Couchbase a fost construit de la început cu fundamentele bazate pe o arhitectură distribuită, datele partiționate pe toate nodurile disponibile din cluster.
Într-o configurare tipică, o bază de date Couchbase este instalată într-un cluster ce folosește mai multe noduri. Librăriile client se vor conecta la nodurile responsabile de datele cu care interacționează clientul.
Pentru a facilita scalarea pe orizontală, Couchbase utilizeazăpartiționarea bazată pe un hash care asigură distribuția uniformă a datelor pe toate nodurile. Sistemul definește 1024 de partiții (număr fix) și odată ce pentru cheia unui document se calculează un hash asociat unei partiții - această partiție devine gazda documentului. Fiecare partiție are asignat un nod din cluster. Dacă topologia cluster-ului se schimbă (un nod adăugat sau eliminat), sistemul se rebalansează prin migrarea partițiilor de la un nod la altul.
Nu există o singură verigă slabă în sistem, deoarece toate nodurile dintr-un cluster sunt egale. Fiecare nod este responsabil doar de un set de date care i-au fost asignate. Toate nodurile dintr-un cluster rulează două procese primare: data manager și cluster manager. Data manager-ul este responsabil de administrarea datelor din partițiile acelui nod, în timp ce _cluster manage_r se ocupă de operațiile de comunicare între nodurile cluster-ului.
Reziliența sistemului este posibilă datorită replicării de documente. Procesul cluster manager coordonează comunicarea dintre datele replicate cu alte noduri din cluster, iar procesul data manager supervizează replicile ce sunt asignate de către cluster către nodul local. În mod natural, partițiile replicate sunt distribuite pe mai multe noduri, astfel încât să se evite situația în care partițiile replicate sunt stocate pe același nod ca cele active.
Documentele sunt situate în Bucket-uri și documentele dintr-un Bucket sunt izolate de documentele din alte Bucket-uri din perspectiva operațiilor de căutare și interogare. Când se crează un nou Bucket, este posibilă configurarea numărului de replici (maxim trei) pentru acest Bucket. În cazul indisponibilității unui nod (server crash), sistemul va detecta problema, va localiza replicile documentelor ce au fost plasate în acel nod și le va promova la statusul de activ. Sistemul menține o mapare de cluster care definește topologia cluster-ului, iar acestă mapare este modificată la fiecare problemă apărută ce afectează nodurile din cluster.
Această funcționalitate se bazează mult pe implementarea librăriilor-client folosite de aplicațiile ce necesită interacționarea cu un server Couchbase. Clienții sunt într-o comunicare continuă cu nodurile din cluster. Aceștia extrag maparea actualizată a clusterului, după care redirecțioanează cererile către noile noduri ca urmare a schimbării topologiei. De asemenea, clienții participă la balansarea "load"-ului de request-uri emise spre baza de date. Procesul responsabil de balansarea "load"-ului este și el distribuit între mai multi clienți.
Schimbările de topologie sunt coordonate de către un orchestrator, care nu este altceva decât un nod ales să joace rolul arbitrului în cazul schimbărilor de configurare din cluster. Schimbările de topologie sunt comunicate către toate nodurile din cluster. Chiar și în cazul în care nodul orchestrator devine indisponibil, un alt nod poate fi ales pentru a prelua rolul de arbitru pentru a asigura funcționarea neîntreruptă a sistemului.
Există două șabloane de interogare a datelor din Couchbase. Cel mai eficient este bazat pe interogarea de chei. Dacă este cunoscută cheia documentului căutat, complexitatea căutării unui astfel de document este de O(1). Este de asemenea posibilă căutarea documentelor multiple folosind operația multi-get. Extragerea documentelor multiple este foarte eficientă în cazul în care aplicația client are de a face cu o listă de documente, deoarece numărul de interacțiuni este redus la minim.
Un alt șablon de interogare a datelor este bazat pe așa numitele View-uri, cunoscut și sub numele de index. Acestea reprezintă un mecanism folosit pentru interogarea de date din Couchbase. Pentru a defini un View, se creează un document specific numit "design document", care conține un cod JavaScript ce implementează operațiile de map-reduce. "Design document"-ele sunt legate de un anumit Bucket, ceea ce înseamnă că interogările nu se pot efectua pe mai multe Bucket-uri. Consistența eventuală joacă un rol important în cadrul View-urilor. Adăugarea, modificarea sau ștergerea unor documente dintr-un Bucket nu produce schimbări ce sunt vizibile imediat.
Parametrii de interogare oferă posibilitatea de filtrare a unui index. Spre exemplu, se poate defini o căutare ce returnează un singur document sau un set de documente aflate într-un interval.
Indexii din Couchbase sunt actualizați incremental. O modificare nu produce reconstrucția întregului index. Modificările implică doar acele documente care au fost adăugate sau șterse de la ultima modificare. Un index se poate configura în anumite circumstanțe. Spre exemplu, după un interval de timp sau când un număr de documente au fost actualizate.
Performanța trebuie măsurată folosind scenariile similare unui mediu din producție. Acest lucru poate ajuta să înțelegem caracteristicile performanței pentru anumite tipuri de situații și să alegem tehnologia potrivită pentru cerințele aplicației dezvoltate.
Unul dintre testele de performanță de referință pentru compararea tehnologiilor NoSQL este YCSB (Yahoo Cloud Serving Benchmark). Scopul acestuia este să se canalizeze asupra testării diverselor tipuri de baze de date și asupra analizei performanței. YCSB este open-source, extensibil, are un număr mare de conectori pentru diverse tipuri de tehnologii, este reproductibil și compară latența vs randament (throughput).
Rezultatele au arătat că tehnologia Couchbase oferă latența cea mai mică și throughput-ul cu valori mai mari prin comparație cu tehnologiile concurente.
Pentru asigurarea consistenței, este importantă execuția operațiilor de citire/scriere pe nodurile primare. Soluțiile NoSQL ce se bazează pe un singur nod primar sunt limitate din punct de vedere al performanței, deoarece clienții nu pot folosi la capacitate maximă celelalte noduri aflate în cluster. Prima alternativă este de a efectua operația de citire pe toate nodurile (atât primare cât și secundare). În acest caz, performanța de citire este foarte bună, însă nu mai este garantată consistența pentru că replicarea datelor este asincronă. A doua alternativă este replicarea sincronă care asigură consistența datelor, însă contribuie la degradarea performanței.
Prin comparație cu prima abordare, Server-ul Couchbase asigură consistența datelor. De asemena, acesta execută operațiile de citire doar pe nodurile primare pentru asigurarea consistenței. Singura diferență este că toate nodurile sunt utilizate la capacitate maximă, pentru că fiecare nod este primar pentru un subset de partiții de date.
Toate operațiile de citire/scriere sunt executate pe nodurile primare.
Couchbase Server include un set complet de statistici și informații de monitorizare. Statisticile sunt oferite prin intermediul interfețelor de administrare. Una dintre ele este consola de administrare web, care include grafice în timp real a datelor de performanță.
Statisticile sunt împărțite în mai multe grupuri, permițând identificarea diferitelor tipuri de probleme:
Evenimentele legate de activitatea utilizatorului sunt consumate de un sistem de messaging (kafka) pentru a stoca informațiile relevante în Couchbase. Acest serviciu este capabil să răspundă în timp real la următoarele întrebări: când un anumit utilizator a fost activ ultima dată? A jucat vreodată un anumit joc? Toate interogările pe acest serviciu se execută extrem de rapid. Bazat pe răspunsuri la aceste întrebări, alte aplicații sunt capabile să segmenteze clienții pentru diverse flow-uri de business.
Stocarea diverselor informații despre preferințele utilizatorului ce pot fi folosite între mai multe produse ale unei aplicații web. Această soluție poate fi folosită ca alternativă la folosirea sesiunii HTTP, cookie-urilor sau stocarea în baze de date relaționale.
Promoțiile sunt necesare pentru atragerea clienților pentru a folosi diverse produse bazate pe criterii de calificare predefinite. Pe lângă stocarea promoțiilor definite, sunt stocate și documente care monitorizează progresul fiecărui utilizator care a optat pentru o anumită promoție. Sistemul este capabil să identifice în timp real dacă un utilizator a îndeplinit toate cerințele promoției și dacă acordă diverse tipuri de premii configurate per promoție.
Folosirea explozivă a internetului, creșterea volumului de date procesat de aplicațiile moderne, natura diferită a datelor, necesită o analiză foarte atentă pentru alegerea tehnologiei responsabilă de stocarea datelor. Folosirea unei tehnologii NoSQL poate fi o decizie bună în cazul în care este necesar un model flexibil de date, suportul pentru un număr foarte mare de utilizatori concurenți, scalabilitatea și performanța sunt aspecte critice pentru a răspunde cerințelor de business.
Couchbase este un jucător important în piața tehnologiilor NoSQL. Acesta se comportă excelent în situațiile unui "load" masiv atât la citire cât și la scriere, oferind posibilitatea unei scalări facile prin adăugare/eliminare de noduri din cluster în funcție de nevoile aplicației. Arhitectura și designul acestei tehnologii garantează consistență datelor și a performanței foarte bune în același timp. Testele au arătat că această tehnologie este lider pe piața soluțiilor similare. Deși nu se poate spune că această tehnologie e potrivită pentru orice problemă, Couchbase poate fi o soluție foarte bună pentru anumite tipuri de aplicații.
de Patkós Csaba
de Ioana Varga , Ioana Costea
de Lucian Pop