4.1 Beskrivelse

Apache Cassandra er et distribuert databasestyringssystem som tilhører klassen av NoSQL-systemer og er designet for å skape svært skalerbare og pålitelige lagringer av enorme datamatriser presentert i form av en hash.

Opprinnelig ble prosjektet utviklet i innvollene til Facebook og i 2009 overført under vingen til Apache Software Foundation, fortsetter denne organisasjonen å utvikle prosjektet. Industrielle løsninger basert på Cassandra er distribuert for å levere tjenester til selskaper som Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter og Spotify. I 2011 hadde den største serverklyngen som betjener en enkelt database under Cassandra mer enn 400 maskiner og inneholdt mer enn 300 TB med data.

Skrevet på Java-språket implementerer den et distribuert hash-system som ligner på DynamoDB, som gir nesten lineær skalerbarhet med økende datavolum. Den bruker en datalagringsmodell basert på en familie av kolonner, som skiller seg fra systemer som MemcacheDB, som lagrer data bare i et nøkkelverdi-par, ved muligheten til å lagre hashes med flere nivåer av nesting.

Tilhører kategorien feiltolerante DBMS: dataene som er plassert i databasen, blir automatisk replikert til flere noder i et distribuert nettverk eller til og med jevnt fordelt i flere datasentre. Når en node svikter, blir funksjonene plukket opp av andre noder, og nye noder legges til i klyngen og oppdatering av Cassandra-versjonen gjøres umiddelbart, uten ytterligere manuell intervensjon og rekonfigurering av andre noder.

Det anbefales imidlertid sterkt å regenerere nøkler (etiketter) for hver node, inkludert eksisterende, for å bevare kvaliteten på lastbalansering. Nøkkelgenerering for eksisterende noder kan unngås i tilfelle av en multippel økning i antall noder (2 ganger, 3 ganger, og så videre).

4.2 Datamodell

I Cassandra-terminologi fungerer en applikasjon med et nøkkelrom, som tilsvarer konseptet med et databaseskjema i relasjonsmodellen. Dette nøkkelrommet kan inneholde flere kolonnefamilier, som tilsvarer konseptet med en relasjonstabell.

På sin side inneholder kolonnefamilier kolonner (kolonne), som kombineres med nøkkelen (radnøkkel) i posten (rad). Kolonnen består av tre deler: navn (kolonnenavn), tidsstempel (tidsstempel) og verdi (verdi). Kolonnene i en post er ordnet. I motsetning til en relasjonsdatabase er det ingen begrensninger på om poster (og i forhold til databasen er dette rader) inneholder kolonner med samme navn som i andre poster - nei.

Kolonnefamilier kan være av flere slag, men i denne artikkelen vil vi utelate denne detaljen. Også i de siste versjonene av Cassandra ble det mulig å utføre spørringer for å definere og endre data (DDL, DML) ved å bruke CQL-språket, samt lage sekundære indekser.

Den spesifikke verdien som er lagret i cassandra identifiseres ved:

  • keyspace er en binding til applikasjonen (domene). Lar deg være vert for data fra forskjellige applikasjoner i samme klynge;
  • en kolonnefamilie er en binding til en spørring;
  • nøkkel er en binding til en klyngennode. Nøkkelen bestemmer hvilke noder de lagrede kolonnene vil havne på;
  • kolonnenavn er en binding til et attributt i posten. Lar deg lagre flere verdier i én oppføring.

Hver verdi er assosiert med et tidsstempel, et brukerspesifisert tall som brukes til å løse konflikter under opptak: jo større tall, den nyere kolonnen vurderes, og når den sammenlignes, overskriver den gamle kolonner.

4.3 Datatyper

Etter datatyper: tasterom og kolonnefamilie er strenger (navn); tidsstempel er et 64-bits tall; og nøkkelen, kolonnenavnet og kolonneverdien er en rekke byte. Cassandra har også konseptet med datatyper. Disse typene kan spesifiseres (valgfritt) av utvikleren når du oppretter en kolonnefamilie.

For kolonnenavn kalles dette en komparator, for verdier og nøkler kalles det en validator. Den første definerer hvilke byteverdier som er tillatt for kolonnenavn og hvordan de skal bestilles. Den andre er hvilke byteverdier som er gyldige for kolonne- og nøkkelverdier.

Hvis disse datatypene ikke er angitt, lagrer cassandra verdiene og sammenligner dem som bytestrenger (BytesType) siden de faktisk er lagret internt.

Datatypene er:

  • BytesType : alle bytestrenger (ingen validering)
  • AsciiType : ASCII-streng
  • UTF8Type : UTF-8-streng
  • IntegerType : tall 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 tidsstempelverdi
  • BooleanType : to verdier: sann = 1 eller usann = 0
  • FloatType : 4-byte flyttallnummer
  • DoubleType : 8-byte flyttallnummer
  • DesimalType : et tall med en vilkårlig størrelse og et flytende komma
  • CounterColumnType : 8 byte teller

I Cassandra er alle dataskrivingsoperasjoner alltid omskrivingsoperasjoner, det vil si at hvis en kolonne med samme nøkkel og navn som allerede eksisterer kommer til kolonnefamilien, og tidsstemplet er større enn det som er lagret, så overskrives verdien . De registrerte verdiene endres aldri, bare nyere kolonner kommer inn med nye verdier.

Å skrive til Cassandra er raskere enn å lese. Dette endrer tilnærmingen som er tatt i designet. Hvis vi vurderer Cassandra fra synspunktet om å designe en datamodell, er det lettere å forestille seg en kolonnefamilie ikke som en tabell, men som en materialisert visning - en struktur som representerer dataene til en kompleks spørring, men lagrer den på disk.

I stedet for å prøve å komponere data på en eller annen måte ved hjelp av spørringer, er det bedre å prøve å lagre alt som kan være nødvendig for denne spørringen i målfamilien. Det vil si at det er nødvendig å nærme seg ikke fra siden av relasjoner mellom enheter eller relasjoner mellom objekter, men fra siden av spørringer: hvilke felter må velges; i hvilken rekkefølge postene skal gå; hvilke data relatert til de viktigste som bør etterspørres samlet - alt dette skal allerede være lagret i kolonnefamilien.

Antall kolonner i en post er teoretisk begrenset til 2 milliarder. Dette er en kort digresjon, og flere detaljer finner du i artikkelen om design og optimaliseringsteknikker. Og la oss nå fordype oss i prosessen med å lagre data til Cassandra og lese dem.