4.1 Beskrivelse

Apache Cassandra er et distribueret databasestyringssystem, der hører til klassen af ​​NoSQL-systemer og er designet til at skabe meget skalerbare og pålidelige lagringer af enorme dataarrays præsenteret i form af en hash.

Oprindeligt blev projektet udviklet i indvolden af ​​Facebook og i 2009 overført under Apache Software Foundations fløj, fortsætter denne organisation med at udvikle projektet. Industrielle løsninger baseret på Cassandra er implementeret til at levere tjenester til virksomheder som Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter og Spotify. I 2011 havde den største serverklynge, der betjener en enkelt database under Cassandra, mere end 400 maskiner og indeholdt mere end 300 TB data.

Skrevet i Java-sproget implementerer det et distribueret hash-system, der ligner DynamoDB, som giver næsten lineær skalerbarhed med stigende datavolumen. Den bruger en datalagringsmodel baseret på en familie af kolonner, som adskiller sig fra systemer som MemcacheDB, der kun gemmer data i et nøgleværdi-par ved evnen til at gemme hashes med flere niveauer af indlejring.

Tilhører kategorien af ​​fejltolerante DBMS: de data, der er placeret i databasen, replikeres automatisk til flere noder i et distribueret netværk eller endda jævnt fordelt i flere datacentre. Når en node svigter, bliver dens funktioner opfanget af andre noder, tilføjelse af nye noder til klyngen og opdatering af Cassandra-versionen sker på et øjeblik, uden yderligere manuel indgriben og omkonfiguration af andre noder.

Det anbefales dog stærkt at gengenerere nøgler (etiketter) for hver node, inklusive eksisterende, for at bevare kvaliteten af ​​belastningsbalancering. Nøglegenerering for eksisterende noder kan undgås i tilfælde af en multipel stigning i antallet af noder (2 gange, 3 gange og så videre).

4.2 Datamodel

I Cassandra-terminologi arbejder en applikation med et nøglerum, som svarer til konceptet med et databaseskema i relationsmodellen. Dette nøglerum kan indeholde flere kolonnefamilier, hvilket svarer til konceptet med en relationstabel.

Til gengæld indeholder kolonnefamilier kolonner (kolonne), som kombineres ved hjælp af nøglen (rækkenøglen) i posten (rækken). Kolonnen består af tre dele: navn (kolonnenavn), tidsstempel (tidsstempel) og værdi (værdi). Kolonnerne i en post er ordnet. I modsætning til en relationsdatabase er der ingen begrænsninger på, om poster (og i forhold til databasen er det rækker) indeholder kolonner med samme navne som i andre poster - nej.

Kolonnefamilier kan være af flere slags, men i denne artikel vil vi udelade denne detalje. Også i de seneste versioner af Cassandra blev det muligt at udføre forespørgsler til at definere og ændre data (DDL, DML) ved hjælp af CQL-sproget, samt oprette sekundære indekser.

Den specifikke værdi gemt i cassandra er identificeret ved:

  • keyspace er en binding til applikationen (domæne). Giver dig mulighed for at hoste data fra forskellige applikationer på den samme klynge;
  • en kolonnefamilie er en binding til en forespørgsel;
  • nøglen er en binding til en klynge node. Nøglen bestemmer hvilke noder de gemte kolonner ender på;
  • kolonnenavn er en binding til en attribut i posten. Giver dig mulighed for at gemme flere værdier i én post.

Hver værdi er knyttet til et tidsstempel, et brugerspecificeret tal, der bruges til at løse konflikter under optagelsen: Jo større tal, den nyere kolonne tages i betragtning, og når den sammenlignes, overskriver den gamle kolonner.

4.3 Datatyper

Efter datatyper: nøglerum og kolonnefamilie er strenge (navne); tidsstempel er et 64-bit tal; og nøglen, kolonnenavnet og kolonneværdien er en matrix af bytes. Cassandra har også konceptet med datatyper. Disse typer kan specificeres (valgfrit) af udvikleren, når der oprettes en kolonnefamilie.

For kolonnenavne kaldes dette en komparator, for værdier og nøgler kaldes det en validator. Den første definerer, hvilke byteværdier der er tilladt for kolonnenavne, og hvordan man bestiller dem. Den anden er, hvilke byteværdier der er gyldige for kolonne- og nøgleværdier.

Hvis disse datatyper ikke er indstillet, gemmer cassandra værdierne og sammenligner dem som byte-strenge (BytesType), da de faktisk er gemt internt.

Datatyperne er:

  • BytesType : alle bytestrenge (ingen validering)
  • AsciiType : ASCII-streng
  • UTF8Type : UTF-8 streng
  • IntegerType : tal med vilkårlig størrelse
  • Int32Type : 4-byte nummer
  • LongType : 8-byte nummer
  • UUIDType : UUID type 1 eller 4
  • TimeUUIDType : Type 1 UUID
  • DateType : 8-byte tidsstempelværdi
  • BooleanType : to værdier: sand = 1 eller falsk = 0
  • FloatType : 4-byte flydende kommanummer
  • DoubleType : 8-byte flydende kommanummer
  • DecimalType : et tal med en vilkårlig størrelse og et flydende komma
  • CounterColumnType : 8 byte tæller

I cassandra er alle dataskrivningsoperationer altid omskrivningsoperationer, det vil sige, hvis en kolonne med samme nøgle og navn, som allerede eksisterer, kommer til kolonnefamilien, og tidsstemplet er større end det, der er gemt, så overskrives værdien . De registrerede værdier ændres aldrig, kun nyere kolonner kommer ind med nye værdier.

At skrive til Cassandra er hurtigere end at læse. Dette ændrer den tilgang, der tages i designet. Hvis vi betragter Cassandra ud fra synspunktet om at designe en datamodel, så er det lettere at forestille sig en kolonnefamilie ikke som en tabel, men som en materialiseret visning - en struktur, der repræsenterer dataene i en kompleks forespørgsel, men gemmer dem på disk.

I stedet for at forsøge at sammensætte data på en eller anden måde ved hjælp af forespørgsler, er det bedre at forsøge at gemme alt, hvad der kan være nødvendigt for denne forespørgsel i målfamilien. Det vil sige, det er nødvendigt at nærme sig ikke fra siden af ​​relationer mellem entiteter eller relationer mellem objekter, men fra siden af ​​forespørgsler: hvilke felter der skal vælges; i hvilken rækkefølge optegnelserne skal gå; hvilke data relateret til de vigtigste skal anmodes samlet om - alt dette skal allerede være gemt i kolonnefamilien.

Antallet af kolonner i en post er teoretisk begrænset til 2 mia. Dette er en kort digression, og flere detaljer kan findes i artiklen om design og optimeringsteknikker. Og lad os nu dykke ned i processen med at gemme data til Cassandra og læse dem.