Verteilte Datenbanksysteme
VDBMS
- Ist ein Datenbanksystem verteilt über mehrere physische Knoten
- Ist Transparent gegen aussen, die Verteilung der Daten ist aus Sicht des Benutzers egal
- In einem homogenen System laufen alle Noten mit der gleichen Software und wissen voneinander, es erscheint gegenüber dem Benutzer als ein System
- In einem heterogenen System können auf den Knoten unterschiedliche Software und Schemas laufen, sie sind voneinander unabhängig, wissen also nichts voneinander. Dies macht das Verteilen von Daten und Transaktionen schwerer.
Replikation
- Eine Relation (Tabelle) wird redundant auf mehreren Knoten gespeichert
- Dies bietet mehr Verfügbarkeit und Parallelität bei Ausführung von Queries
- Hat aber höhere Update-Kosten und komplexere Synchronisation, Änderungen können zu temporär inkonsistenten Daten führen
Fragmentierung
- Jede Relation wird in Fragmente aufgeteilt
- Horizontale Fragmentierung: Jedes Tupel wird auf ein oder mehrere Fragmente aufgeteilt (Sharding). Dies kann z.B. nach einem Attribut der Relation gruppiert werden
- Vertikale Fragmentierung: Das Schemea der Relation ist in mehrere kleinere Schematas aufgeteilt. z.B. ist ein Tupel so verteilt auf mehrere Fragmente, die mit einem gemeinsamen Schlüssel verbunden werden
Verteilte Transaktionen
- Problem: Transaktion ist immer lokal zu einer DB-Session
- In einem VDBMS muss im Hintergrund die Transaktion aber auf mehreren Nodes committed werden
Two Phase Commit (2PC)
- Garantiert Atomarität von verteilten Transaktionen
- Die Transaktion zwischen DBMS und Applikation wird von einem Transaction Manager verwaltet
- Beim Commit-Befehl der Applikation zum TM fragt dieser zuerst alle Resourcen (Nodes) an, ob sie bereit zum commit sind (prepare to commit)
- Falls alle Resourcen bereit sind, sendet der TM allen den Befehl zum commit
- Wird während dem Commit der Commit von einer Resource abgebrochen, oder sie antwortet nicht rechtzeitig, sendet der TM einen Rollback-Befehl an alle Resourcen
-
Haben die Resourcen einen Commit abgeschlossen, antworten sie mit einem ACK
-
Der TM stellt so sicher, dass die Transaktion entweder von allen commited oder von allen rollbacked wird. Er muss auch mit allen Fehlersituationen der Serverkommunikation dazwischen umgehen können
- Das Protokoll muss auch mit einem Absturz des TM umgehen können
- Alle Schritte werden vom TM und den einzelnen Resource-Managers geloggt. So weiss das System nach einem Absturz, welche Aktionen noch durchgeführt werden konnten
-
Resource Manager kann von alleine nicht entscheiden, wenn nach dem ready kein commit vom TM kommt. Er muss dann solange blockieren, bis er entweder commit oder abort erhält
-
2PC ist kein effizientes Protokoll, es ist relativ langsam und skaliert schlecht
- Allerdings wird es von fast allen Herstellern unterstützt
2-Phase-Locking
- Lokale Serialisierbarkeit einer Transaktion reicht bei VDBMS nicht aus, es braucht eine globale Serialisierbarkeit über alle Nodes
- Dafür wird 2-Phase-Locking auf verteilte Systeme adaptiert
Globaler Lock-Manager
- Verwaltet Locks auf globaler Ebene über alle Nodes hinweg
- Transaktionen fragen beim Lock-Manager an, um Resourcen zu sperren
- Vorteil: Deadlock-Erkennung ist gleich wie im System mit einem Knoten
- Nachteile:
- Jede Sperr-Anfrage muss zuerst an den Knoten gesendet werden und die Antwort abwarten
- Lock-Manager ist SPOF
Lokaler Lock-Manager
- Verwaltet die Locks auf jedem Node einzeln für sich selbst
- wird über globalen Algorithmus gesteuert
- Vorteil: Arbeit ist verteilt und robuster gegen Ausfälle
- Nachteil: Schwierige Deadlock-Erkennung, Performance-Einbussen
Timestamp-based Synchronisation
- Jede Transaktion bekommt einen Zeitstempel + Rechner-ID, was sie im System global Unique macht
- Dadurch wird die Serialisierungsreihenfolge einer Transaktion festgelegt bei Konfliktoperationen
- Transaktionen müssen alle Änderungen von älteren Zeitstempel sehen, aber keine von jüngeren
- Eine jüngere Transaktion darf nicht ein objekt verändert haben, das anschliessend von der älteren geschrieben wird
- Bei Verletzung der Regel wird ein Rollback gemacht
Verteilte Deadlocks
Erkennung
- Primitive Variante: Bei Timout wird Transaktion zurückgesetzt und erneut gestartet
- Problem beim Wählen des Timeouts: Zu lang ist ineffizient, zu kurz gibt "false-positives" für Deadlocks
- Zentralisierte Erkennung: Stationen melden lokale Wartebeziehung an eine Station, die dann den globalen Wartegraphen aufbaut
- Sichere Lösung, aber hoher Aufwand
- Risiko von Phantom-Deadlocks - nicht existierende Deadlocks durch das "Überholen" von Nachrichtne in der Übertragung
Vermeidung
- Optimistic Concurrency: Nach Abschluss der Transaktion wird Validierung durchgeführt
- Timestamp-based Synchronisation
Distributed Query Processing
Verteilte Anfragen
- Bei einem zentralen System werden die Kosten bestimmt durch Anzahl Disk I/O's
- Im verteilten System werden sie bestimmt durch Anzahl Netzwerk-I/O's und den Performancegewinn durch Parallelisierung
- Parallelisierung ist z.B. durch horizontale Fragmentierung möglich, indem Teilresultate durch Kriterien auf Knoten verteilt sind und anschliessend zusammen geführt werden
Join-Strategien
- Ship Whole: Alle benötigten Relationen auf einen Knoten übertragen, der dann den Join ausführt
- Wenig Nachrichten, hohes Datenvolumen
- Fetch as needed: Nur Join-Attribute an einen Knoten schicken, der den Join durchführt
- Viele Nachrichten, niedriges Datenvolumen
Semi-Join
- Optimierung des Fetch-as-needed Ansatz
- Join-Attribute der ersten Relation werden zum Knoten der zweiten Relation geschickt
- Knoten der zweiten Relation schickt alle Tupels, die auf den Join matchen, zurück zum Knoten der ersten Relation, wo dann der Join erfolgt