TEIL II
Verteilte Daten
FĂŒr eine erfolgreiche Technologie muss die Wirklichkeit Vorrang vor der Ăffentlichkeitsarbeit haben, denn die Natur lĂ€sst sich nicht tĂ€uschen.
â Richard Feynman, Rogers Commission Report (1986)
Die in Teil I dieses Buchs diskutierten Aspekte von Datensystemen gelten, wenn die Daten auf einem einzelnen Computer gespeichert werden. In Teil II gehen wir nun eine Stufe nach oben und fragen: Was passiert, wenn mehrere Computer beim Speichern und Abrufen von Daten beteiligt sind?
Es gibt verschiedene GrĂŒnde, eine Datenbank auf mehrere Computer zu verteilen:
Skalierbarkeit
Wird das Datenvolumen, die Lesebelastung oder die Schreibbelastung gröĂer, als ein einzelner Computer bewĂ€ltigen kann, lĂ€sst sich die Last möglicherweise auf mehrere Computer verteilen.
Fehlertoleranz/HochverfĂŒgbarkeit
Wenn Ihre Anwendung auch dann weiterhin funktionieren muss, wenn ein Computer (oder mehrere Computer oder das Netzwerk oder ein ganzes Rechenzentrum) ausfĂ€llt, können Sie mit mehreren Computern ein redundantes System aufbauen. FĂ€llt ein Computer aus, kann ein anderer dessen Aufgaben ĂŒbernehmen.
Latenz
Wenn Ihre Benutzer global verteilt sind, brauchen Sie vielleicht Server an mehreren Standorten weltweit, sodass jeder Benutzer von einem Rechenzentrum in seiner geografischen NĂ€he bedient werden kann. Damit lĂ€sst sich vermeiden, dass Benutzer auf Netzwerkpakete warten mĂŒssen, die um die halbe Welt reisen.
FĂŒr höhere Belastung skalieren
Wenn Sie lediglich fĂŒr eine höhere Belastung skalieren mĂŒssen, ist es am einfachsten, leistungsfĂ€higere Computer anzuschaffen (oft auch als vertikale Skalierung (scale up) bezeichnet). Viele CPUs, viele RAM-Chips und viele Festplatten lassen sich unter einem Betriebssystem gemeinsam betreiben, und schnelle Zwischenverbindungen erlauben jeder CPU, auf jeden Teil des Arbeitsspeichers oder der Festplatte zuzugreifen. Bei einer derartigen Shared-Memory-Architektur (Architektur mit gemeinsam genutztem Speicher) können alle Komponenten als ein einziger Computer betrachtet werden [1].1
Bei einem Shared-Memory-Ansatz besteht das Problem darin, dass die Kosten schneller als linear wachsen: Ein Computer mit doppelt so vielen CPUs, doppelt so viel RAM und doppelt so viel FestplattenkapazitĂ€t wie ein anderer Computer kostet in der Regel deutlich mehr als das Doppelte. Und aufgrund von EngpĂ€ssen ist ein Computer der doppelten GröĂe hĂ€ufig gar nicht in der Lage, die doppelte Belastung zu bewĂ€ltigen.
Eine Shared-Memory-Architektur kann begrenzte Fehlertoleranz bieten â High-End-Computer besitzen Hot-Swappable-Komponenten (die sich im laufenden Betrieb ersetzen lassen, ohne die Computer auszuschalten, wie zum Beispiel Festplatten, Speichermodule und sogar CPUs) â doch bleibt eine solche Architektur zweifellos auf einen einzelnen geografischen Standort beschrĂ€nkt.
Ein anderer Ansatz ist die Shared-Disk-Architektur, die mehrere Computer mit unabhĂ€ngigen CPUs und Arbeitsspeichern verwendet, die Daten aber auf einem Festplattenarray speichert, das die Computer gemeinsam nutzen und das ĂŒber ein schnelles Netzwerk verbunden ist.2 Diese Architektur wird fĂŒr bestimmte Data-Warehousing-Arbeitslasten eingesetzt, doch Konkurrenzsituationen und der Overhead von Sperrmechanismen schrĂ€nken die Skalierbarkeit des Shared-Disk-Konzepts ein [2].
Shared-Nothing-Architekturen
DemgegenĂŒber haben Shared-Nothing-Architekturen [3] (manchmal auch horizontale Skalierung oder Scale-out genannt) eine Menge an PopularitĂ€t gewonnen. In diesem Ansatz wird jeder Computer oder jeder virtuelle Computer, der die Datenbanksoftware ausfĂŒhrt, als Knoten bezeichnet. Jeder Knoten lĂ€uft mit seinen CPUs, seinem RAM und seinen Festplatten unabhĂ€ngig von anderen. Jegliche Koordinierung zwischen den Knoten geschieht auf der Softwareebene und lĂ€uft ĂŒber ein konventionelles Netzwerk.
Da ein Shared-Nothing-System keine spezielle Hardware benötigt, können Sie beispielweise den Computer einsetzen, der das beste Preis-Leistungs-VerhĂ€ltnis hat. Die Daten können Sie möglicherweise auf mehrere geografische Regionen verteilen, somit die Latenz fĂŒr Benutzer verringern und gegebenenfalls den Totalausfall eines ganzen Rechenzentrums ĂŒberstehen. Mit Cloud-Bereitstellungen von virtuellen Computern brauchen Sie nicht einmal in der GröĂenordnung von Google zu operieren: Selbst fĂŒr kleinere Firmen ist jetzt eine auf mehrere Regionen verteilte Architektur praktikabel.
In diesem Teil des Buchs konzentrieren wir uns auf Shared-Nothing-Architekturen â nicht weil sie unbedingt die beste Wahl fĂŒr jeden Einsatzfall sind, sondern vielmehr weil sie die meiste Sorgfalt von Ihnen, dem Anwendungsentwickler, verlangen. Wenn Ihre Daten ĂŒber mehrere Knoten verteilt sind, mĂŒssen Sie sich der EinschrĂ€nkungen und Kompromisse bewusst sein, die in einem derartigen verteilten System auftreten â die Datenbank ist nicht in der Lage, diese vor Ihnen zu verbergen.
Eine verteilte Shared-Nothing-Architektur hat zwar viele Vorteile, doch sie beinhaltet auch zusĂ€tzliche KomplexitĂ€t fĂŒr Anwendungen und schrĂ€nkt manchmal die Ausdruckskraft der Datenmodelle ein, die Sie verwenden können. In manchen FĂ€llen kann ein einfaches Programm, das in einem einzigen Thread lĂ€uft, deutlich besser abschneiden als ein Cluster mit ĂŒber 100 CPU-Kernen [4]. Andererseits können Shared-Nothing-Systeme sehr leistungsfĂ€hig sein. Die nĂ€chsten Kapitel gehen ausfĂŒhrlich auf die Fragen ein, die im Zusammenhang mit verteilten Daten auftauchen.
Replikation vs. Partitionierung
Es gibt zwei gĂ€ngige Methoden, Daten ĂŒber mehrere Knoten zu verteilen:
Replikation
Eine Kopie derselben Daten auf mehreren verschiedenen Knoten behalten, möglicherweise an verschiedenen Standorten. Replikation bietet Redundanz: Wenn einige Knoten nicht mehr verfĂŒgbar sind, können die Daten dennoch von den ĂŒbrigen Knoten bereitgestellt werden. Zudem kann Replikation helfen, die Performance zu verbessern. Replikation ist Thema von Kapitel 5.
Partitionierung
Eine groĂe Datenbank in kleinere Teilmengen â sogenannte Partitionen â aufgliedern, sodass verschiedene Partitionen unterschiedlichen Knoten zugewiesen werden können (auch als Sharding â horizontale Fragmentierung â bezeichnet). Auf Partitionierung gehen wir in Kapitel 6 ein.
Diese Mechanismen sind zwar eigenstÀndig, doch arbeiten sie oftmals Hand in Hand, wie Abbildung T-1 zeigt.
Abbildung T-1: Eine Datenbank, die in zwei Partitionen aufgeteilt ist und zwei Replikate pro Partition speichert
Mit dem Wissen ĂŒber diese Konzepte können wir die schwierigen Kompromisse diskutieren, die Sie in einem verteilten System eingehen mĂŒssen. Mit Transaktionen befasst sich Kapitel 7, damit Sie verstehen, was in einem Datensystem alles schiefgehen kann und was sich dagegen unternehmen lĂ€sst. Diesen Teil des Buchs schlieĂen wir in Kapitel 8 und Kapitel 9 mit einer Erörterung der prinzipiellen BeschrĂ€nkungen von verteilten Systemen ab.
SpĂ€ter betrachten wir in Teil III dieses Buchs, wie Sie mehrere (möglicherweise verteilte) Datenspeicher in ein gröĂeres System integrieren können, das die Anforderungen einer komplexen Anwendung erfĂŒllt. Doch zunĂ€chst wollen wir ĂŒber verteilte Daten sprechen.
Literaturverzeichnis
[1]Ulrich Drepper: What Every Programmer Should Know About Memory. akkadia.org, 21. November 2007.
[2]Ben Stopford: Shared Nothing vs. Shared Disk Architectures: An Independent View. benstopford.com, 24. November 2009.
[3]Michael Stonebraker: The Case for Shared Nothing. IEEE Database Engineering Bulletin, Bd. 9, Nr. 1, S. 4â9, MĂ€rz 1986.
[4]Frank McSherry, Michael Isard und Derek G. Murray: Scalability! But at What COST?. im 15. USENIX Workshop on Hot Topics in Operating Systems (HotOS), Mai 2015.
KAPITEL 5
Replikation
Der wichtigste Unterschied zwischen einer Sache, die schiefgehen kann, und einer Sache, die keinesfalls schiefgehen kann, besteht darin, dass, wenn etwas doch schiefgeht, das keinesfalls schiefgehen kann, es sich keinesfalls beheben lÀsst.
â Douglas Adams, Einmal Rupert und zurĂŒck (Mostly Harmless, 1992)
Replikation heiĂt, eine Kopie derselben Daten auf mehreren Computern, die ĂŒber ein Netzwerk miteinander verbunden sind, zu speichern. Wie in der EinfĂŒhrung zu Teil II erörtert, gibt es mehrere GrĂŒnde, warum man Daten repliziert:
- Um Daten geografisch nahe bei den Benutzern zu halten (und somit die Latenz von Zugriffen zu verringern)
- Um dem System zu ermöglichen weiterzuarbeiten, selbst wenn einige seiner Komponenten ausgefallen sind (und somit die VerfĂŒgbarkeit zu erhöhen)
- Um die Anzahl der Computer, die Leseabfragen bedienen können, zu erhöhen (und s...