Auf einen Blick: Unterschiede zwischen Partitionsschlüsseln, zusammengesetzten Schlüsseln und Clustering-Spalten in Cassandra werden erklärt und betonen ihre Rolle in der Datenorganisation. Der Partitionsschlüssel bestimmt den Speicherort der Daten, während Cluster-Spalten Daten innerhalb einer Partition für effizienten Zugriff ordnen.
- Partitionsschlüssel sind entscheidend für die Datenverteilung über Knoten hinweg.
- Zusammengesetzte Schlüssel ermöglichen es mehreren Spalten, eine Partition zu definieren.
- Das Clustern von Spalten optimiert die Reihenfolge der Datenabrufe innerhalb der Partitionen.
Hier erklären wir die Unterschiede zwischen Partitionsschlüssel, Composite-Key und Clustering-Key in Cassandra.
Kurz gesagt: Jede Tabelle benötigt einen eindeutigen Primärschlüssel. Das erste Feld ist der Partitionsschlüssel, da sein gehashter Wert verwendet wird, um den Knoten zu bestimmen, an dem die Daten gespeichert werden. Wenn diese Felder in Klammern gewickelt sind, ist der Partitionsschlüssel zusammengesetzt. Andernfalls ist das erste Feld der Partitionsschlüssel. Alle nach dem Partitionsschlüssel aufgeführten Felder werden als Clustering-Spalten bezeichnet. Diese speichern die Daten in aufsteigender oder absteigender Reihenfolge innerhalb der Partition, um ähnliche Werte schnell wiederzufinden. Alle Felder zusammen sind der Primärschlüssel.
Wir haben hier über die Partitionierung von Daten gesprochen.
Clustering-Spalten
Das Clustering der Spalten bestimmt die Reihenfolge der Daten in den Partitionen.
Was ist der Grund für Cluster-Spalten? Der ganze Sinn einer spaltenorientierten Datenbank wie Cassandra ist es, benachbarte Datensätze nebeneinander zu legen, um schnell abgerufen zu können.
Denken Sie daran, dass in einer regulären rdbms-Datenbank wie Oracle jede Zeile alle Werte speichert, auch leere. In einer spaltenorientierten Datenbank kann jedoch eine Zeile Spalten (a,b,c) und eine andere (a,b) oder einfach (a) haben. Wenn wir also nur am Wert a interessiert sind, warum speichern wir diesen dann nicht im selben Rechenzentrum, Rack oder Laufwerk für einen schnellen Abruf? Denken Sie daran, dass SQL-Select-Anweisungen Teilmengen erzeugen. Der spaltenorientierte Ansatz macht die Hauptdatenstruktur zu einer Art Teilmenge.
Dieser Ansatz ist logisch, da wir meist nur an einem Teil der Daten gleichzeitig interessiert sind. Zum Beispiel, warum Mitarbeiter-Steuer-IDs, Gehalt, den Namen des Vorgesetzten abrufen, wenn wir nur ihren Namen und ihre Telefonnummer wollen?
Beispiele
Schauen wir uns Bücher an. Die ISBN ist eine Seriennummer eines Buches, das von Verlagen verwendet wird. Sie sollen einzigartig sein. Aber nehmen wir an, sie müssen es für diese Beispiele nicht sein.
Erstellen Sie einen Buch-Schlüsselraum, eine Tabelle und fügen Sie einige Daten hinein. (Wir haben hier über Schlüsselräume gesprochen.)
Beachte, dass der Primärschlüssel PRIMÄRSCHLÜSSEL ist (ISBN, Autor, Verlag). In diesem Fall ist ISBN der Partitionsschlüssel und Autor und Verlag clustern Schlüssel. Es wäre sinnvoll, dass man in einer Sammlung von Büchern diese nach Autor und dann Verlag speichern möchte.
CREATE KEYSPACE books
WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 1};
CREATE TABLE books (
isbn text,
title text,
author text,
publisher text,
category text,
PRIMARY KEY (isbn, author, publisher)
);
insert into books (isbn, title, author, publisher, category) values ('111', 'Fishing', 'Fred', 'Penguin Group', 'Sports');
insert into books (isbn, title, author, publisher, category) values ('111', 'Sailing', 'Sally', 'Penguin Group', 'Sports');
insert into books (isbn, title, author, publisher, category) values ('111', 'Archery', 'Fred', 'Penguin Group', 'Sports');
insert into books (isbn, title, author, publisher, category) values ('111', 'Boating', 'Joe', 'Penguin Group', 'Sports');
Beachten Sie, dass alle Werte im Primärschlüssel eindeutig sein müssen, weshalb ein Datensatz entfernt wurde, weil der Autor Fred mehr als ein Buch mit der veröffentlichten Penguin Group geschrieben und veröffentlicht hat.
Wählen Sie nun den Partitionsschlüssel und den Primärschlüssel aus. Sie sind alle gleich, da wir sie alle auf demselben virtuellen Knoten speichern wollen.
select token(isbn), isbn from books;
system.token(isbn) | isbn
---------------------+------
-175843201295106731 | 111
-175843201295106731 | 111
-175843201295106731 | 111
Wählen Sie nun alle Datensätze aus und beachten Sie, dass die Daten innerhalb des Partitionsschlüssels 111 nach Autor und dann Publisher sortiert sind.
select * from books;
isbn | author | publisher | category | title
------+--------+---------------+----------+---------
111 | Fred | Penguin Group | Sports | Archery
111 | Joe | Penguin Group | Sports | Boating
111 | Sally | Penguin Group | Sports | Sailing
Füge nun einen weiteren Datensatz hinzu, aber gib ihm einen anderen Primärschlüsselwert, was dazu führen kann, dass er in einer anderen Partition gespeichert wird. Auf welchem virtuellen Knoten er gespeichert wird, hängt vom Tokenbereich ab, der dem virtuellen Knoten zugewiesen ist.
insert into books (isbn, title, author, publisher, category) values ('333', 'Trees', 'Charles Darwin', 'Hachette', 'Nature');
insert into books (isbn, title, author, publisher, category) values ('333', 'Trees', 'Charles Darwin', 'Amazon', 'Nature');
Beachten Sie erneut, dass die Daten nach den Cluster-Spalten Autor und Publisher sortiert sind. Und das Token ist für den 333 Primärschlüsselwert unterschiedlich.
Erinnere dich, dass der Partitioner eine Funktion in cassandra.yaml konfiguriert hat, den Hashwert berechnet und die Daten dann basierend auf dem Partitioner verteilt. Standardmäßig ist org.apache.cassandra.dht.Murmur3Partitioner
select token(isbn), isbn, author, publisher from books;
system.token(isbn) | isbn | author | publisher
---------------------+------+----------------+---------------
-175843201295106731 | 111 | Fred | Penguin Group
-175843201295106731 | 111 | Joe | Penguin Group
-175843201295106731 | 111 | Sally | Penguin Group
7036029452358700311 | 333 | Charles Darwin | Amazon
7036029452358700311 | 333 | Charles Darwin | Hachette
Zusammengesetzte Schlüssel
Dies ist einfach eine Tabelle mit mehr als einer Spalte, die bei der Berechnung des Partitionsschlüssels verwendet wird. Wir bezeichnen das mit Klammern wie dieser: PRIMARY KEY ((isbn, author), publisher). In diesem Fall sind isbn und author der Partitionsschlüssel und publisher ein Clustering-Schlüssel.
drop table books;
CREATE TABLE books (
isbn text,
title text,
author text,
publisher text,
category text,
PRIMARY KEY ((isbn, author), publisher)
);
insert into books (isbn, title, author, publisher, category) values ('111', 'Fishing', 'Fred', 'Penguin Group', 'Sports');
insert into books (isbn, title, author, publisher, category) values ('111', 'Sailing', 'Sally', 'Penguin Group', 'Sports');
insert into books (isbn, title, author, publisher, category) values ('111', 'Archery', 'Fred', 'Penguin Group', 'Sports');
insert into books (isbn, title, author, publisher, category) values ('111', 'Boating', 'Joe', 'Penguin Group', 'Sports');
Um nun den Wert des Partitionsschlüssels anzuzeigen, verwenden wir die SQL-Token-Funktion und geben ihr sowohl ISBN- als auch Autorwerte:
select token(isbn,author), isbn from books;
system.token(isbn, author) | isbn
----------------------------+------
725505645253967381 | 111
960809148155353310 | 111
5462216525918432145 | 111
Fügen Sie dieselben Daten wie oben mit den SQL-Anweisungen einfügen. Beachten Sie, dass das Hinzufügen dieser Daten auch ein Buch weglässt, weil ein Autor mehr als ein Buch mit derselben ISBN geschrieben hat. Per Definition muss der Primärschlüssel eindeutig sein. Dazu gehören auch Cluster-Spalten, da sie Teil des Primärschlüssels sind. Alles, was wir mit dem zusammengesetzten Schlüssel geändert haben, ist die Berechnung des Partitionsschlüssels und somit der Speicherort der Daten.
select * from books;
isbn | author | publisher | category | title
------+--------+---------------+----------+---------
111 | Fred | Penguin Group | Sports | Archery
111 | Joe | Penguin Group | Sports | Boating
111 | Sally | Penguin Group | Sports | Sailing
Cassandra-Führer
- Was ist Cassandra? Schlüsselmerkmale und Vorteile
- Wie man einen Cassandra-Cluster einrichtet
- Cassandra SQL Batches and Maps
- Stresstests und Leistungsabstimmung Apache Cassandra
- JSON mit Cassandra verwenden
- Konfiguration von Apache Cassandra Data Consistency
- Verwendung von Tokens zur Verteilung von Cassandra-Daten
- Partitionsschlüssel vs. zusammengesetzter Schlüssel vs. Clustering von Spalten in Cassandra
Diese Beiträge sind meine eigenen und spiegeln nicht unbedingt die Position, Strategien oder Meinung von BMC wider.