4.1 Beschreibung

Apache Cassandra ist ein verteiltes Datenbankverwaltungssystem, das zur Klasse der NoSQL-Systeme gehört und darauf ausgelegt ist, hoch skalierbare und zuverlässige Speicherungen riesiger Datenarrays zu erstellen, die in Form eines Hashs dargestellt werden.

Ursprünglich wurde das Projekt in den Eingeweiden von Facebook entwickelt und 2009 unter die Fittiche der Apache Software Foundation übertragen, diese Organisation entwickelt das Projekt weiter. Auf Cassandra basierende Industrielösungen werden eingesetzt, um Dienste für Unternehmen wie Cisco, IBM, Cloudkick, Reddit, Digg, Rackspace, Huawei, Netflix, Apple, Instagram, GitHub, Twitter und Spotify bereitzustellen. Im Jahr 2011 verfügte der größte Servercluster, der eine einzelne Datenbank unter Cassandra bediente, über mehr als 400 Maschinen und enthielt mehr als 300 TB Daten.

Es ist in der Java-Sprache geschrieben und implementiert ein verteiltes Hash-System ähnlich wie DynamoDB, das eine nahezu lineare Skalierbarkeit mit zunehmendem Datenvolumen bietet. Es verwendet ein auf einer Spaltenfamilie basierendes Datenspeichermodell, das sich von Systemen wie MemcacheDB, die Daten nur in einem Schlüssel-Wert-Paar speichern, durch die Möglichkeit unterscheidet, Hashes mit mehreren Verschachtelungsebenen zu speichern.

Gehört zur Kategorie der fehlertoleranten DBMS: Die in der Datenbank abgelegten Daten werden automatisch auf mehrere Knoten eines verteilten Netzwerks repliziert oder sogar gleichmäßig auf mehrere Rechenzentren verteilt. Wenn ein Knoten ausfällt, werden seine Funktionen im Handumdrehen von anderen Knoten übernommen. Das Hinzufügen neuer Knoten zum Cluster und das Aktualisieren der Cassandra-Version erfolgt im Handumdrehen, ohne zusätzliche manuelle Eingriffe und Neukonfiguration anderer Knoten.

Es wird jedoch dringend empfohlen, Schlüssel (Labels) für jeden Knoten, einschließlich vorhandener Knoten, neu zu generieren, um die Qualität des Lastausgleichs aufrechtzuerhalten. Bei einer mehrfachen Erhöhung der Anzahl der Knoten (2-fach, 3-fach usw.) kann auf die Schlüsselgenerierung für bestehende Knoten verzichtet werden.

4.2 Datenmodell

In der Cassandra-Terminologie arbeitet eine Anwendung mit einem Schlüsselraum, der dem Konzept eines Datenbankschemas im relationalen Modell entspricht. Dieser Schlüsselraum kann mehrere Spaltenfamilien enthalten, was dem Konzept einer relationalen Tabelle entspricht.

Spaltenfamilien wiederum enthalten Spalten (Spalte), die über den Schlüssel (Zeilenschlüssel) im Datensatz (Zeile) zusammengefasst werden. Die Spalte besteht aus drei Teilen: Name (Spaltenname), Zeitstempel (Zeitstempel) und Wert (Wert). Die Spalten innerhalb eines Datensatzes sind geordnet. Im Gegensatz zu einer relationalen Datenbank gibt es keine Einschränkungen, ob Datensätze (und im Sinne der Datenbank handelt es sich dabei um Zeilen) Spalten mit denselben Namen wie in anderen Datensätzen enthalten – nein.

Es gibt verschiedene Arten von Spaltenfamilien, in diesem Artikel werden wir dieses Detail jedoch weglassen. Auch in den neuesten Versionen von Cassandra wurde es möglich, Abfragen zum Definieren und Ändern von Daten (DDL, DML) mithilfe der CQL-Sprache auszuführen sowie sekundäre Indizes zu erstellen.

Der in Cassandra gespeicherte spezifische Wert wird identifiziert durch:

  • Keyspace ist eine Bindung an die Anwendung (Domäne). Ermöglicht das Hosten von Daten aus verschiedenen Anwendungen im selben Cluster;
  • Eine Spaltenfamilie ist eine Bindung an eine Abfrage.
  • Der Schlüssel ist eine Bindung an einen Clusterknoten. Der Schlüssel bestimmt, auf welchen Knoten die gespeicherten Spalten landen;
  • Der Spaltenname ist eine Bindung an ein Attribut im Datensatz. Ermöglicht das Speichern mehrerer Werte in einem Eintrag.

Jeder Wert ist mit einem Zeitstempel verknüpft, einer vom Benutzer angegebenen Zahl, die zur Lösung von Konflikten während der Aufzeichnung verwendet wird: Je größer die Zahl, desto neuere Spalte wird berücksichtigt und beim Vergleich werden alte Spalten überschrieben.

4.3 Datentypen

Nach Datentypen: Schlüsselraum und Spaltenfamilie sind Zeichenfolgen (Namen); Zeitstempel ist eine 64-Bit-Zahl; und der Schlüssel, der Spaltenname und der Spaltenwert sind ein Array von Bytes. Cassandra hat auch das Konzept der Datentypen. Diese Typen können vom Entwickler beim Erstellen einer Spaltenfamilie (optional) angegeben werden.

Bei Spaltennamen spricht man von einem Komparator, bei Werten und Schlüsseln von einem Validator. Der erste definiert, welche Bytewerte für Spaltennamen zulässig sind und wie sie angeordnet werden. Die zweite ist, welche Bytewerte für Spalten- und Schlüsselwerte gültig sind.

Wenn diese Datentypen nicht festgelegt sind, speichert Cassandra die Werte und vergleicht sie als Byte-Strings (BytesType), da sie tatsächlich intern gespeichert werden.

Die Datentypen sind:

  • BytesType : beliebige Byte-Strings (keine Validierung)
  • AsciiType : ASCII-Zeichenfolge
  • UTF8Type : UTF-8-Zeichenfolge
  • IntegerType : Zahl mit beliebiger Größe
  • Int32Type : 4-Byte-Zahl
  • LongType : 8-Byte-Zahl
  • UUIDType : UUID-Typ 1 oder 4
  • TimeUUIDType : Typ 1 UUID
  • DateType : 8-Byte-Zeitstempelwert
  • BooleanType : zwei Werte: true = 1 oder false = 0
  • FloatType : 4-Byte-Gleitkommazahl
  • DoubleType : 8-Byte-Gleitkommazahl
  • DecimalType : eine Zahl mit beliebiger Größe und einem Gleitkomma
  • CounterColumnType : 8-Byte-Zähler

In Cassandra sind alle Datenschreibvorgänge immer Umschreibvorgänge. Das heißt, wenn eine bereits vorhandene Spalte mit demselben Schlüssel und Namen zur Spaltenfamilie gelangt und der Zeitstempel größer als der gespeicherte ist, wird der Wert überschrieben . Die aufgezeichneten Werte ändern sich nie, nur neuere Spalten enthalten neue Werte.

Das Schreiben in Cassandra ist schneller als das Lesen. Dadurch ändert sich der Ansatz, der bei der Gestaltung verfolgt wird. Wenn wir Cassandra unter dem Gesichtspunkt des Entwurfs eines Datenmodells betrachten, ist es einfacher, sich eine Spaltenfamilie nicht als Tabelle, sondern als materialisierte Ansicht vorzustellen – eine Struktur, die die Daten einer komplexen Abfrage darstellt, sie aber darauf speichert Scheibe.

Anstatt zu versuchen, Daten mithilfe von Abfragen auf irgendeine Weise zusammenzustellen, ist es besser, alles zu speichern, was für diese Abfrage möglicherweise benötigt wird, in der Zielfamilie. Das heißt, es ist notwendig, nicht von der Seite der Beziehungen zwischen Entitäten oder Beziehungen zwischen Objekten auszugehen, sondern von der Seite der Abfragen: Welche Felder müssen ausgewählt werden? in welcher Reihenfolge sollten die Datensätze abgelegt werden; Welche Daten zu den Hauptdaten sollten zusammen abgefragt werden? All dies sollte bereits in der Spaltenfamilie gespeichert sein.

Die Anzahl der Spalten in einem Datensatz ist theoretisch auf 2 Milliarden begrenzt. Dies ist ein kurzer Exkurs. Weitere Einzelheiten finden Sie im Artikel über Design- und Optimierungstechniken. Lassen Sie uns nun näher auf den Prozess des Speicherns und Lesens von Daten in Cassandra eingehen.