Koordination

In verteilten Systemen wird Parallel gearbeitet. Daher gibt es keine gemeinsame Uhr, was einige Schwierigkeiten bringt.

Es werden Logiken wie “Vektor Uhren” “TimeStamps” oder konsensbasierte Protokolle nötig.

Jeder Knoten besitzt eine lokale Uhr, Ereignisse können nur in Bezug auf eine solche Uhr eindeutig zugeordnet werden.

Aufgrund von unterschiedlichen Übertragungszeiten können Ereignisse in unterschiedlichen Reihenfolgen erscheinen, als sie tatsächlich geschehen sind.

Besonders bei schreibenden Zugriffen kann dieser Umstand zu verschiedenen Probleme führen.

Lösungen sind Logische Uhren. Sie erlauben Schlüsse über
Happened-Before”. Also die Reihenfolge von Ereignissen, anstatt zwingend einer exakten Globalen Zeit.

Zeitsynchronisation

Cristians Algorithmus

Client notiert eigene Zeit und sendet Anfrage an vertrauenswürdigen Server. Nach Erhalt der Antwort berechnet der Client die gesamte Differenz zwischen Anfrage und Antwort und setzt seine Eigene Zeit auf den Wert der Antwort + die Hälfte der Round Trip Time der Anfrage.

Dieses Verfahren basiert auf 3 Annahmen.

  • Der Server ist vertrauenswürdig
  • Der Server braucht nahezu Zeit um die Anfrage zu beantworten
  • Die im Netzwerk verbrachte Zeit sind auf Hin- und Rückweg gleich.

Typischerweise werden hier mehrere Anfragen gesendet um nicht auf einer einzelnen Antwort zu basieren.

Zeitanpassung

Wenn die aktuelle Uhrzeit eines Systems angepasst werden muss, darf nicht direkt der neue, korrekte Wert eingetragen werden.
Stattdessen soll die Uhr vorübergehend schneller oder langsamer laufen, um zeitliche Monotonie zu gewährleisten.

Happened-Before

In zwei Basisfällen lässt sich die Reihenfolge von Ereignissen klar bestimmen.

  1. Sie sind im selben Prozess
    Innerhalb eines lokalen Prozess gibt es eindeutige Reihenfolgen
  2. Nachrichtenübertragung
    Wenn eine Nachricht gesendet wird, muss das Senden vor dem Empfangen Stattgefunden haben
    Diese Regeln bilden die “happened-before” Relation

Formale Definition

  1. Für und im selben Prozess
    dann gilt
  2. Ist das Senden und das Empfangen derselben Nachricht, dann gilt
  3. Transitivität
    und dann

Physikalische Uhren sind nicht exakt synchronisierbar. Daher sind sie nicht geeignet um die Reihenfolge von Ereignissen sicher zu bestimmen.
Mit logischen Uhren kann die Reihenfolge von Ereignissen mithilfe der Happened-Before Kausalität bestimmt werden. Die realen Zeitpunkte der Ereignisse sind dabei nicht in fester Beziehung.

Lamport Timestamp

Jeder Prozess hat einen Lamport-Timestamp .
Die kausale Reihenfolge wird respektiert.

Dies ist nicht zwingend invertierbar.
Aus kann nicht geschlossen werden.

Für lokale Ereignisse wird der eigene Zeitstempel inkrementiert.
Beim Senden von Nachrichten wird der Lokale Zeitstempel mitgesendet.
Beim Empfangen einer Nachricht mit Zeitstempel wird der lokale Zeitstempel auf gesetzt. Dabei ist der vorherige lokale Zähler des Empfängers.

Vektor Uhren

Ziel ist ein Zeitstempel für den gilt:

In einem System mit Prozessen ist eine Vektoruhr ein Vektor mit ganzen Zahlen.

Jeder Prozess besitzt einen eigenen Vektor .

ist die Anzahl der bisher im Prozess aufgetretenen Ereignisse.

Für ein lokales Ereignis gilt in Prozess :

Beim Senden einer Nachricht wird der gesamte Vektor mitgesendet.

Beim Empfangen einer Nachricht wird für jedes Element des eigenen und des Empfangen Vektors der größere Wert gewählt.

Zusätzlich wird der Wert für den eigenen Prozess inkrementiert.

Ein Ereignis ist vor einem Ereignis geschehen, wenn für jedes Element der Vektoren gilt:

Globaler Zustand

Wann kann die Anwendung terminieren?
Auch wenn kein Prozess arbeitet können noch Nachrichten unterwegs sein.

Die Fragestellung ist anwendbar für verteilte Garbage-Collection, verteilte Deadlock-Erkennung, System-Recovery usw.

Für den Garbage-Collector ist ein Objekt Garbage, wenn es in keinem Prozess und in keiner Nachricht referenziert wird.
Für den Globalen Zustand ist es also nötig die lokalen Zustände und die Kanalzustände zu kennen.

Zur Fehlerdiagnose kann es hilfreich sein, einen globalen Snapshot zu erstellen. Auch für Recovery bei Fehlern wird ein sicherer Gesamtzustand gebraucht.

Naive Idee ist die Vereinigung aller Prozesszustände. Dabei werden die Messages “in Transit” nicht beachtet. Außerdem gibt es keinen eindeutigen globalen Zeitpunkt

Konsistente Schnitte

Prozesszustände beziehen sich immer auf lokale (unterschiedliche) Zeiten.
Zur Bestimmung eines wohldefinierten Zustands nutzt man “Consistent Cuts”.
Bedingung ist dabei: Ist das Empfangen einer Nachricht im Schnitt enthalten, so muss auch das Senden der Nachricht enthalten sein.

Nachrichten dürfen “Ins Leere” verschickt werden, aber nie aus dem nichts auftauchen.
Ein Zustand ist dabei alles “links” der Schnittkante.

Snapshot Algorithmus nach Chandy & Lamport

Ziel ist die Erstellung eines konsistenten globalen Zustands in einem verteilten System, ohne die Prozesse zu blockieren.
Voraussetzung dafür sind zuverlässige FIFO Kanäle und starker Zusammenhang des Prozessgraphen. Jeder Prozess kann einen Snapshot initiieren.

Starker Zusammenhang

Bedeutet, dass im gerichteten Graph jeder Knoten von jedem Startpunkt erreichbar ist.

  1. Ein Prozess startet einen Snapshot
  2. Speichert sofort seinen lokalen Zustand (Speicher, Variablen, Queue-Zustand)
  3. Sendet über jeden ausgehenden Kanal eine spezielle Marker-Nachricht
  4. Marker signalisiert anderen Prozessen: “Alles aus diesem Kanal gehört zum Snapshot vor oder nach diesem Marker”
  5. Jeder andere Prozess der die Nachricht empfängt, speichert seinen eigenen Zustand und sendet den Marker ebenfalls an alle Kanäle weiter.
  6. Alle noch eingehenden Nachrichten werden als Zugehörig zum aktuellen Snapshot gespeichert.
  7. Der Snapshot ist für einen Knoten vollständig, wenn auf jedem Kanal ein Marker empfangen wurde.


In diesem Beispiel möchte Prozess zum aktuellen Zeitpunkt einen Snapshot initiieren.

Die Sequenzdarstellung der Situation ist die folgende:

Nach Ende des Algorithmus wurde folgender Schnitt gefunden:

In dieser Darstellung sind die genauen Einträge im Speicher besser erkennbar