Cassandra: Ein verteiltes Speichersystem für strukturierte Daten mit schließlicher Konsistenz (Open-Source-Projekt) Andreas Prante 27.11.2018
Übersicht Motivation Einleitung Architektur Datenmodell API Ausblick 27.11.2018
Motivation Apache Cassandra ist eine Open Source, verteilte, dezentralisierte, skalierbare, hoch verfügbare, Fehler tolerante, einstellbar konsistente, zeilenorientierte Datenbank, deren Design auf Amazon‘s Dynamo und deren Datenmodell auf Google‘s BigTable aufbaut. 27.11.2018
Allgemeine Informationen 2007 entwickelt Maßgeblich von P. Malik und A. Lakshman Nachrichtendienst von Facebook 2008 als Open-Source freigegeben 2010 von Apache als Top-Level-Projekt aufgenommen Implementierung in Java Genutzt von: Facebook, Adobe, Twitter, ebay, HP, IBM, US-Regierung Bisher größte, bekannte Ausführung beinhaltet mehr als 300 TB Daten verteilt auf 400 Knoten(Nodes) 27.11.2018
Architektur 27.11.2018
Node Cluster Ausgeführte Instanz von Cassandra Jeder Node läuft mit dem selben Code Jeder Node ist für einen bestimmten Schlüsselbereich zuständig Cluster Zusammenschluss von mehreren Nodes Schlüsselbereich eines Nodes wird zufällig bestimmt Struktur entspricht einem Ring 27.11.2018
Ringstruktur - konsistentes Hashing Node 8 Node 1 Node 2 Node 7 Node 6 Node 3 Node 5 Node 4 27.11.2018
Ringstruktur - konsistentes Hashing md5(key) Key/Value-Paar Node 8 Node 1 Replikationsfaktor N = 3 Node 2 Node 7 Node 6 Node 3 Node 5 Node 4 27.11.2018
Wie wird ein Node hinzugefügt? 27.11.2018
Wie wird ein Node hinzugefügt? 27.11.2018
Datenmodell 27.11.2018
Datenmodell Keyspace ColumnFamily SuperColumn Column 27.11.2018
Keyspace Größte Einheit „Container“ für ColumnFamilies Namespace Muss vor Start einer Anwendung festgelegt sein Es kann beliebig viele geben In der Regel einer pro Anwendung 27.11.2018
Beispiel Innerhalb eines sozialen Netzwerk „Wild-West“-Spiel Anwender haben Rollen wie z.B. Outlaw, Sherif, Cowboy Keyspace: wildwest 27.11.2018
ColumnFamily Enthält Reihen von Columns Entspricht in etwa den wichtigsten Tabellen in RDBMS Attributnamen innerhalb einer ColumnFamily sind eindeutig Es können Attribute zur Laufzeit hinzugefügt werden. 27.11.2018
Beispiel - ColumnFamilies Users Horses Weapons Duels Messages 27.11.2018
Column Kleinste Einheit Enthält jeweils Key-Value-Paare mit Zeitstempel 27.11.2018
SuperColumn Column mit Subcolumns Kennzeichnung durch „super“ bei der Column-Definition Schlüssel verweist auf {Column, Column,…} 27.11.2018
Konfigurationsdatei Die Konfigurationsdatei wird beim Start von Cassandra geladen. keyspaces: - name: WildWest replication_factor: 5 column_families: - name: Users - name: Weapons - name: Horses - name: Messages - name: Duels column_type: Super 27.11.2018
API 27.11.2018
API set ColumnFamily[Key][Column] = Wert; set Users['Jim']['reactivity'] = 1; set Users['Joe']['reactivity'] = 9: set Users['Joe']['nick_name'] = 'Little Joe'; get(table, key, columnName) delete(table, key, columnName) 27.11.2018
API - get Lesen von Daten get ColumnFamily[Key][Column] = Wert; get Users['Joe'] as utf8; => (column=nick_name, value=Little Joe, timestamp=1301174261419383) => (column=reactivity, value=30, timestamp=1301174261419383) 27.11.2018
API - set Insert Cassandra unterscheidet nicht zwischen Insert und Update set ColumnFamily[Key][Column] = Wert; set Users['Jim']['reactivity'] = 1; set Users['Joe']['reactivity'] = 9: set Users['Joe']['nick_name'] = 'Little Joe'; 27.11.2018
API - del Löschen Es können ganze Zeilen oder auch nur einzelnen Spalten gelöscht werden. Es gibt keine Überwachung, ob die Daten noch an einer anderen Stelle verwendet werden. del ColumnFamily[Key][Column] = Wert; del Users['Joe']['nick_name']; del Users['Jim']; 27.11.2018
CAP-Theorem P C A Strong Consitency High Availability Partition-tolerance Verteiltes Datenbanksystem kann immer nur 2 der 3 erreichen P C A 27.11.2018
Konsistenz Strenge Konsistenz Schwache Konsistenz Ist ein Schreibvorgang abgeschlossen, liefern alle nachfolgenden Lesevorgänge den geänderten Wert Schwache Konsistenz Es gibt ein Zeitfenster, in dem Änderung die durch einen Schreibvorgang entstehen nicht zurückgeliefert werden. Schließliche Konsistenz Es wird eine endliche Zeit garantiert, nach der die Änderung, die durch einen Schreibvorgang entstehen, zurückgeliefert werden. 27.11.2018
Konsistenzebenen 27.11.2018
Wie erreicht man starke Konsistenz Sei N die Anzahl der Replikationsknoten Sei R die Anzahl der Knoten, die eine Leseoperation bestätigen (analog W für Schreiboperationen) Gilt R + W > N herrscht starke Konsistenz Daraus folgt: Wählt man die Konsistenzebene „Quorum“ für Lese- und Schreiboperationen, ergibt sich starke Konsistenz. 27.11.2018
Wie wird gelesen/geschrieben? Ermittle alle Knoten, die betroffen sind Anfrage an die Knoten weiterleiten und Daten sammeln Kommt keine Antwort innerhalb einer bestimmten Wartezeit: Abbruch Als Ergebnis wird die Antwort verwendet, den aktuellsten Zeitstempel hat Führe evtl. notwendige Korrekturen durch Lesen führt zu bedingtem Schreiben! 27.11.2018
Synchrone Uhrzeit Wie aktuell ein Key-Value-Paar ist, wird über seinen Zeitstempel entschieden. Es muss daher für das gesamte System eine synchrone Zeit geben. Ist das nicht der Fall, werden evtl. nicht mehr aktuelle Daten beim Lesen zurückgegeben. Zusätzlich gehen dann auch noch Daten verloren. 27.11.2018
Sortierung der Daten AsciiType: Sortierung nach dem Byte-Wert des Namens; dabei findet eine Prufung statt, ob dieser als US-ASCII interpretiert werden kann. BytesType: Sortierung nach Byte-Wert des Namens UTF8Type: Sortierung nach dem als UTF-8-Zeichenkette interpretierten Namen LexicalUUIDType: 128bit UUID, der Byte-Wert wird lexikalisch verglichen. TimeUUIDType: 128bit UUID, der Zeitstempel des Namens wird verglichen. LongType: Werte des Namens werden als 64bit Long-Werte interpretiert. 27.11.2018
Konfigurationsdatei keyspaces: - name: WildWest replication_factor: 5 column_families: - name: Users compare_with: UTF8Type - name: Weapons - name: Horses - name: Messages compare_with: TimeUUIDType - name: Duels column_type: Super compare_subcolumns_with: UTF8Type 27.11.2018
Beispiel - Warenkorb Analog Amazon Cassandra-Datenbank mit N = 5 und #Nodes >> 5 Der Anwender möchte einkaufen Durch eine Unachtsamkeit öffnet er drei Sitzungen (z.B. 3 Fenster) In jeder Sitzung wählt er ein Produkt zum Kauf aus Anschließend geht zur „Kasse“ Es gibt eine ColumnFamily Warenkörbe Warenkörbe werden über den Usernamen als Schlüssel zugeordnet Was passiert? 27.11.2018
Beispiel - Warenkorb Warenkorb 1 Warenkorb 2 Warenkorb 3 NoSQL DVD Cassandra DVD 1, 2, 3 3, 4, 5 2, 4, 5 Lesen: Node 1: NoSQL Node 4: Cassandra, DVD Node 2: NoSQL, DVD Node 5: Cassandra, DVD Node 3: NoSQL, Cassandra 27.11.2018
Cassandra Querry Language(CQL) select * from Users; select * from Duels where player1 = Joe; select count(*) from Horses; update Users set reactivity=9 where key=Jim; update Users set nick_name='Little Joe', reactivity=9 where key=Joe; delete nick_name from Users where key=Joe; delete from Users where key=Jim; 27.11.2018
Cassandra Querry Language(CQL) create keyspace WildWest; use WildWest; create column family Users; create column family Horses; create column family Weapons; create column family Duels with column_type = 'Super'; create column family Messages; 27.11.2018
Cassandra Querry Language(CQL) create keyspace WildWest; use WildWest; create column family Users with comparator = 'UTF8Type'; create column family Horses with comparator = 'UTF8Type'; create column family Weapons with comparator = 'UTF8Type'; create column family Duels with column_type = 'Super' and comparator = 'UTF8Type' and subcomparator = 'BytesType'; create column family Messages with comparator = 'UTF8Type'; 27.11.2018
Ausblick – Vorteile von Cassandra Einfach Skalierbar kein Single Point of Failure Jeder Zeit erweiterbar Anfragesprache CQL Wird mittlerweile auch z.B. durch JDBC-Treiber unterstützt Effiziente Bereichsabfragen Variable Replikationsstrategien Konsistenz, Latenz, usw. können vom Anwender bestimmt werden. 27.11.2018
Ausblick – Nachteile von Cassandra Es wird eine synchrone Uhr benötigt Keine eindeutige Dokumentation Cassandra befindet sich in einem frühren Stadium der Entwicklung Einschränkungen der Abfragemöglichkeiten 27.11.2018
Ausblick - Anwendungsgebiete Nicht: Alles läuft auf einer Maschine Viele, verteilte Knoten Mehr Schreiben als Lesen Erweiterbarkeit Ausfallsicherheit Flexibilität 27.11.2018
Vielen Dank für Ihre Aufmerksamkeit. 27.11.2018
Quellen Avinash Lakshman, Prashant Malik: Cassandra: a decentralized structured storage system. Operating Systems Review 44(2): 35-40 (2010) Eben Hewitt: Cassandra: The Definitive Guide. O'Reilly Media, 2010 Stefan Edlich u.a.: NoSQL - Einstieg in die Welt nichtrelationaler Web 2.0 Datenbanken, 2. Aufl., Hanser-Verlag, 2011 (FG-Bibliothek) http://cassandra.apache.org/ http://cassandra.apache.org/doc/cql/CQL.html Dimitrios Dentsas; Cassandra; http://www.ipvs.uni-stuttgart.de/abteilungen/as/lehre/lehrveranstaltungen/hauptseminare/WS1011/HSEM_termine/dateien/nosql_ws1011_Dimitrios_Cassandra_Folien.pdf; 2011 Christoph Föhrdes; NoSQL - Einblick in die Welt nicht-relationaler Datenbanken; http://www.unfug.org/data/foils/ss10/nosql.pdf; 2010 27.11.2018