4.1 Descriere

Apache Cassandra este un sistem de gestionare a bazelor de date distribuite care aparține clasei de sisteme NoSQL și este conceput pentru a crea stocări extrem de scalabile și fiabile de matrice de date uriașe prezentate sub formă de hash.

Inițial, proiectul a fost dezvoltat în măruntaiele Facebook și în 2009 transferat sub aripa Apache Software Foundation, această organizație continuă să dezvolte proiectul. Soluțiile industriale bazate pe Cassandra sunt implementate pentru a oferi servicii unor companii precum Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter și Spotify. Până în 2011, cel mai mare cluster de servere care deservește o singură bază de date sub Cassandra avea peste 400 de mașini și conținea peste 300 TB de date.

Scris în limbajul Java , implementează un sistem hash distribuit similar cu DynamoDB, care oferă scalabilitate aproape liniară cu creșterea volumului de date. Utilizează un model de stocare a datelor bazat pe o familie de coloane, care diferă de sisteme precum MemcacheDB, care stochează date doar într-o pereche cheie-valoare, prin capacitatea de a stoca hash-uri cu mai multe niveluri de imbricare.

Aparține categoriei SGBD tolerant la erori: datele plasate în baza de date sunt replicate automat pe mai multe noduri ale unei rețele distribuite sau chiar distribuite uniform în mai multe centre de date. Când un nod eșuează, funcțiile acestuia sunt preluate din mers de către alte noduri, adăugând noi noduri la cluster și actualizarea versiunii Cassandra se face din mers, fără intervenție manuală suplimentară și reconfigurare a altor noduri.

Cu toate acestea, este foarte recomandat să se regenereze cheile (etichetele) pentru fiecare nod, inclusiv pentru cele existente, pentru a păstra calitatea echilibrării sarcinii. Generarea cheilor pentru nodurile existente poate fi evitată în cazul unei creșteri multiple a numărului de noduri (de 2 ori, de 3 ori și așa mai departe).

4.2 Model de date

În terminologia Cassandra, o aplicație funcționează cu un keyspace, care corespunde conceptului de schemă de bază de date în modelul relațional. Acest spațiu de taste poate conține mai multe familii de coloane, ceea ce corespunde conceptului de tabel relațional.

La rândul lor, familiile de coloane conțin coloane (coloană), care sunt combinate folosind cheia (cheia rând) în înregistrare (rând). Coloana este formată din trei părți: nume (numele coloanei), marcaj temporal (marca temporală) și valoare (valoare). Coloanele dintr-o înregistrare sunt ordonate. Spre deosebire de o bază de date relațională, nu există restricții privind dacă înregistrările (și în ceea ce privește baza de date acestea sunt rânduri) conțin coloane cu aceleași nume ca și în alte înregistrări - nr.

Familiile de coloane pot fi de mai multe feluri, dar în acest articol vom omite acest detaliu. De asemenea, în cele mai recente versiuni ale Cassandra, a devenit posibilă executarea de interogări pentru definirea și modificarea datelor (DDL, DML) folosind limbajul CQL, precum și crearea de indici secundari.

Valoarea specifică stocată în cassandra este identificată prin:

  • keyspace este o legătură cu aplicația (domeniul). Vă permite să găzduiți date din aplicații diferite pe același cluster;
  • o familie de coloane este o legare la o interogare;
  • cheia este o legare la un nod de cluster. Cheia determină pe ce noduri vor ajunge coloanele salvate;
  • numele coloanei este o legătură cu un atribut din înregistrare. Vă permite să stocați mai multe valori într-o singură intrare.

Fiecare valoare este asociată cu un marcaj temporal, un număr specificat de utilizator care este utilizat pentru a rezolva conflictele în timpul înregistrării: cu cât numărul este mai mare, coloana mai nouă este luată în considerare și, atunci când este comparată, suprascrie coloanele vechi.

4.3 Tipuri de date

După tipuri de date: keyspace și familia de coloane sunt șiruri de caractere (nume); marca temporală este un număr de 64 de biți; iar cheia, numele coloanei și valoarea coloanei sunt o matrice de octeți. Cassandra are și conceptul de tipuri de date. Aceste tipuri pot fi specificate (opțional) de către dezvoltator la crearea unei familii de coloane.

Pentru numele de coloane, acesta se numește comparator, pentru valori și chei se numește validator. Primul definește ce valori de octeți sunt permise pentru numele coloanelor și cum să le ordonați. Al doilea este ce valori de octet sunt valabile pentru valorile coloanei și cheilor.

Dacă aceste tipuri de date nu sunt setate, Cassandra stochează valorile și le compară ca șiruri de octeți (BytesType), deoarece, de fapt, acestea sunt stocate intern.

Tipurile de date sunt:

  • BytesType : orice șir de octeți (fără validare)
  • AsciiType : șir ASCII
  • UTF8Type : șir UTF-8
  • IntegerType : număr cu dimensiunea arbitrară
  • Int32Type : număr de 4 octeți
  • LongType : număr de 8 octeți
  • UUIDType : UUID tip 1 sau 4
  • TimeUUIDType : Tip 1 UUID
  • DateType : valoare de marcaj temporal de 8 octeți
  • BooleanType : două valori: adevărat = 1 sau fals = 0
  • FloatType : număr în virgulă mobilă de 4 octeți
  • DoubleType : număr în virgulă mobilă de 8 octeți
  • DecimalType : un număr cu o dimensiune arbitrară și o virgulă mobilă
  • CounterColumnType : numărător de 8 octeți

În cassandra, toate operațiunile de scriere a datelor sunt întotdeauna operații de rescriere, adică dacă o coloană cu aceeași cheie și nume care există deja vine în familia de coloane și marca temporală este mai mare decât cea salvată, atunci valoarea este suprascrisă. . Valorile înregistrate nu se schimbă niciodată, doar coloanele mai noi vin cu valori noi.

Să-i scrii lui Cassandrei este mai rapid decât să citești. Acest lucru schimbă abordarea care este luată în proiectare. Dacă o luăm în considerare pe Cassandra din punctul de vedere al proiectării unui model de date, atunci este mai ușor să ne imaginăm o familie de coloane nu ca un tabel, ci ca o vedere materializată - o structură care reprezintă datele unei interogări complexe, dar le stochează pe disc.

În loc să încercați să compuneți date într-un fel folosind interogări, este mai bine să încercați să stocați tot ceea ce ar putea fi necesar pentru această interogare în familia țintă. Adică, este necesar să se abordeze nu din partea relațiilor dintre entități sau a relațiilor dintre obiecte, ci din partea interogărilor: ce câmpuri trebuie selectate; în ce ordine ar trebui să meargă înregistrările; ce date legate de cele principale ar trebui solicitate împreună - toate acestea ar trebui deja stocate în familia de coloane.

Numărul de coloane dintr-o înregistrare este teoretic limitat la 2 miliarde. Aceasta este o scurtă digresiune, iar mai multe detalii găsiți în articolul despre tehnicile de proiectare și optimizare. Și acum să ne aprofundăm în procesul de salvare a datelor în Cassandra și de citire a acestora.