SlideShare ist ein Scribd-Unternehmen logo
1 von 5
Downloaden Sie, um offline zu lesen
www.javaspektrum.de 21
IntegrationsSpektrum
Cassandra, ich hör Dich rufen
Cassandra –
die NoSQL-Datenbank
für große Mengen und
schnelle Zugriffe
Lothar Wieske
Cloud Computing stellt höchste Anforderungen an Dateisysteme und
Datenbanken. Mit Klassikern wie dem Google Bigtable und Amazon
Dynamo haben die Pioniere neue Architekturkonzepte hervorgebracht.
Apache Cassandra (Facebook) ist ein Beispiel für eine verteilte, ska-
lierbare, performante und schemafreie Datenbank mit Eventual Con-
sistency. Cassandra hebt ein Bigtable-Datenmodell auf eine Dynamo-
Plattform, d. h. Cassandra bietet einen strukturierten Speicher für
Schlüssel/Werte-Zuordnungen mit Eventual Consistency. Cassandra ist
in Java implementiert und lädt zum Experimentieren ein.
E
Antwortzeiten, Antwortzeiten, Antwortzeiten ... und im-
mer an die Anwender denken. In einer Untersuchung
mit dem Titel „Customers are Lost or Won in One Second“ hat
die Aberdeen Group Best Practices zur Optimierung der Per-
formanz von Webanwendungen in Unternehmen untersucht
[Abe08]. Die Teilnehmer der Untersuchung verbanden eindeu-
tige geschäftliche und wirtschaftliche Zielsetzungen mit den
technischen Optimierungen: zufriedenere Kunden, produkti-
vere Mitarbeiter, niedrigere Infrastrukturkosten und weniger
Störungen bei zentralen Geschäftsprozessen. Und die Schlüs-
selaussagen der Studie rütteln auf:
H	„... business performance (as measured by customer satisfaction,
conversions, etc.) begins to suffer at 5.1 seconds of delay in re-
sponse times of web applications ...“
H	„... only one second of additional delay in the response times of web
applications could significantly impact some of the top business
goals ...“
H	„... One second delay in response times of Web applications can
impact customer satisfaction by up to 16% ...“
Wer konkrete Zahlen für einzelne Unternehmen sucht, findet
sie beispielsweise im Vortrag von Martin Kliehm, Senior Fron-
tend Engineer bei Namics [Kli10]:
H	Amazon: 100 ms Verzögerung => -1 % Umsatz
H	Bing: 2000 ms Verzögerung => -4,3 % Umsatz
H	Google: 400 ms Verzögerung => -0,59 % Suchen pro Anwender
H	Yahoo!: 400 ms Verzögerung => 5-9 % weniger Datenverkehr
Seien es Warenumsätze oder Werbeeinnahmen, bei Unter-
nehmen dieser Größenordnung geht es bei solchen Rück-
gängen um viel Geld und große Verluste. Da muss die In-
frastruktur rund um die Uhr laufen und durch hohe Ver-
fügbarkeit und niedrige Verzögerungen glänzen, im direk-
ten Interaktionsverhalten genauso wie bei den Services im
Hintergrund. Die virtuellen Warenkörbe der Kunden eines
Internethändlers beispielsweise müssen bei jederzeitiger
Les- und Schreibbarkeit das Abrauchen eines einzelnen Ser-
vers wie auch das Wegbrechen eines ganzen Rechenzent-
rums überleben.
Genau diese hochverfügbaren Warenkörbe bietet Dynamo
bei Amazon. Die großen Suchmaschinen Google und Yahoo!
haben mit Bigtable und PNUTS ähnliche Systeme aufgebaut.
CAP-Theorem und Eventual Consistency
Wie schon in [Wies10] ausgeführt, hat Eric Brewer, seinerzeit
Professor an der Universität Stanford und Mitgründer der Ink-
tomi Corporation, in seiner Keynote beim ACM Symposium
on the Principles of Distributed Computing [Brew00] die An-
wendungsklassen
H	ACID (Atomicity, Consistency, Isolation, Durability) und
H	BASE (Basically Available, Soft State und Eventual Consis-
tency)
als widerstreitende Extreme in einem Kontinuum möglicher
Informationsarchitekturen unterschieden. Im Kern seines Vor-
trags stand eine Vermutung bezüglich Consistency, Availability
und Partition Tolerance: „You can have at most two of three prop-
erties in any shared-data system.“ Im Jahr 2002 haben Seth Gil-
bert und Nancy Lynch vom MIT die Vermutung formal bewie-
sen und sie damit zum Brewer-Theorem oder auch CAP-Theo-
rem erhoben [GiLy02].
Strong Consistency gibt es in zwei Ausbaustufen für die
Entitäten im Datenbanksystem. Der einfachere Fall klammert
alle Änderungen für eine einzelne Entität, der schwierigere
Fall klammert viele Änderungen in einer ganzen Sammlung
von Entitäten. Möglicherweise liegen diese Entitäten sogar in
mehreren Datenbanken oder Nachrichtensystemen und die
müssen dann mit einem Transaktionsmonitor koordiniert wer-
den. Und diese Strong Consistency – eine „Angewohnheit“ bei
Unternehmensanwendungen – muss es gar nicht immer sein.
Eventual Consistency kommt wesentlich entspannter daher,
genügt in vielen Fällen vollauf und erschließt ganz neue Berei-
che für die Availability. Und beim Cloud Computing spielen
Systeme mit Eventual Consistency vom Beginn an eine tragen-
de Rolle [Vog08].
Im Folgenden geht es um Cassandra, eine „Not only SQL“-
Datenbank mit Eventual Consistency.
Apache Cassandra
Cassandra ist ein verteiltes Datenbanksystem für viele Daten
und große Lasten. Facebook hat es als Speichersystem für die
JavaSPEKTRUM 6/201022
IntegrationsSpektrum
Suche in den Eingangskörben der Postfächer mit ca. 100 Milli-
onen Benutzern entwickelt und im Juni 2008 in Betrieb genom-
men. Nach der Freigabe als Open-Source-Projekt im Juli 2008
firmiert Apache Cassandra seit Februar 2010 als Top-Level-Pro-
jekt der Apache Software Foundation [Cassandra]. Jonathan
Ellis ist Project Lead, war bis vor kurzem Mitarbeiter von Rack-
space und hat jetzt seine eigene Firma Riptano gegründet, die
Service und Support für Cassandra anbietet.
Cassandra wird heute bei Facebook, Digg, Twitter, Reddit,
Rackspace, Cloudkick, Cisco, SimpleGeo, Ooyala, OpenX und
anderen bekannten Unternehmen eingesetzt. Das größte be-
kannte Cassandra-Cluster im Produktionsbetrieb hat mehr
als 150 Knoten mit einem Datenvolumen von mehr als 100
Terabyte.
Cassandra-Datenmodell
Das Datenmodell von Cassandra (s. Abb. 1) beruht auf den
Konzepten Column, SuperColumn und ColumnFamily. Eine
Column ist ein Tripel (name, value, timestamp) mit einem binä-
ren Namen, einem binären Wert und einem Zeitstempel.
Eine ColumnFamily bündelt in Rows geordnete Listen von
Columns. Der Zugriff auf eine Row erfolgt über den Key und
innerhalb der Row auf die Column über deren Name. Eine Su-
perColumn bündelt ebenso wie eine ColumnFamily Listen von
Columns. Die Visualisierungen für eine Column-Family und
eine SuperColumn sind also gleich – Austauschen der Bezeich-
nung ganz oben genügt.
Mit einer SuperColumn erhält eine ColumnFamily noch ei-
ne Schachtelungstiefe mehr. Denn eine ColumnFamily bündelt
neben Columns auch SuperColumns – nur keine Mischung aus
beiden. Abbildung 3 gilt also für eine Standard-ColumnFamily.
Abbildung 4 zeigt eine Super ColumnFamily.
Oberhalb der ColumnFamily gibt es nur noch den sogenann-
ten Keyspace – die Keys im Keyspace bestimmen letztlich, auf
welchen Knoten im Cluster die zugehörige ColumnFamily ge-
speichert wird.
Anwendungen optimieren die Ablage und Abfrage von In-
halten in Cassandra durch die Vorgabe einer Sortierung für eine
Column in einer SuperColumn oder in einer (Standard) Colum-
nFamily. Cassandra legt sie so ab und gibt sie auch so zurück.
Die Programmierschnittstelle bietet drei einfache Methoden
für das Abfragen, Einfügen und Löschen von Inhalten und ist
mit Thrift realisiert, einem Werkzeug von Facebook zur Gene-
rierung von Remote Procedure Calls für unterschiedliche Pro-
grammiersprachen. Cassandra migriert derzeit von Thrift RPC
zu Avro RPC.
Cassandra-Plattform
Die Architektur von Cassandra nutzt einige Schlüsseltech-
niken für verteilte Systeme. Die Mechanismen für Partitio-
nierung, Replizierung und Caching spielen beim Lesen und
Schreiben im Cassandra-Cluster zusammen. Typischerwei-
se stellt ein Client seine Anforderungen von Lese-/Schrei-
boperationen für einen Schlüssel an einen beliebigen Kno-
ten im Cluster. Dieser Knoten bestimmt dann die Repliken
für diesen Schlüssel im Cluster und fragt sie an. Der Storage
Proxy behandelt Leseoperationen je nach geforderter Con-
sistency:
H	ONE liefert das Ergebnis des ersten antwortenden Knotens.
H	QUORUM liefert das aktuellste Ergebnis der Mehrheit der
Repliken.
Abb. 2: Cassandra-Column
Column
Name Value Timestamp
„Vorname“ „Hugo“ 127001234
Abb. 3: Cassandra-(Standard)-ColumnFamily
ColumnFamily
Key Columns
„1“ Name Value Timestamp
„Vorname“ „Hugo“ 127001234
„Nachname“ „Müller“ 127001234
„2“ Name Value Timestamp
„Vorname“ „Anna“ 127001237
„Nachname“ „Schmidt“ 127001237
Abb. 4: Cassandra-(Super)-ColumnFamily
SuperColumn
Key Columns
„Post“ Name Value Timestamp
„Subject“ „Hugo“ 127001241
„Body“ „Lorem Ipsum“ 127001241
„Date“ „2010/08/01“ 127001241
„Tags“ Name Value Timestamp
„1“ „cloud“ 127001247
„2“ „nosql“ 127001247
Abb. 1: Cassandra-Datenmodell
www.javaspektrum.de 23
IntegrationsSpektrum
H	ALL liefert das aktuellste Ergebnis der Gesamtheit aller Rep-
liken.
Für Schreiboperationen sind die Konsistenzniveaus noch fein-
granularer:
H	ZERO schreibt asynchron im Hintergrund und bietet keine
Garantien.
H	ANY garantiert, dass mindestens eine Replik geschrieben
wurde.
H	ONE garantiert, dass mindestens eine Replik mit COMMIT-
LOG und MEMTABLE geschrieben wurde.
H	QUORUM garantiert, dass die Mehrheit der Knoten ge-
schrieben wurde.
H	ALL garantiert, dass die Gesamtheit der Repliken geschrie-
ben wurde.
Cassandra-Partitionierung
Die Fähigkeit zur schrittweisen Skalierung ist ein wesentliches
Merkmal von Cassandra. Dazu müssen die Daten dynamisch
den vorhandenen Knoten zugeteilt werden (Partitionierung)
und Cassandra verwendet dafür eine konsistente Hashfunkti-
on. Dabei wird der Wertebereich der Hashfunktion als Ring or-
ganisiert, in dem auf den höchsten Hashwert wieder der nied-
rigste Hashwert folgt. Jeder Knoten im Cassandra-Cluster be-
kommt auf diesem Ring einen Hashwert zugeordnet, das soge-
nannte Token.
Für jedes Key/Value-Paar wird für den Key (s. Abb. 5) der
Hashwert berechnet und im Ring das im Uhrzeigersinn nächst-
gelegene Token gesucht und das Key/Value-Paar auf diesem
Knoten gespeichert; dieser Knoten ist der Koordinator für das
Key/Value-Paar.
Jeder Knoten im Cassandra-Cluster ist also für die Key/
Value-Paare zuständig, deren Hashwerte zwischen dem eige-
nen Token und dem Token des Vorgängers im Ring liegen. Der
Eintritt oder Austritt eines Knotens betrifft nur den unmittel-
baren Vorgänger und Nachfolger im Ring und bleibt somit auf
die Operationen zur Behandlung des Hinzukommens bzw. des
Wegfalls eines Tokens auf nur drei Knoten beschränkt.
Dynamo und Cassandra optimieren die konsistente Hash-
funktion für ihre Zwecke übrigens etwas unterschiedlich –
Cassandra ist eben kein Dynamo-Klon.
Die Zuordnung von Key/Value-Paaren zu Knoten muss
keine Hashfunktionen benutzen. Über die Wahl der Partitio-
nierer lässt sich die Zuordnung von Keys zu Token anpassen.
Der RandomPartitioner verteilt typischerweise die Keys gut
und gleichmäßig, hat aber den Nachteil ineffizienter Bereichs-
abfragen (engl. range query); der OrderPreservingPartitioner
erlaubt effiziente Bereichsabfragen und birgt die Gefahr einer
schlechten und ungleichmäßigen Verteilung der Schlüssel.
Cassandra-Replizierung
Jedes Key/Value-Paar wird auf mehreren Knoten repliziert;
die Zahl der Repliken im Cassandra-Cluster ist über den Re-
Abb. 6: Neuer Schlüssel
Abb. 7: Neuer Knoten
Abb. 5: Neuer Schlüssel
ColumnFamily
Key SuperColumns
„Post001“ Key Columns
„Post“ Name Value Timestamp
„Subject“ „Hugo“ 127001241
„Body“ „Lorem Ipsum“ 127001241
„Date“ „2010/08/01“ 127001241
„Tags“ Name Value Timestamp
„1“ „cloud“ 127001247
„2“ „nosql“ 127001247
„Post002“ Key Columns
„Post“ Name Value Timestamp
„Subject“
„0.6.3
Released“
127001249
„Body“ „Lorem Ipsum“ 127001249
„Date“ „2010/06/30“ 127001249
„Tags“ Name Value Timestamp
„1“ „apache“ 127001249
„2“ „cassandra“ 127001249
„3“ „java“ 127001249
JavaSPEKTRUM 6/201024
IntegrationsSpektrum
plicationFactor (N) konfigurierbar. Der Koordinator ist für die
Replikation auf (N-1) Knoten zuständig. Für die Auswahl von
Knoten für die Repliken bietet Cassandra mehrere Optionen an
und kann dabei auch die Topologie der Racks* und Rechenzen-
tren einbeziehen (rack.properties, datacenter.properties):
H	RackUnaware platziert N-1 Repliken auf den nachfolgenden
Knoten im Ring.
H	RackAware platziert die zweite Replik in einem anderen
Rechenzentrum und die weiteren N-2 Repliken auf anderen
Racks im gleichen Rechenzentrum.
H	DatacenterShard platziert M Repliken in einem anderen
Rechenzentrum und weitere (N-M-1) Repliken auf anderen
Racks im gleichen Rechenzentrum.
Eigene Strategien für die Replikation können über die Klasse
org.apache.cassandra.locator.AbstractReplicationStrategy implemen-
tiert werden.
Cassandra-Caching
Cassandra kennt zwei Speicherebenen auf jedem Knoten
im Cassandra-Cluster. Die MEMTABLEs befinden sich im
Hauptspeicher und COMMITLOG und SSTABLEs (Sorted
String Table) liegen im Dateisystem. Das sequenzielle und
rollierende COMMITLOG liegt im Dateisystem – am besten
auf einer eigenen Platte. Für jede ColumnFamily gibt es ei-
ne MEMTABLE, in der Key/Value-Paare sortiert nach Schlüs-
seln vorgehalten werden. Ebenso gönnt sich jede ColumnFa-
mily eine SSTABLE.
Für jede SSTABLE gibt es drei Dateien im Dateisystem. Eine
Datendatei nimmt die Key/Value-Paare sortiert nach Keys auf.
Eine Indexdatei liefert die Verweise in die Datendatei als Key/
Offset-Paare. Die Filterdatei enthält Buckets für einen Bloom-
Filter. Dieser dient der effizienten Prüfung, ob ein Key zur
Menge der Keys in der Datendatei gehört.
Dabei werden für alle Keys der Menge mehrere Hashfunk-
tionen berechnet und dann die entsprechenden Buckets für
jeden Hashwert markiert. Für einen gesuchten Key werden
ebenfalls die Hashwerte berechnet und die Buckets mit dem
Bloom-Filter abgeglichen. Wenn alle Buckets markiert sind, ge-
hört der Key wahrscheinlich zur Menge; wenn nur ein Bucket
nicht markiert ist, gehört er sicher nicht dazu.
Das Dateisystem eines Knotens im Cassandra-Cluster besitzt
also folgenden schematischen Aufbau:
./commitlog/CommitLog-ID.log
./data/KEYSPACE/COLUMN_FAMILY-N-Data.db
./data/KEYSPACE/COLUMN_FAMILY-N-Filter.db
./data/KEYSPACE/COLUMN_FAMILY-N-Index.db
...
./system.log
Beim Schreiben wird die Änderung zunächst ins COMMIT-
LOG geschrieben und anschließend in der MEMTABLE nach-
gezogen. Von Zeit zu Zeit wird die MEMTABLE als SSTABLE
herausgeschrieben (flush). Ein automatisches Herausschreiben
wird angestoßen, wenn einer von drei Schwellwerten über-
schritten wird: Menge der Daten in der MEMTABLE, Anzahl
der Columns in der MEMTABLE und Lebensdauer der MEM-
TABLE. Für ein manuelles Herausschreiben steht ein Werkzeug
zur Verfügung. Nach dem Herausschreiben wird eine SSTAB-
LE nicht mehr geändert. Schreiboperationen benötigen für ih-
re Änderungen am Ende des COMMITLOG und in der MEM-
TABLE wenig Zeit und erreichen in einem Cluster mit genü-
gend vielen Knoten zur Lastverteilung schier atemberauben-
de Durchsatzraten.
Beim Lesen werden die angeforderten Daten aus der MEM-
TABLE und allen SSTABLEs aufgesammelt. Auch mit Bloom-
Filtern zur Optimierung fallen dabei einige Zugriffe im Datei-
system an. Um die Zahl der anzusprechenden SSTABLEs für
die Leseoperationen zu minimieren, werden gelegentlich meh-
rere alte SSTABLEs zu einer neuen SSTABLE zusammengefasst
(compact).
Beispiele mit Cassandra
Cassandra ist schnell installiert. Einfach die Binärdistribution
entpacken und CommitLogDirectory und DataFileDirectory
in der Datei conf/storage-conf.xml geeignet setzen. Cassandra
benötigt in aktuellen Versionen Unterstützung für Java 6. Für
den Start des Servers reicht ein einfaches
bin/cassandra -f
Drei virtuelle Maschinen unter VirtualBox oder VMware
Player/Workstation oder auch drei Instanzen in der Elastic
Compute Cloud (EC2) von Amazon reichen für erste Expe-
rimente mit Partitionierung, Replizierung und Caching voll-
kommen aus.
Beispiel-Partitionierung
Nach dem Start des ersten Servers gibt man mit Kommando-
zeilenwerkzeug 1000 Datensätze ein.
$ bin/cassandra-cli --host XXX.YYY.ZZZ.231 --port 9160
cassandra> set Keyspace1.Standard2['jsmith1000']['first'] = 'John'
cassandra> set Keyspace1.Standard2['jsmith1000']['last'] = 'Smith'
cassandra> set Keyspace1.Standard2['jsmith1000']['age'] = '42'
cassandra> set Keyspace1.Standard2['jsmith1001']['first'] = 'John'
...
Sicher strotzen die Datensätze nicht gerade vor Kreativität und
Fantasie. Aber sie zeigen das Phänomen und darum geht es ja
zum Einstieg.
Der erste Server ist ein sogenannter SEED-Server. Bei sei-
ner Konfiguration bekommt die <seed> den Wert „127.0.0.1“
und <AutoBootstrap> wird auf den Wert „false“ gesetzt. Bei
der Konfiguration des zweiten und dritten Servers (das sind
sogenannte NON-SEED-Server) bekommt <seed> jeweils die
IP-Adresse des ersten Servers und AutoBootstrap wird auf den
Wert „true“ gesetzt.
Diese Einstellungen liegen in der Datei conf/storage-conf.
xml. Für den ersten Server passen die Grundeinstellungen; erst
für den zweiten und dritten Server müssen die Anpassungen
erfolgen. Im Oktober 2010 soll übrigens Cassandra 0.7 kom-
men. Dann wandern die Einstellungen in die Datei conf/cas-
sandra.yaml.
Das Ergebnis zeigt ein weiteres Werkzeug.
$ bin/nodetool -host XXX.YYY.ZZZ.233 ring	 5
* Der Begriff Rack steht für ein genormtes Rechnergestell für mehrere Rechner im
Rechenzentrum. Die Racks für Rechenzentren sind etwa 2 Meter hoch und bieten
Platz für 42 Höheneinheiten; eine Höheneinheit ist mit 1,75 Zoll (4,45 cm) spezifi-
ziert. Die Geräte weisen Bauhöhen mit ganzzahligen Vielfachen von einer Höhen-
einheit auf und haben genormte Breiten von 19 Zoll (48,26 cm). Racks gibt es in
Bautiefen von 60, 80, 100 oder 120 cm und Baubreiten von 60, 70 oder 80 cm.
Die größeren Baubreiten bieten seitliche Kanäle für Netz, Strom und Luft. Die Racks
können mit Seitenwänden und Türen zu Schränken geschlossen werden.
www.javaspektrum.de 25
IntegrationsSpektrum
Lothar Wieske ist Unternehmensarchitekt
für Innovationsmanagement bei der DB Systel GmbH
(ICT Tochter im Deutsche Bahn Konzern). Vorher hat
er u. a. im Consulting für IBM, Microsoft und Sun
Microsystems gearbeitet und schöpft aus Erfahrungen
in Finance, Health und Transport & Logistics.
Er beschäftigt sich schwerpunktmäßig mit Cloud
Computing und ist Autor eines Fachbuchs.
E-Mail: lothar.wieske@deutschebahn.com
Address Status Load Range Ring
1375...
XXX.YYY.ZZZ.233 Up 495 bytes 521... |<--|
XXX.YYY.ZZZ.232 Up 495 bytes 1368... | |
XXX.YYY.ZZZ.231 Up 495 bytes 1375... |-->|
Beispiel-Caching
Die niedrige Zahl bei Load erklärt sich aus dem Caching, denn
hier wird nur Festplattenbelegung angezeigt – die MEMTABLE
leert man mit nodetool ... flush. Jetzt kann man der Reihe nach
den ersten und zweiten Server außer Betrieb nehmen
$ bin/cassandra-cli --host XXX.YYY.ZZZ.231 decommission
$ bin/cassandra-cli --host XXX.YYY.ZZZ.232 decommission
und schaut sich wieder den Ring an: Die 1000 Datensätze sind
vom ersten auf den dritten Server umgezogen.
Beispiel-Replizierung
In der Datei conf/storage-conf.xml kann man dann den Repli-
cationFactor erhöhen und den Ablauf wiederholen.
Im Kleinen verhilft dieses Vorgehen zum Verständnis der
Abläufe bei Partitionierung, Replizierung und Caching und
des Betriebs eines verteilten, skalierbaren Datastores.
Zusammenfassung
Apache Cassandra hebt ein Bigtable-Datenmodell [Big06] auf
eine Dynamo-Plattform [Dyn06] und kann prominente Ein-
satzszenarien vorweisen. Der erfolgreiche Einstieg ins Cloud
Computing und insbesondere die Arbeit mit oder der Aufbau
von geeigneten Speicherkonzepten setzt einerseits eine theo-
retische Kenntnis der Klassiker wie Bigtable und Dynamo vo-
raus und andererseits die praktische Arbeit mit einem frei ver-
fügbaren System wie Cassandra. Darüber hinaus zeigen die
verbauten Entwurfsmuster bei Cassandra, dass elastische und
robuste Systeme auf einfachen Prinzipien beruhen und gera-
de deswegen zu beeindruckender Größe und Form auflaufen.
Vielleicht konnte dieser Artikel den Appetit für eigene Vertie-
fungen anregen. Viel Spaß dabei.
Literatur
[Abe08] B. Simic, Customers Are Won or Lost in One Second,
Whitepaper Aberdeen Group, November 2008,
http://www.gomez.com/download/Aberdeen_WebApps.pdf
[Big06] F. Chang, J. Dean, S. Ghemawat, W. C. Hsieh,
D. A. Wallach, M. Burrows, T. Chandra, A. Fikes, R. E. Gruber,
Bigtable: A Distributed Storage System for Structured Data,
ODSI 2006,
http://static.googleusercontent.com/external_content/untrusted_dlcp/
labs.google.com/de//papers/bigtable-osdi06.pdf
[Brew00] E. A. Brewer, Towards Robust Distributed Systems,
PODC Keynote, 19.7.2000,
http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf
[Cassandra] http://cassandra.apache.org
[Dyn06] G. DeCandia, D. Hastorun, M. Jampani, G. Kakulapati,
A. Lakshman, A. Pilchin, S. Sivasubramanian, P. Vosshall,
W. Vogels, Dynamo: Amazon's Highly Available Key-Value
Store, Proc. of the 21st ACM Symposium on Operating Systems
Principles, Oktober 2007,
http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo-
sosp2007.pdf
[GiLy02] S. Gilbert, N. Lynch, Brewer’s Conjecture and the Feasi-
bility of Consistent, Available, Partition-Tolerant Web Services,
http://lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf
[Kli10] M. Kliehm, Web Performance Optimierung,
Vortrag am 17.5.2010 beim Webmontag in Frankfurt,
http://www.slideshare.net/kliehm/performancewmfra
[Vog08] W. Vogel, Eventually Consistent – Revisited,
http://www.allthingsdistributed.com/2008/12/eventually_consistent.html
[Wies10] L. Wieske, Dateisysteme und Datenbanken im Cloud
Computing, in: JavaSPEKTRUM, 5/2010

Weitere ähnliche Inhalte

Ähnlich wie Cassandra – die NoSQL-Datenbank für große Mengen und schnelle Zugriffe

OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...AWS Germany
 
Webinar S3 für Fortgeschrittene
Webinar S3 für FortgeschritteneWebinar S3 für Fortgeschrittene
Webinar S3 für FortgeschritteneAWS Germany
 
Cloud-native Applikationen
Cloud-native ApplikationenCloud-native Applikationen
Cloud-native ApplikationenQAware GmbH
 
Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)Dietmar Leher
 
Apex on the Rocks - Hochverfügbarkeit
Apex on the Rocks - HochverfügbarkeitApex on the Rocks - Hochverfügbarkeit
Apex on the Rocks - HochverfügbarkeitStefan Witwicki
 
Big Data Webinar (Deutsch)
Big Data Webinar (Deutsch)Big Data Webinar (Deutsch)
Big Data Webinar (Deutsch)AWS Germany
 
Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)Andreas Buckenhofer
 
Private Cloud mit Open Source
Private Cloud mit Open SourcePrivate Cloud mit Open Source
Private Cloud mit Open SourceDaniel Schneller
 
6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) Frameworks6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) FrameworksSteffen Schloenvoigt
 
Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02
Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02
Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02Gunther Pippèrr
 
Where are all transactions gone? Was in_der_cloud_alles_verboten_ist
Where are all transactions gone? Was in_der_cloud_alles_verboten_istWhere are all transactions gone? Was in_der_cloud_alles_verboten_ist
Where are all transactions gone? Was in_der_cloud_alles_verboten_istRamon Anger
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdAOE
 
Die SOA Suite in der Amazon Cloud sicher betreiben
Die SOA Suite in der Amazon Cloud sicher betreiben Die SOA Suite in der Amazon Cloud sicher betreiben
Die SOA Suite in der Amazon Cloud sicher betreiben OPITZ CONSULTING Deutschland
 
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die CloudSQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die CloudAWS Germany
 
Cloud-native Apps 2.0
Cloud-native Apps 2.0Cloud-native Apps 2.0
Cloud-native Apps 2.0QAware GmbH
 
Skalierung & Performance
Skalierung & PerformanceSkalierung & Performance
Skalierung & Performanceglembotzky
 

Ähnlich wie Cassandra – die NoSQL-Datenbank für große Mengen und schnelle Zugriffe (20)

Zeitreihen in Apache Cassandra
Zeitreihen in Apache CassandraZeitreihen in Apache Cassandra
Zeitreihen in Apache Cassandra
 
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
OOP 2014 SQL oder NoSQL - die Auswahl der richtigen Datenbankplattform für di...
 
Webinar S3 für Fortgeschrittene
Webinar S3 für FortgeschritteneWebinar S3 für Fortgeschrittene
Webinar S3 für Fortgeschrittene
 
Cloud-native Applikationen
Cloud-native ApplikationenCloud-native Applikationen
Cloud-native Applikationen
 
Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)Datenbanken - Eine Übersicht (WPMeetUP München)
Datenbanken - Eine Übersicht (WPMeetUP München)
 
Apex on the Rocks - Hochverfügbarkeit
Apex on the Rocks - HochverfügbarkeitApex on the Rocks - Hochverfügbarkeit
Apex on the Rocks - Hochverfügbarkeit
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Big Data Webinar (Deutsch)
Big Data Webinar (Deutsch)Big Data Webinar (Deutsch)
Big Data Webinar (Deutsch)
 
Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)Wide-column Stores für Architekten (HBase, Cassandra)
Wide-column Stores für Architekten (HBase, Cassandra)
 
Private Cloud mit Open Source
Private Cloud mit Open SourcePrivate Cloud mit Open Source
Private Cloud mit Open Source
 
Wir sind aber nicht Twitter
Wir sind aber nicht TwitterWir sind aber nicht Twitter
Wir sind aber nicht Twitter
 
6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) Frameworks6 - Sprachen des Semantic Web - RDF(S) Frameworks
6 - Sprachen des Semantic Web - RDF(S) Frameworks
 
Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02
Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02
Doag 2104 manuskript_hadoop_oracle_integration_gunther_pipperr_v02
 
Where are all transactions gone? Was in_der_cloud_alles_verboten_ist
Where are all transactions gone? Was in_der_cloud_alles_verboten_istWhere are all transactions gone? Was in_der_cloud_alles_verboten_ist
Where are all transactions gone? Was in_der_cloud_alles_verboten_ist
 
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von AngrybirdCloud Deployment und (Auto)Scaling am Beispiel von Angrybird
Cloud Deployment und (Auto)Scaling am Beispiel von Angrybird
 
Node.js
Node.jsNode.js
Node.js
 
Die SOA Suite in der Amazon Cloud sicher betreiben
Die SOA Suite in der Amazon Cloud sicher betreiben Die SOA Suite in der Amazon Cloud sicher betreiben
Die SOA Suite in der Amazon Cloud sicher betreiben
 
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die CloudSQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
SQL oder NoSQL - Die Auswahl der richtigen Datenbankplattform für die Cloud
 
Cloud-native Apps 2.0
Cloud-native Apps 2.0Cloud-native Apps 2.0
Cloud-native Apps 2.0
 
Skalierung & Performance
Skalierung & PerformanceSkalierung & Performance
Skalierung & Performance
 

Mehr von Lothar Wieske

Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019
Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019
Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019Lothar Wieske
 
Chaos Engineering Here We_Go
Chaos Engineering Here We_GoChaos Engineering Here We_Go
Chaos Engineering Here We_GoLothar Wieske
 
Blockchain IoT Night / 25th Oct 2017
Blockchain IoT Night / 25th Oct 2017Blockchain IoT Night / 25th Oct 2017
Blockchain IoT Night / 25th Oct 2017Lothar Wieske
 
Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017
Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017
Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017Lothar Wieske
 
Amazon Web Services: Flaggschiff des Cloud Computings
Amazon Web Services: Flaggschiff des Cloud ComputingsAmazon Web Services: Flaggschiff des Cloud Computings
Amazon Web Services: Flaggschiff des Cloud ComputingsLothar Wieske
 
Cloud Computing - Technology Radar 2015 / Apr 27th 2015
Cloud Computing - Technology Radar 2015 / Apr 27th 2015Cloud Computing - Technology Radar 2015 / Apr 27th 2015
Cloud Computing - Technology Radar 2015 / Apr 27th 2015Lothar Wieske
 
Vom Utility Computing zum Cloud Computing
Vom Utility Computing zum Cloud ComputingVom Utility Computing zum Cloud Computing
Vom Utility Computing zum Cloud ComputingLothar Wieske
 
Organizational Patterns for Cloud Computing / Apr 7th 2014
Organizational Patterns for Cloud Computing / Apr 7th 2014Organizational Patterns for Cloud Computing / Apr 7th 2014
Organizational Patterns for Cloud Computing / Apr 7th 2014Lothar Wieske
 

Mehr von Lothar Wieske (8)

Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019
Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019
Innovation im Spannungsfeld des „Weg-Von“ und dem „Hin-Zu“ - 19/11/2019
 
Chaos Engineering Here We_Go
Chaos Engineering Here We_GoChaos Engineering Here We_Go
Chaos Engineering Here We_Go
 
Blockchain IoT Night / 25th Oct 2017
Blockchain IoT Night / 25th Oct 2017Blockchain IoT Night / 25th Oct 2017
Blockchain IoT Night / 25th Oct 2017
 
Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017
Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017
Blockchains - Architecture Overview and Consenus Models - Apr 26th, 2017
 
Amazon Web Services: Flaggschiff des Cloud Computings
Amazon Web Services: Flaggschiff des Cloud ComputingsAmazon Web Services: Flaggschiff des Cloud Computings
Amazon Web Services: Flaggschiff des Cloud Computings
 
Cloud Computing - Technology Radar 2015 / Apr 27th 2015
Cloud Computing - Technology Radar 2015 / Apr 27th 2015Cloud Computing - Technology Radar 2015 / Apr 27th 2015
Cloud Computing - Technology Radar 2015 / Apr 27th 2015
 
Vom Utility Computing zum Cloud Computing
Vom Utility Computing zum Cloud ComputingVom Utility Computing zum Cloud Computing
Vom Utility Computing zum Cloud Computing
 
Organizational Patterns for Cloud Computing / Apr 7th 2014
Organizational Patterns for Cloud Computing / Apr 7th 2014Organizational Patterns for Cloud Computing / Apr 7th 2014
Organizational Patterns for Cloud Computing / Apr 7th 2014
 

Cassandra – die NoSQL-Datenbank für große Mengen und schnelle Zugriffe

  • 1. www.javaspektrum.de 21 IntegrationsSpektrum Cassandra, ich hör Dich rufen Cassandra – die NoSQL-Datenbank für große Mengen und schnelle Zugriffe Lothar Wieske Cloud Computing stellt höchste Anforderungen an Dateisysteme und Datenbanken. Mit Klassikern wie dem Google Bigtable und Amazon Dynamo haben die Pioniere neue Architekturkonzepte hervorgebracht. Apache Cassandra (Facebook) ist ein Beispiel für eine verteilte, ska- lierbare, performante und schemafreie Datenbank mit Eventual Con- sistency. Cassandra hebt ein Bigtable-Datenmodell auf eine Dynamo- Plattform, d. h. Cassandra bietet einen strukturierten Speicher für Schlüssel/Werte-Zuordnungen mit Eventual Consistency. Cassandra ist in Java implementiert und lädt zum Experimentieren ein. E Antwortzeiten, Antwortzeiten, Antwortzeiten ... und im- mer an die Anwender denken. In einer Untersuchung mit dem Titel „Customers are Lost or Won in One Second“ hat die Aberdeen Group Best Practices zur Optimierung der Per- formanz von Webanwendungen in Unternehmen untersucht [Abe08]. Die Teilnehmer der Untersuchung verbanden eindeu- tige geschäftliche und wirtschaftliche Zielsetzungen mit den technischen Optimierungen: zufriedenere Kunden, produkti- vere Mitarbeiter, niedrigere Infrastrukturkosten und weniger Störungen bei zentralen Geschäftsprozessen. Und die Schlüs- selaussagen der Studie rütteln auf: H „... business performance (as measured by customer satisfaction, conversions, etc.) begins to suffer at 5.1 seconds of delay in re- sponse times of web applications ...“ H „... only one second of additional delay in the response times of web applications could significantly impact some of the top business goals ...“ H „... One second delay in response times of Web applications can impact customer satisfaction by up to 16% ...“ Wer konkrete Zahlen für einzelne Unternehmen sucht, findet sie beispielsweise im Vortrag von Martin Kliehm, Senior Fron- tend Engineer bei Namics [Kli10]: H Amazon: 100 ms Verzögerung => -1 % Umsatz H Bing: 2000 ms Verzögerung => -4,3 % Umsatz H Google: 400 ms Verzögerung => -0,59 % Suchen pro Anwender H Yahoo!: 400 ms Verzögerung => 5-9 % weniger Datenverkehr Seien es Warenumsätze oder Werbeeinnahmen, bei Unter- nehmen dieser Größenordnung geht es bei solchen Rück- gängen um viel Geld und große Verluste. Da muss die In- frastruktur rund um die Uhr laufen und durch hohe Ver- fügbarkeit und niedrige Verzögerungen glänzen, im direk- ten Interaktionsverhalten genauso wie bei den Services im Hintergrund. Die virtuellen Warenkörbe der Kunden eines Internethändlers beispielsweise müssen bei jederzeitiger Les- und Schreibbarkeit das Abrauchen eines einzelnen Ser- vers wie auch das Wegbrechen eines ganzen Rechenzent- rums überleben. Genau diese hochverfügbaren Warenkörbe bietet Dynamo bei Amazon. Die großen Suchmaschinen Google und Yahoo! haben mit Bigtable und PNUTS ähnliche Systeme aufgebaut. CAP-Theorem und Eventual Consistency Wie schon in [Wies10] ausgeführt, hat Eric Brewer, seinerzeit Professor an der Universität Stanford und Mitgründer der Ink- tomi Corporation, in seiner Keynote beim ACM Symposium on the Principles of Distributed Computing [Brew00] die An- wendungsklassen H ACID (Atomicity, Consistency, Isolation, Durability) und H BASE (Basically Available, Soft State und Eventual Consis- tency) als widerstreitende Extreme in einem Kontinuum möglicher Informationsarchitekturen unterschieden. Im Kern seines Vor- trags stand eine Vermutung bezüglich Consistency, Availability und Partition Tolerance: „You can have at most two of three prop- erties in any shared-data system.“ Im Jahr 2002 haben Seth Gil- bert und Nancy Lynch vom MIT die Vermutung formal bewie- sen und sie damit zum Brewer-Theorem oder auch CAP-Theo- rem erhoben [GiLy02]. Strong Consistency gibt es in zwei Ausbaustufen für die Entitäten im Datenbanksystem. Der einfachere Fall klammert alle Änderungen für eine einzelne Entität, der schwierigere Fall klammert viele Änderungen in einer ganzen Sammlung von Entitäten. Möglicherweise liegen diese Entitäten sogar in mehreren Datenbanken oder Nachrichtensystemen und die müssen dann mit einem Transaktionsmonitor koordiniert wer- den. Und diese Strong Consistency – eine „Angewohnheit“ bei Unternehmensanwendungen – muss es gar nicht immer sein. Eventual Consistency kommt wesentlich entspannter daher, genügt in vielen Fällen vollauf und erschließt ganz neue Berei- che für die Availability. Und beim Cloud Computing spielen Systeme mit Eventual Consistency vom Beginn an eine tragen- de Rolle [Vog08]. Im Folgenden geht es um Cassandra, eine „Not only SQL“- Datenbank mit Eventual Consistency. Apache Cassandra Cassandra ist ein verteiltes Datenbanksystem für viele Daten und große Lasten. Facebook hat es als Speichersystem für die
  • 2. JavaSPEKTRUM 6/201022 IntegrationsSpektrum Suche in den Eingangskörben der Postfächer mit ca. 100 Milli- onen Benutzern entwickelt und im Juni 2008 in Betrieb genom- men. Nach der Freigabe als Open-Source-Projekt im Juli 2008 firmiert Apache Cassandra seit Februar 2010 als Top-Level-Pro- jekt der Apache Software Foundation [Cassandra]. Jonathan Ellis ist Project Lead, war bis vor kurzem Mitarbeiter von Rack- space und hat jetzt seine eigene Firma Riptano gegründet, die Service und Support für Cassandra anbietet. Cassandra wird heute bei Facebook, Digg, Twitter, Reddit, Rackspace, Cloudkick, Cisco, SimpleGeo, Ooyala, OpenX und anderen bekannten Unternehmen eingesetzt. Das größte be- kannte Cassandra-Cluster im Produktionsbetrieb hat mehr als 150 Knoten mit einem Datenvolumen von mehr als 100 Terabyte. Cassandra-Datenmodell Das Datenmodell von Cassandra (s. Abb. 1) beruht auf den Konzepten Column, SuperColumn und ColumnFamily. Eine Column ist ein Tripel (name, value, timestamp) mit einem binä- ren Namen, einem binären Wert und einem Zeitstempel. Eine ColumnFamily bündelt in Rows geordnete Listen von Columns. Der Zugriff auf eine Row erfolgt über den Key und innerhalb der Row auf die Column über deren Name. Eine Su- perColumn bündelt ebenso wie eine ColumnFamily Listen von Columns. Die Visualisierungen für eine Column-Family und eine SuperColumn sind also gleich – Austauschen der Bezeich- nung ganz oben genügt. Mit einer SuperColumn erhält eine ColumnFamily noch ei- ne Schachtelungstiefe mehr. Denn eine ColumnFamily bündelt neben Columns auch SuperColumns – nur keine Mischung aus beiden. Abbildung 3 gilt also für eine Standard-ColumnFamily. Abbildung 4 zeigt eine Super ColumnFamily. Oberhalb der ColumnFamily gibt es nur noch den sogenann- ten Keyspace – die Keys im Keyspace bestimmen letztlich, auf welchen Knoten im Cluster die zugehörige ColumnFamily ge- speichert wird. Anwendungen optimieren die Ablage und Abfrage von In- halten in Cassandra durch die Vorgabe einer Sortierung für eine Column in einer SuperColumn oder in einer (Standard) Colum- nFamily. Cassandra legt sie so ab und gibt sie auch so zurück. Die Programmierschnittstelle bietet drei einfache Methoden für das Abfragen, Einfügen und Löschen von Inhalten und ist mit Thrift realisiert, einem Werkzeug von Facebook zur Gene- rierung von Remote Procedure Calls für unterschiedliche Pro- grammiersprachen. Cassandra migriert derzeit von Thrift RPC zu Avro RPC. Cassandra-Plattform Die Architektur von Cassandra nutzt einige Schlüsseltech- niken für verteilte Systeme. Die Mechanismen für Partitio- nierung, Replizierung und Caching spielen beim Lesen und Schreiben im Cassandra-Cluster zusammen. Typischerwei- se stellt ein Client seine Anforderungen von Lese-/Schrei- boperationen für einen Schlüssel an einen beliebigen Kno- ten im Cluster. Dieser Knoten bestimmt dann die Repliken für diesen Schlüssel im Cluster und fragt sie an. Der Storage Proxy behandelt Leseoperationen je nach geforderter Con- sistency: H ONE liefert das Ergebnis des ersten antwortenden Knotens. H QUORUM liefert das aktuellste Ergebnis der Mehrheit der Repliken. Abb. 2: Cassandra-Column Column Name Value Timestamp „Vorname“ „Hugo“ 127001234 Abb. 3: Cassandra-(Standard)-ColumnFamily ColumnFamily Key Columns „1“ Name Value Timestamp „Vorname“ „Hugo“ 127001234 „Nachname“ „Müller“ 127001234 „2“ Name Value Timestamp „Vorname“ „Anna“ 127001237 „Nachname“ „Schmidt“ 127001237 Abb. 4: Cassandra-(Super)-ColumnFamily SuperColumn Key Columns „Post“ Name Value Timestamp „Subject“ „Hugo“ 127001241 „Body“ „Lorem Ipsum“ 127001241 „Date“ „2010/08/01“ 127001241 „Tags“ Name Value Timestamp „1“ „cloud“ 127001247 „2“ „nosql“ 127001247 Abb. 1: Cassandra-Datenmodell
  • 3. www.javaspektrum.de 23 IntegrationsSpektrum H ALL liefert das aktuellste Ergebnis der Gesamtheit aller Rep- liken. Für Schreiboperationen sind die Konsistenzniveaus noch fein- granularer: H ZERO schreibt asynchron im Hintergrund und bietet keine Garantien. H ANY garantiert, dass mindestens eine Replik geschrieben wurde. H ONE garantiert, dass mindestens eine Replik mit COMMIT- LOG und MEMTABLE geschrieben wurde. H QUORUM garantiert, dass die Mehrheit der Knoten ge- schrieben wurde. H ALL garantiert, dass die Gesamtheit der Repliken geschrie- ben wurde. Cassandra-Partitionierung Die Fähigkeit zur schrittweisen Skalierung ist ein wesentliches Merkmal von Cassandra. Dazu müssen die Daten dynamisch den vorhandenen Knoten zugeteilt werden (Partitionierung) und Cassandra verwendet dafür eine konsistente Hashfunkti- on. Dabei wird der Wertebereich der Hashfunktion als Ring or- ganisiert, in dem auf den höchsten Hashwert wieder der nied- rigste Hashwert folgt. Jeder Knoten im Cassandra-Cluster be- kommt auf diesem Ring einen Hashwert zugeordnet, das soge- nannte Token. Für jedes Key/Value-Paar wird für den Key (s. Abb. 5) der Hashwert berechnet und im Ring das im Uhrzeigersinn nächst- gelegene Token gesucht und das Key/Value-Paar auf diesem Knoten gespeichert; dieser Knoten ist der Koordinator für das Key/Value-Paar. Jeder Knoten im Cassandra-Cluster ist also für die Key/ Value-Paare zuständig, deren Hashwerte zwischen dem eige- nen Token und dem Token des Vorgängers im Ring liegen. Der Eintritt oder Austritt eines Knotens betrifft nur den unmittel- baren Vorgänger und Nachfolger im Ring und bleibt somit auf die Operationen zur Behandlung des Hinzukommens bzw. des Wegfalls eines Tokens auf nur drei Knoten beschränkt. Dynamo und Cassandra optimieren die konsistente Hash- funktion für ihre Zwecke übrigens etwas unterschiedlich – Cassandra ist eben kein Dynamo-Klon. Die Zuordnung von Key/Value-Paaren zu Knoten muss keine Hashfunktionen benutzen. Über die Wahl der Partitio- nierer lässt sich die Zuordnung von Keys zu Token anpassen. Der RandomPartitioner verteilt typischerweise die Keys gut und gleichmäßig, hat aber den Nachteil ineffizienter Bereichs- abfragen (engl. range query); der OrderPreservingPartitioner erlaubt effiziente Bereichsabfragen und birgt die Gefahr einer schlechten und ungleichmäßigen Verteilung der Schlüssel. Cassandra-Replizierung Jedes Key/Value-Paar wird auf mehreren Knoten repliziert; die Zahl der Repliken im Cassandra-Cluster ist über den Re- Abb. 6: Neuer Schlüssel Abb. 7: Neuer Knoten Abb. 5: Neuer Schlüssel ColumnFamily Key SuperColumns „Post001“ Key Columns „Post“ Name Value Timestamp „Subject“ „Hugo“ 127001241 „Body“ „Lorem Ipsum“ 127001241 „Date“ „2010/08/01“ 127001241 „Tags“ Name Value Timestamp „1“ „cloud“ 127001247 „2“ „nosql“ 127001247 „Post002“ Key Columns „Post“ Name Value Timestamp „Subject“ „0.6.3 Released“ 127001249 „Body“ „Lorem Ipsum“ 127001249 „Date“ „2010/06/30“ 127001249 „Tags“ Name Value Timestamp „1“ „apache“ 127001249 „2“ „cassandra“ 127001249 „3“ „java“ 127001249
  • 4. JavaSPEKTRUM 6/201024 IntegrationsSpektrum plicationFactor (N) konfigurierbar. Der Koordinator ist für die Replikation auf (N-1) Knoten zuständig. Für die Auswahl von Knoten für die Repliken bietet Cassandra mehrere Optionen an und kann dabei auch die Topologie der Racks* und Rechenzen- tren einbeziehen (rack.properties, datacenter.properties): H RackUnaware platziert N-1 Repliken auf den nachfolgenden Knoten im Ring. H RackAware platziert die zweite Replik in einem anderen Rechenzentrum und die weiteren N-2 Repliken auf anderen Racks im gleichen Rechenzentrum. H DatacenterShard platziert M Repliken in einem anderen Rechenzentrum und weitere (N-M-1) Repliken auf anderen Racks im gleichen Rechenzentrum. Eigene Strategien für die Replikation können über die Klasse org.apache.cassandra.locator.AbstractReplicationStrategy implemen- tiert werden. Cassandra-Caching Cassandra kennt zwei Speicherebenen auf jedem Knoten im Cassandra-Cluster. Die MEMTABLEs befinden sich im Hauptspeicher und COMMITLOG und SSTABLEs (Sorted String Table) liegen im Dateisystem. Das sequenzielle und rollierende COMMITLOG liegt im Dateisystem – am besten auf einer eigenen Platte. Für jede ColumnFamily gibt es ei- ne MEMTABLE, in der Key/Value-Paare sortiert nach Schlüs- seln vorgehalten werden. Ebenso gönnt sich jede ColumnFa- mily eine SSTABLE. Für jede SSTABLE gibt es drei Dateien im Dateisystem. Eine Datendatei nimmt die Key/Value-Paare sortiert nach Keys auf. Eine Indexdatei liefert die Verweise in die Datendatei als Key/ Offset-Paare. Die Filterdatei enthält Buckets für einen Bloom- Filter. Dieser dient der effizienten Prüfung, ob ein Key zur Menge der Keys in der Datendatei gehört. Dabei werden für alle Keys der Menge mehrere Hashfunk- tionen berechnet und dann die entsprechenden Buckets für jeden Hashwert markiert. Für einen gesuchten Key werden ebenfalls die Hashwerte berechnet und die Buckets mit dem Bloom-Filter abgeglichen. Wenn alle Buckets markiert sind, ge- hört der Key wahrscheinlich zur Menge; wenn nur ein Bucket nicht markiert ist, gehört er sicher nicht dazu. Das Dateisystem eines Knotens im Cassandra-Cluster besitzt also folgenden schematischen Aufbau: ./commitlog/CommitLog-ID.log ./data/KEYSPACE/COLUMN_FAMILY-N-Data.db ./data/KEYSPACE/COLUMN_FAMILY-N-Filter.db ./data/KEYSPACE/COLUMN_FAMILY-N-Index.db ... ./system.log Beim Schreiben wird die Änderung zunächst ins COMMIT- LOG geschrieben und anschließend in der MEMTABLE nach- gezogen. Von Zeit zu Zeit wird die MEMTABLE als SSTABLE herausgeschrieben (flush). Ein automatisches Herausschreiben wird angestoßen, wenn einer von drei Schwellwerten über- schritten wird: Menge der Daten in der MEMTABLE, Anzahl der Columns in der MEMTABLE und Lebensdauer der MEM- TABLE. Für ein manuelles Herausschreiben steht ein Werkzeug zur Verfügung. Nach dem Herausschreiben wird eine SSTAB- LE nicht mehr geändert. Schreiboperationen benötigen für ih- re Änderungen am Ende des COMMITLOG und in der MEM- TABLE wenig Zeit und erreichen in einem Cluster mit genü- gend vielen Knoten zur Lastverteilung schier atemberauben- de Durchsatzraten. Beim Lesen werden die angeforderten Daten aus der MEM- TABLE und allen SSTABLEs aufgesammelt. Auch mit Bloom- Filtern zur Optimierung fallen dabei einige Zugriffe im Datei- system an. Um die Zahl der anzusprechenden SSTABLEs für die Leseoperationen zu minimieren, werden gelegentlich meh- rere alte SSTABLEs zu einer neuen SSTABLE zusammengefasst (compact). Beispiele mit Cassandra Cassandra ist schnell installiert. Einfach die Binärdistribution entpacken und CommitLogDirectory und DataFileDirectory in der Datei conf/storage-conf.xml geeignet setzen. Cassandra benötigt in aktuellen Versionen Unterstützung für Java 6. Für den Start des Servers reicht ein einfaches bin/cassandra -f Drei virtuelle Maschinen unter VirtualBox oder VMware Player/Workstation oder auch drei Instanzen in der Elastic Compute Cloud (EC2) von Amazon reichen für erste Expe- rimente mit Partitionierung, Replizierung und Caching voll- kommen aus. Beispiel-Partitionierung Nach dem Start des ersten Servers gibt man mit Kommando- zeilenwerkzeug 1000 Datensätze ein. $ bin/cassandra-cli --host XXX.YYY.ZZZ.231 --port 9160 cassandra> set Keyspace1.Standard2['jsmith1000']['first'] = 'John' cassandra> set Keyspace1.Standard2['jsmith1000']['last'] = 'Smith' cassandra> set Keyspace1.Standard2['jsmith1000']['age'] = '42' cassandra> set Keyspace1.Standard2['jsmith1001']['first'] = 'John' ... Sicher strotzen die Datensätze nicht gerade vor Kreativität und Fantasie. Aber sie zeigen das Phänomen und darum geht es ja zum Einstieg. Der erste Server ist ein sogenannter SEED-Server. Bei sei- ner Konfiguration bekommt die <seed> den Wert „127.0.0.1“ und <AutoBootstrap> wird auf den Wert „false“ gesetzt. Bei der Konfiguration des zweiten und dritten Servers (das sind sogenannte NON-SEED-Server) bekommt <seed> jeweils die IP-Adresse des ersten Servers und AutoBootstrap wird auf den Wert „true“ gesetzt. Diese Einstellungen liegen in der Datei conf/storage-conf. xml. Für den ersten Server passen die Grundeinstellungen; erst für den zweiten und dritten Server müssen die Anpassungen erfolgen. Im Oktober 2010 soll übrigens Cassandra 0.7 kom- men. Dann wandern die Einstellungen in die Datei conf/cas- sandra.yaml. Das Ergebnis zeigt ein weiteres Werkzeug. $ bin/nodetool -host XXX.YYY.ZZZ.233 ring 5 * Der Begriff Rack steht für ein genormtes Rechnergestell für mehrere Rechner im Rechenzentrum. Die Racks für Rechenzentren sind etwa 2 Meter hoch und bieten Platz für 42 Höheneinheiten; eine Höheneinheit ist mit 1,75 Zoll (4,45 cm) spezifi- ziert. Die Geräte weisen Bauhöhen mit ganzzahligen Vielfachen von einer Höhen- einheit auf und haben genormte Breiten von 19 Zoll (48,26 cm). Racks gibt es in Bautiefen von 60, 80, 100 oder 120 cm und Baubreiten von 60, 70 oder 80 cm. Die größeren Baubreiten bieten seitliche Kanäle für Netz, Strom und Luft. Die Racks können mit Seitenwänden und Türen zu Schränken geschlossen werden.
  • 5. www.javaspektrum.de 25 IntegrationsSpektrum Lothar Wieske ist Unternehmensarchitekt für Innovationsmanagement bei der DB Systel GmbH (ICT Tochter im Deutsche Bahn Konzern). Vorher hat er u. a. im Consulting für IBM, Microsoft und Sun Microsystems gearbeitet und schöpft aus Erfahrungen in Finance, Health und Transport & Logistics. Er beschäftigt sich schwerpunktmäßig mit Cloud Computing und ist Autor eines Fachbuchs. E-Mail: lothar.wieske@deutschebahn.com Address Status Load Range Ring 1375... XXX.YYY.ZZZ.233 Up 495 bytes 521... |<--| XXX.YYY.ZZZ.232 Up 495 bytes 1368... | | XXX.YYY.ZZZ.231 Up 495 bytes 1375... |-->| Beispiel-Caching Die niedrige Zahl bei Load erklärt sich aus dem Caching, denn hier wird nur Festplattenbelegung angezeigt – die MEMTABLE leert man mit nodetool ... flush. Jetzt kann man der Reihe nach den ersten und zweiten Server außer Betrieb nehmen $ bin/cassandra-cli --host XXX.YYY.ZZZ.231 decommission $ bin/cassandra-cli --host XXX.YYY.ZZZ.232 decommission und schaut sich wieder den Ring an: Die 1000 Datensätze sind vom ersten auf den dritten Server umgezogen. Beispiel-Replizierung In der Datei conf/storage-conf.xml kann man dann den Repli- cationFactor erhöhen und den Ablauf wiederholen. Im Kleinen verhilft dieses Vorgehen zum Verständnis der Abläufe bei Partitionierung, Replizierung und Caching und des Betriebs eines verteilten, skalierbaren Datastores. Zusammenfassung Apache Cassandra hebt ein Bigtable-Datenmodell [Big06] auf eine Dynamo-Plattform [Dyn06] und kann prominente Ein- satzszenarien vorweisen. Der erfolgreiche Einstieg ins Cloud Computing und insbesondere die Arbeit mit oder der Aufbau von geeigneten Speicherkonzepten setzt einerseits eine theo- retische Kenntnis der Klassiker wie Bigtable und Dynamo vo- raus und andererseits die praktische Arbeit mit einem frei ver- fügbaren System wie Cassandra. Darüber hinaus zeigen die verbauten Entwurfsmuster bei Cassandra, dass elastische und robuste Systeme auf einfachen Prinzipien beruhen und gera- de deswegen zu beeindruckender Größe und Form auflaufen. Vielleicht konnte dieser Artikel den Appetit für eigene Vertie- fungen anregen. Viel Spaß dabei. Literatur [Abe08] B. Simic, Customers Are Won or Lost in One Second, Whitepaper Aberdeen Group, November 2008, http://www.gomez.com/download/Aberdeen_WebApps.pdf [Big06] F. Chang, J. Dean, S. Ghemawat, W. C. Hsieh, D. A. Wallach, M. Burrows, T. Chandra, A. Fikes, R. E. Gruber, Bigtable: A Distributed Storage System for Structured Data, ODSI 2006, http://static.googleusercontent.com/external_content/untrusted_dlcp/ labs.google.com/de//papers/bigtable-osdi06.pdf [Brew00] E. A. Brewer, Towards Robust Distributed Systems, PODC Keynote, 19.7.2000, http://www.cs.berkeley.edu/~brewer/cs262b-2004/PODC-keynote.pdf [Cassandra] http://cassandra.apache.org [Dyn06] G. DeCandia, D. Hastorun, M. Jampani, G. Kakulapati, A. Lakshman, A. Pilchin, S. Sivasubramanian, P. Vosshall, W. Vogels, Dynamo: Amazon's Highly Available Key-Value Store, Proc. of the 21st ACM Symposium on Operating Systems Principles, Oktober 2007, http://s3.amazonaws.com/AllThingsDistributed/sosp/amazon-dynamo- sosp2007.pdf [GiLy02] S. Gilbert, N. Lynch, Brewer’s Conjecture and the Feasi- bility of Consistent, Available, Partition-Tolerant Web Services, http://lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf [Kli10] M. Kliehm, Web Performance Optimierung, Vortrag am 17.5.2010 beim Webmontag in Frankfurt, http://www.slideshare.net/kliehm/performancewmfra [Vog08] W. Vogel, Eventually Consistent – Revisited, http://www.allthingsdistributed.com/2008/12/eventually_consistent.html [Wies10] L. Wieske, Dateisysteme und Datenbanken im Cloud Computing, in: JavaSPEKTRUM, 5/2010