Wide-Column Datenmodell nach BigTable Cassandra
Gliederung Wide-Column Datenmodell nach BigTable Einführung Datenmodell nach BigTable Rows Columns Timestamps Thrift RPC API Fazit Einführung Wichtigsten Methoden Consistency Level Beispiel in Java Gliederung Seite 2
Einführung Seit 2004 in der Entwicklung von Google Ab 2005 bei Google im produktiven Einsatz Paper zu BigTable wurde 2006 veröffentlicht Wird unter anderem bei Google Maps, Google Book Search, YouTube und Gmail eingesetzt Ziele der Entwicklung waren möglichst großer Einsatzbereich, Skalierbarkeit, hohe Performance und hohe Verfügbarkeit Wide-Column Datenmodell Seite 3
Datenmodell nach BigTable Eine BigTable Cluster ist eine Menge von Knoten, die die BigTable Software benutzen Jeder cluster bedient dabei eine Menge von tables Eine table ist eine dünnbesetzte, verteilte, persistente, multidimensionale und sortierte Map Jede Map wird durch Row-Key, Column-Key und Zeitstempel indiziert und bietet damit den Zugriff auf einzelne Cells Jeder Eintrag ist ein nicht interpretiertes Feld von Bytes Wide-Column Datenmodell Seite 4
Rows Row-Keys können beliebige Strings bis zur Größe von 64KB sein (10-100Byte Standard) Jede Lese- und Schreiboperation auf einer Row ist atomar Row-Bereiche werden automatisch zu sogenannten Tablets partioniert Tablets dienen als Einheit der Verteilung und des Lastenausgleichs Abfragen über kleine Row-Bereiche effizienter, da nur wenige Knoten involviert Rows werden nach lexikographischer Ordnung der Row-Keys gespeichert Kann ausgenutzt werden um Daten lokal zu gruppieren Für die Google WebTable werden als Row-Keys die URLs mit invertierter Reihenfolge des Hostnamens benutzt maps.google.com/index.html wird zu com.google.maps/index.html Wide-Column Datenmodell Seite 5
Columns Mengen von Column-Keys werden zu Column-Families gruppiert Bevor ein Column-Key benutzt werden kann, muss er einer Column-Family angehören Basiseinheit der Zugriffkontrolle und des Memoryaccountings Es sollten nicht zu viele Column-Familien erstellt werden(in den Hunderten) Ein Column-Key setzt sich aus family:qualifier zusammen Alle Daten innerhalb einer Column-Family sollten ähnlich sein, da sie zusammen komprimiert werden Mengen von Column-Families können in Cassandra zusätzlich zu Super-Column-Families gruppiert werden Wide-Column Datenmodell Seite 6
Timestamps Mehrere Versionen der selben Daten können mit unterschiedlichen Zeitstempeln gespeichert werden Zeitstempel sind 64bit-Integer Können automatisch von BigTable gesetzt werden Real Time in Millisekunden Clients können sie auch manuell erstellen Anwendungen die Kollisionen verhindern müssen, sind gezwungen selbst eindeutige Timestamps zu erstellen Automatische Garbage-Collection auf Basis der Timestamps möglich Behalte letzte n Versionen Behalte alle Versionen jünger als bestimmter Timestamp Wide-Column Datenmodell Seite 7
Wide-Column Datenmodell Kein relationales Datenmodell Keine Joins von Tables möglich Queries über Row-Key Denormalisierung muss deswegen Queryspezifisch eingeführt werden Redundanz zur Readperformancesteigerung gewollt Wide-Column Datenmodell Seite 8
Thrift RPC API - Einführung In Cassandra Version 0.8(08.01.2011) durch die Cassandra Query Language(CQL) ergänzt und später ersetzt Die Benutzung wird nicht mehr empfohlen, sowohl für Cassandra 1.2 als auch Cassandra 2.x Basiert sehr stark auf Apache Thrift einer Schnittstellenbeschreibungssprache Wird zum definieren und erstellen von Services für zahlreiche Sprachen eingesetzt Ist ein Remote Procedure Call Framework und wurde bei Facebook entwickelt Ermöglicht die Ansprache von Cassandra unter anderem in PHP, Java, Python, Perl, C# und C++ Thrift RPC API Seite 9
Wichtigsten Methoden Get ColumnOrSuperColumn get(binary key, ColumnPath column_path, Cons istencylevel consistency_level Zum holen einzelner werte Get_slice list<columnorsupercolumn> get_slice(binary key, ColumnParent colu mn_parent, SlicePredicate predicate, ConsistencyLevel consistency_lev el) Zum holen eines Bereichwertes Insert insert(binary key, ColumnParent column_parent, Column column, Consi stencylevel consistency_level) Zum einfügen eines neuen Wertes Remove remove(binary key, ColumnPath column_path, i64 timestamp, Consiste ncylevel consistency_level) Zum entfernen eines Wertes Thrift RPC API Seite 10
Wichtigsten Methoden Truncate truncate(string column_family) Entfernt alle Rows einer Column-Family Set_keyspace void set_keyspace(string keyspace) Setzt den keyspace(vergleichbar Datenbank) auf dem gearbeitet werden soll system_add_column_family string system_add_column_family(cfdef cf_def) Fügt eine neue Column-Family in den Keyspace ein system_drop_column_family string system_drop_column_family(columnfamily column_family) Entfernt eine Column-Family aus dem Keyspace Thrift RPC API Seite 11
Consistency Level Muss explizit bei jeder Transaktion angeben werden Write Any Ensure that the write has been written to at least 1 node, including HintedHandoff recipients. ONE Ensure that the write has been written to at least 1 replica's commit log and memory table before responding to the client. TWO Ensure that the write has been written to at least 2 replica's before responding to the client. THREE Ensure that the write has been written to at least 3 replica's before responding to the client. QUORUM Ensure that the write has been written to N / 2 + 1 replicas before responding to the client. LOCAL_QUORUM Ensure that the write has been written to <ReplicationFactor> / 2 + 1 nodes, within the local datacenter (requires NetworkTopologyStrategy) EACH_QUORUM Ensure that the write has been written to <ReplicationFactor> / 2 + 1 nodes in each datacenter (requires NetworkTopologyStrategy) Thrift ALL RPC API Seite 12
Consistency Level Read ANY Not supported. You probably want ONE instead. ONE Will return the record returned by the first replica to respond. A consistency check is always done in a background thread to fix any consistency issues when ConsistencyLevel.ONE is used. This means subsequent calls will have correct data even if the initial read gets an older value. (This is called ReadRepair) TWO Will query 2 replicas and return the record with the most recent timestamp. Again, the remaining replicas will be checked in the background. THREE Will query 3 replicas and return the record with the most recent timestamp. QUORUM Will query all replicas and return the record with the most recent timestamp once it has at least a majority of replicas (N / 2 + 1) reported. Again, the remaining replicas will be checked in the background. LOCAL_QUORUM Returns the record with the most recent timestamp once a majority of replicas within the local datacenter have replied. EACH_QUORUM Returns the record with the most recent timestamp once a majority of replicas within each datacenter have replied. ALL Will query all replicas and return the record with the most recent timestamp once all replicas have replied. Any unresponsive replicas will fail the operation. Thrift RPC API Seite 13
Beispiel in Java - Vorbereitung Thrift RPC API Seite 14
Beispiel in Java - Insert Thrift RPC API Seite 15
Beispiel in Java - Read Thrift RPC API Seite 16
Thrift RPC API Seite 17
Fazit Das Wide-Column Model ermöglicht sehr breite Einsatzmöglichkeiten, hohe Performance und sehr gute Skalierbarkeit Dünnbesetzte, verteilte, persistente, multidimensionale und sortierte Map Kein relationales Datenmodell Row-Keys, Column-Key und Timestamps indizieren die Daten Redundanz und Denormalisierung erwünscht Thrift RPC API ist veraltet und die Nutzung wird nicht mehr empfohlen Im Vergleich zu CQL sehr umständliche Nutzung Fazit Seite 18