Apache Cassandra

Verteilte NoSQL-Datenbank - lineare Skalierbarkeit, kein Single Point of Failure, massive Datenmengen

TL;DR

Was: Eine verteilte NoSQL-Datenbank für hohe Verfügbarkeit und Skalierbarkeit.

Warum: Kein Single Point of Failure, lineare Skalierbarkeit, verarbeitet massive Datenmengen.

Quick Start

Mit Docker installieren:

docker run --name cassandra -p 9042:9042 -d cassandra:latest

Verbinden:

docker exec -it cassandra cqlsh

Keyspace und Tabelle erstellen:

CREATE KEYSPACE myapp WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': 1
};

USE myapp;

CREATE TABLE users (
  user_id UUID PRIMARY KEY,
  name TEXT,
  email TEXT,
  created_at TIMESTAMP
);

Cheatsheet

BefehlBeschreibung
DESCRIBE KEYSPACES;Keyspaces auflisten
USE keyspace;Keyspace auswählen
DESCRIBE TABLES;Tabellen auflisten
DESCRIBE TABLE name;Tabellenschema anzeigen
SELECT * FROM table;Daten abfragen
INSERT INTO table (...) VALUES (...);Daten einfügen
EXIT;cqlsh beenden

Gotchas

Data modeling (query-first)

-- Tabellen basierend auf Abfragen entwerfen, nicht Beziehungen
-- Abfrage: Alle Posts eines Benutzers, nach Zeit sortiert
CREATE TABLE posts_by_user (
  user_id UUID,
  post_id TIMEUUID,
  title TEXT,
  content TEXT,
  PRIMARY KEY (user_id, post_id)
) WITH CLUSTERING ORDER BY (post_id DESC);

CRUD operations

-- Einfügen
INSERT INTO users (user_id, name, email, created_at)
VALUES (uuid(), 'John', '[email protected]', toTimestamp(now()));

-- Auswählen
SELECT * FROM users WHERE user_id = some-uuid;

-- Aktualisieren
UPDATE users SET name = 'Johnny'
WHERE user_id = some-uuid;

-- Löschen
DELETE FROM users WHERE user_id = some-uuid;

Primary key structure

-- Nur Partitionsschlüssel
PRIMARY KEY (user_id)

-- Partitionsschlüssel + Clustering-Spalte
PRIMARY KEY (user_id, created_at)

-- Zusammengesetzter Partitionsschlüssel
PRIMARY KEY ((country, city), user_id)

Collections

-- Liste
emails LIST<TEXT>

-- Set
tags SET<TEXT>

-- Map
properties MAP<TEXT, TEXT>

Next Steps