FACHARTIKEL 2014 Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Unsere Fachartikel online auf www.norcom.de Copyright © 2014 NorCom Information Technology AG. Our Customers Come First. Anmerkungen zu ACID, BASE, CAP – und Google Spanner In diesem Artikel möchte ich, ein paar Erläuterungen zum Verständnis der drei genannten Akronyme formulieren, und dann eine grobe Einteilung von aktuellen Entwicklungen in der Datenbanktechnologie in die gegebenen Kategorien dieser Terminologien vornehmen. ACID (deutsch AKID) steht für Atomicity, Consistency, Isolation und Durability (Atomarität, Konsistenz, Isolation und Dauerhaftigkeit) – seit über 30 Jahren wichtige Eigenschaften für die Zuverlässigkeit von Datenbanksystemen. Jeder Verarbeitungsschritt in einem DBMS und vor allem auch in einem verteilten Datensystem wird daran gemessen, ob er die genannten vier Kriterien erfüllt. Das Akronym ACID zur Charakterisierung von Transaktionen wurde bereits 1983 in einem Paper1 von Theo Härder und Andreas Reuter geprägt. A wie Atomarität Atomarität (Abgeschlossenheit) bedeutet, dass eine Sequenz von DatenOperationen entweder ganz oder gar nicht ausgeführt wird – was normalerweise über den Einsatz von Transaktionen erreicht wird. Das Datenbanksystem verhält sich gegenüber dem Benutzer so, als ob die, in einer Transaktion zusammengefassten Operationen eine einzelne elementare Operation wäre, die nicht von anderen Operationen unterbrochen werden kann. De facto werden die einzelnen Anweisungen einer Transaktion nacheinander ausgeführt, aber erst für gültig erklärt (über einen so genannten Commit), wenn sie erfolgreich abgeschlossen sind. Andernfalls wird die gesamte Transaktion zurück abgewickelt, so dass der konsistente Ausgangszustand wiederhergestellt wird (Rollback). C wie Konsistenz Konsistenz heißt in diesem Zusammenhang, dass eine Sequenz von DatenOperationen einen konsistenten Datenzustand hinterlässt, falls die Datenbank davor konsistent war. In klassischen, relationalen DBMS wie Oracle, Informix, DB2 oder MS SQL Server versteht man unter Konsistenz die Integrität von Daten. Diese wird durch das Aufstellen von sogenannten Integritätsbedingungen2 (oft auch Constraints genannt) definiert - und davon gibt es vier Arten: 1 Siehe weiterführende Links auf Seite 8 2 Bedingungen, die bestimmte Datenobjekte erfüllen müssen, um als konsistent zu gelten, beispielsweise bestimmte Datentypen, Wertebereiche oder Abhängigkeitsbeziehungen zu anderen Objekten. Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Seite 2 Seite 2 Our Customers Come First. Bereichsintegrität: Der Wert jedes Attributes muss in einem bestimmten Wertebereich liegen. Entitätsintegrität: Jeder Primärschlüssel muss eindeutig und darf auf keinen Fall Null sein. Referentielle Integrität: Der Wert eines Fremdschlüssel muss entweder Null sein, oder ein Objekt mit diesem Schlüssel muss existieren. Logische Konsistenz: Zusätzliche, logische Integritätsbestimmungen, die durch die Anwendung festgelegt werden. Konkret werden in relationalen Datenbanken mindestens folgende Constraints angeboten: NOT NULL → der Skalar kann nicht NULL sein PRIMARY KEY → der Skalar muss einzigartig sein und kann nicht NULL sein FOREIGN KEY → der Skalar muss auf Referentielle Integrität geprüft werden UNIQUE → der Skalar muss innerhalb des Attributes einzigartig sein CHECK()→ explizite Überprüfungsanweisung an das DBMS; auf was geprüft werden muss, wird als Option dieser Anweisung definiert Des Weiteren gibt es verschiedene Typen von Constraints: Attribut Constraints, beziehen sich auf eine einzelne Spalte Relationen Constraints, beziehen sich auf mehrere Attribute (Spalten) Benannte Constraints, können anhand des Namens manipuliert werden Unbenannte Constraints, erhalten einen vom System generierten Namen Eine Datenbank ist konsistent, wenn sie alle Integritätsbestimmungen erfüllt. Falls mindestens eine Integritätsbedingung verletzt wird, wird sie als nicht konsistent bezeichnet. In der Praxis wird die Konsistenz durch eine Normalisierung des Datenbestands sowie durch explizit definierte Integritätsbedingungen erreicht. Nach jeder durch eine Transaktion gegebenen Reihe von Veränderungen der Daten (Einfügen, Löschen oder Ändern) wird die Datenbank auf die festgelegten Integritätsbedingungen geprüft. Falls diese nicht erfüllt sein sollten, wird ein Rollback durchgeführt. In verteilten Speichersystemen werden Daten mehrfach über verschiedene Server repliziert, um die Verfügbarkeit der Daten zu erhöhen und die Zugriffzeiten zu verringern. In diesem Kontext bedeutet Konsistenz, dass alle Replika eines Datensatzes identisch sind. Insbesondere bedeutete dies aber auch, dass ein verteiltes Speichersystem für einen Datensatz A konsistent und gleichzeitig für einen Datensatz B inkonsistent sein kann. Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Seite 3 Seite 2 Our Customers Come First. Seite 4 Seite 2 Nun fordert strikte Konsistenz, dass alle Replika immer identisch sind – und das ist in verteilten Systemen nicht immer sinnvoll – bzw. mit vertretbarem Aufwand – realisierbar, und erfahrungsgemäß oft nur auf Kosten der Verfügbarkeit, Performanz oder Ausfallsicherheit. In diesem Zusammenhang gilt das sogenannte CAP-Theorem3 von Eric Brewer, welches besagt, dass es in einem verteilten System unmöglich ist, gleichzeitig die drei Eigenschaften Konsistenz (C), Verfügbarkeit (A) und Partitionstoleranz (P) zu garantieren4. C A P Unter Verfügbarkeit wird dabei die Forderung verstanden, dass immer alle Anfragen beantwortet werden, und als Partitionstoleranz die Forderung, dass das System auch bei Verlust von Nachrichten oder Ausfall einzelner Netzknoten oder Partitionen des Netzes möglichst fehlerfrei weiterarbeitet. In modernen hochverteilten und hochverfügbaren Systemen wird das CAP Theorem oft als Begründung für schwächere Konsistenzmodelle herangezogen. Bei solchen Systemen spricht man von einer schwachen (weak) Konsistenz, wenn keine Konsistenzgarantien abgegeben werden, oder von der sogenannten eventual Consistency - auch BASE (Basically Available, Soft state, Eventual consistency). BASE ist als Alternative zu ACID gedacht - ACID ist pessimistisch und erwartet Konsistenz am Ende jeder Operation während BASE optimistisch ist - und in Kauf nimmt, dass die Konsistenz der Datenbank in einem fließenden Status ist – weil davon auszugehen ist, dass es immer eine Zeit lang dauert, bis eine Änderung über alle Replikate im Netz verteilt ist. Eventuell – wenn dafür eine hinreichend lange Zeit ohne weitere Schreibzugriffe oder Fehler zur Verfügung steht - werden alle Änderungen auf allen Maschinen propagiert – daher die Bezeichnung »Eventual Consistency«. Zwischen eventual und strict Consistency gibt es einige Zwischenstufen - dabei unterscheidet man zwischen client-centric (d.h. aus Sicht des Clients) und data-centric (d.h. interne) Konsistenz. 3 Das Theorem entstand im Jahr 2000 als Vermutung des Informatikers Eric Brewer an der University of California, Berkeley beim »Symposium on Principles of Distributed Computing« (PODC). 2002 veröffentlichten Seth Gilbert und Nancy Lynch vom MIT einen axiomatischen Beweis von Brewers Vermutung und etablierten diese somit als Theorem. 4 Im Original: “It is impossible for a protocol to guarantee both consistency and availability in a partition prone distributed system”. Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Our Customers Come First. Client-centric Consistency Monotonic Read Consistency: Wenn ein Speichersystem einmal auf eine Leseanfrage eines Clients für einen bestimmten Schlüssel mit Version N geantwortet hat, werden alle späteren Lesezugriffe dieses Clients nur noch Versionen, die mindestens so neu sind wie N zurückliefern. Monotonic Write Consistency: Wenn ein Client für einen bestimmten Schlüssel erst Wert 1 und dann Wert 2 schreibt, dann ist garantiert, dass das System intern die Werte ebenfalls in dieser Reihenfolge schreibt. Read Your Writes Consistency: Das Speichersystem garantiert, dass ein Prozess, der ein Datum mit der Versionsnummer N geschrieben hat, garantiert keine Versionen lesen wird, die älter sind als N. In der Praxis wird dies oft durch sogenannte Session Consistency umgesetzt, bei der die Garantie nur für die Dauer einer Session gilt. Alle Anfragen eines bestimmten Prozesses werden zum selben Replika geroutet, ist dieses nicht verfügbar, wird die Session beendet. Write Follows Reads Consistency: Wenn ein Prozess ein Datum X in einer Version N gelesen hat und anschließend derselbe Prozess dieses Datum überschreibt, dann wird garantiert, dass der Schreibvorgang nur auf Replika stattfindet, die mindestens in Version N vorliegen. Data-centric Consistency Causal Consistency bedeutet, dass alle Operationen, die in einer kausalen Beziehung stehen, in der gleichen Reihenfolge auf allen Replika serialisiert werden müssen. Eine Operation O ist genau dann kausal von einer Operation P abhängig, wenn eine oder mehrere der folgenden Bedingungen gelten: O und P wurden vom gleichen Prozess ausgelöst und P lag chronologisch vor O. O ist ein Read, P ist ein Write und O hat das Ergebnis von P gelesen. O ist kausal abhängig von einer Operation X, die wiederum kausal abhängig von P ist. Sequential Consistency fordert, dass alle Operationen in der gleichen Reihenfolge auf allen Replika serialisiert werden und die Operationen jedes Clientprozesses in ihrer korrekten chronologischen Reihenfolge ausgeführt werden – und ist damit strikter als Causal Consistency. Linearizability ist noch strikter als Sequential Consistency - und bedeutet, dass die Ordnung der Operationen der tatsächlichen chronologischen Reihenfolge entspricht und alle Requests so erscheinen, als würden sie an einem Zeitpunkt passieren. Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Seite 5 Seite 2 Our Customers Come First. I wie Isolation Isolation bezeichnet die Trennung von Transaktionen, so dass eine laufende Transaktion nicht von einer parallel ablaufenden Transaktion durch Änderungen an den gemeinsam benutzten Daten in einen undefinierten Zustand gebracht werden kann. Von den vier ACID-Eigenschaften ist diese in der Umsetzung die schwierigste. Durch mangelnde Transaktionsisolation können folgenden Probleme auftreten: 1. Lost Updates: Wenn zwei Transaktionen dieselbe Information verändern, dann können die Änderungen der ersten durch die Änderungen der zweiten überschrieben werden, wodurch die erste Änderung verloren geht. 2. Dirty Read: Wenn eine Transaktion Daten liest, die von einer noch nicht abgeschlossenen (Committed) Transaktion verändert wurden. 3. Non-Repeatable Read: Wiederholte Lesevorgänge auf denselben Datensatz innerhalb einer Transaktion liefern unterschiedliche Ergebnisse, weil zwischenzeitlich eine parallel ablaufende Transaktion den Datensatz verändert hat. 4. Phantom Read: Suchkriterien treffen während einer Transaktion auf unterschiedliche Datensätze zu, weil eine parallel laufende andere Transaktion Datensätze hinzugefügt, entfernt oder verändert hat. Im ANSI/ISO SQL-Standard, der von den relationalen DBMS wie Oracle, Informix, DB2 oder MS SQL Server weitgehend implementiert wurde, sind dafür vier Transaktionsisolationsebenen vorgesehen: 1. Read Uncommitted: Leseoperationen ignorieren jegliche Sperre, daher können alle oben genannten Probleme auftreten. 2. Read Committed: Schreibsperren werden für die gesamte Transaktion auf alle Objekte gesetzt, die verändert werden sollen. Lesesperren werden nur kurzzeitig beim tatsächlichen Lesen der Daten gesetzt. Daher können NonRepeatable Read und Phantom Read auftreten 3. Repeatable Read stellt sicher, dass wiederholte Leseoperationen mit den gleichen Parametern auch dieselben Ergebnisse haben. Sowohl bei Lese- als auch bei Schreiboperationen werden für die gesamte Dauer der Transaktion Sperren gesetzt. Damit können höchstens noch Phantom Reads auftreten. 4. Serializable garantiert, dass die Wirkung parallel ablaufender Transaktionen exakt dieselbe ist wie sie die entsprechenden Transaktionen zeigen würden, liefen sie nacheinander in Folge ab. Auf diese Weise ist sichergestellt, dass keine Transaktion verloren geht und dass sich keine zwei Transaktionen gegenseitig beeinflussen. Um ein möglichst hohes Niveau der Isolation zu gewährleisten, werden in DBMS komplexe Sperrmechanismen wie das 2PL (Two Phase Locking) oder dar sogenannte MVCC (Multiversion Concurrency Control) implementiert was allerdings zu Verlusten bei der Parallelität führen kann. Letztendlich liegt es oft an der Anwendung, mit möglichen Serialisierungsfehlern umzugehen und ggf. abgebrochene Transaktionen zu wiederholen. Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Seite 6 Seite 2 Our Customers Come First. D wie Dauerhaftigkeit Dauerhaftigkeit sagt aus, dass die Daten nach dem erfolgreichen Abschluss einer Transaktion garantiert dauerhaft in der Datenbank gespeichert sind. Dieses muss auch nach einem Systemfehler wie einem Software-Fehler oder einem Hardware-Ausfall garantiert sein. Insbesondere darf es nach einem Ausfall des Hauptspeichers nicht zu Datenverlusten kommen. Dauerhaftigkeit kann durch das Schreiben eines Transaktionslogs in einem persistenten Speicher sichergestellt werden. Ein Transaktionslog erlaubt es, nach einem Systemausfall alle in der Datenbank fehlenden Schreib-Operationen zu reproduzieren. Klassifizierung von Datenbanktechnologien gemäß CAP CA – RDBMS: Die klassischen Relationalen Datenbanken wie Oracle, DB2 oder Microsoft SQL Server streben vor allem Konsistenz an. Ein RDBMSCluster fällt ebenfalls meistens in die Kategorie CA. Sie streben vor allem Verfügbarkeit und Konsistenz aller Knoten an. Da sie meistens mit hochverfügbaren Netzwerken und Servern betrieben werden, ist das Thema Partitionstoleranz meist eher etwas nachrangiger. CP – Banking-Anwendungen: Für verteilte Finanzanwendung wie z. B. Geldautomaten ist die Konsistenz der Daten oberstes Gebot: Ein abgehobener Geldbetrag muss zuverlässig vom Konto abgebucht werden, eingezahltes Geld muss auf dem Konto erscheinen. Diese Anforderung muss auch bei Störungen im Datenverkehr sichergestellt werden (Partitionstoleranz). Die Verfügbarkeit ist in diesem Fall eher zweitrangig, so soll bei Netzwerkstörungen ein Geldautomat eher nicht verfügbar sein als fehlerhafte Transaktionen abzuwickeln. AP – DNS und Cloud Systeme sowie verteilte NoSQL-Datenbanken. Das DNS fällt in die Kategorie AP. Die Verfügbarkeit ist extrem hoch, ebenso Toleranz gegenüber dem Ausfall einzelner DNS-Server. Allerdings ist die Konsistenz nicht immer sofort gegeben: es kann mitunter Tage dauern, bis ein geänderter DNS-Eintrag an die gesamte DNS-Hierarchie propagiert ist und damit von allen Clients gesehen wird. Cloud-Plattformen setzen auf eine horizontale Skalierung, die Last wird auf viele Knoten verteilt, die ggf. auf preiswerter, nicht unbedingt ausfallsicherer Hardware laufen. Daher muss eine CloudAnwendung zwingend Toleranz gegenüber dem Ausfall einzelner Knoten zeigen können. Ebenso wird normalerweise eine hohe Verfügbarkeit gefordert. Beispiele für Web-Anwendungen, die nicht auf strenge Konsistenz angewiesen sind, wären Social-Media-Sites wie Twitter oder Facebook. Die meisten aktuellen NoSQL Datenbanksysteme stellen ebenfalls einen oder zwei der drei Faktoren über den oder die anderen: Google BigTable, die proprietäre Hochleistungsdatenbank auf Basis des Google File Systems (GFS) sowie HBase, die freie Implementierung von BigTable aus dem Apache Hadoop Projekt garantieren strikte Konsistenz innerhalb eines Datacenters und höchste Verfügbarkeit, Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Seite 7 Seite 2 Our Customers Come First. Inkonsistenzen zwischen Datacentern sind aber möglich. Updates werden asynchron an alle Replikate verteilt. Amazon DynamoDB und Apache Cassandra stellen ebenfalls die Verfügbarkeit und Partitionstoleranz über die Konsistenz – auch hier werden Updates asynchron an alle Replikate verteilt. Oracle NoSQL erlaubt die Konfiguration eines strikteren Konsistenzmodells ggf. auf Kosten der Performance. FoundationDB – die NoSQL-Datenbank soll in der aktuellen Version ACID konform sein. Google Spanner, der Nachfolger von BigTable, der bei Google bereits seit 4 Jahren im Einsatz ist, soll als global verteilte und synchron replizierende Datenbank erstmals eine strikte Konsistenz bieten. Fazit Es ist naheliegend, dass strikte Konsistenzforderungen wie sie in ACID formuliert sind, Opfer bei der Verfügbarkeit und Performance von verteilten Systemen fordern - und auch, dass hohe Anforderungen an die Verfügbarkeit und Performanz wie sie in weltweit verteilten Systemen gängig sind und mit dem BASE Paradigma umgesetzt werden, Opfer bei der Konsistenz fordern - das ist mit CAP vermutet und bewiesen worden. Mit der neuen globalen Spanner Datenbank hat sich nun Google aber vorgenommen, zu zeigen, dass C, A und P vielleicht doch gleichzeitig erfüllt werden können – zumindest besser als je zuvor… Prof. Eric Brewer muss es wissen – er arbeitet für Google. Bereits am 10.05.2011 hat er bei Twitter gepostet: I will be leading the design of the next gen of infrastructure at Google. The cloud is young: much to do, many left to reach. Wir dürfen gespannt bleiben… Weiterführende Links ACID Paper von 1983: http://www.minet.uni-jena.de/dbis/lehre/ws2005/dbs1/HaerderReuter83.pdf Beweis des CAP Theorems: http://lpd.epfl.ch/sgilbert/pubs/BrewersConjecture-SigAct.pdf Google BigTable: http://static.googleusercontent.com/media/research.google.com/de//archive/bi gtable-osdi06.pdf Apache HBase: http://hbase.apache.org/ Amazon DynamoDB: http://aws.amazon.com/de/dynamodb/ Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Seite 8 Seite 2 Our Customers Come First. Seite 9 Seite 2 Apache Cassandra: http://cassandra.apache.org/ Oracle NoSQL: http://www.oracle.com/de/products/database/nosql/overview/index.html FoundationDB: https://foundationdb.com/acid-claims Google Spanner: http://static.googleusercontent.com/media/research.google.com/de//archive/sp anner-osdi2012.pdf Haben Sie Fragen, Kommentare oder Feedback? Unsere Experten sind rund um die Uhr für Sie da. Fragen Anmerkungen zu ACID, BASE, CAP – und Google Spanner Von Gunther Zerbes Sie uns jetzt!