21.01.2008

SnTT: Wie funktioniert eigentlich Replikation? (Update)

>>Author:  Thomas Bahn
>>Ort:     Orlando, Florida
        
URL: https://www.assono.de/blog/d6plinks/How-does-replikation-work

Kategorien: Show-n-Tell Thursday, Lotus Notes, Administration, Entwicklung

showntell-w120.png
In der Notes/Domino-Forum von Xing wird ein Problem bei Feldreplikation im Cluster beschrieben. Das möchte ich zum Anlass nehmen, den "Mechanismus" Replikation einmal gründlicher zu beleuchten.

Startet ein Notes-Client oder ein Domino-Server eine Replikation mit einem (anderen) Domino-Server, so wird dort zunächst nach einer Notes-Datenbank mit der gleichen Replik-ID gesucht. Die Replik-ID einer Datenbank findet man im 2. Reiter der Datenbank-Eigenschaften:
A picture named M2


Findet der Server eine Replik, dann sucht er im Replizierprotokoll, ob die beiden Datenbanken schon einmal miteinander erfolgreich repliziert wurden. Dieser Protokolleintrag enthält den Zeitpunkt, wann sie das letzte Mal repliziert wurden und sich damit in einem "synchronen" Status befunden haben. Wenn er keinen passenden Eintrag für die beiden Replikationspartner findet, werden auf beiden Seiten die Listen aller Dokumente miteinander verglichen: Für jedes Dokument einer Datenbank wird nach dem entsprechenden Dokument - also nach dem Dokument mit der gleichen Unique ID - gesucht. Gibt es einen passenden Eintrag im Protokoll, wird nur nach Dokumenten gesucht, die nach dem Zeitpunkt der letzten Replikation erstellt, geändert oder gelöscht wurden.

Nach diesem Vergleich gibt es im Prinzip drei Listen:
  • Dokumente, die es nur auf der einen Seite gibt,
  • Dokumente, die es nur auf der anderen Seite gibt und
  • Dokumente, die es auf beiden Seiten gibt.

    Gibt es ein Dokument nur auf einer Seite, ist die Sache einfach: Es muss eine Kopie dieses Dokuments auf der jeweils anderen Seite erstellt werden. Komplizierter ist der Fall, wenn ein Dokument auf beiden Seiten existiert. Hierfür hat sich Lotus etwas einfallen lassen:

    Jedes Dokument hat eine Sequenznummer. Wird ein Dokument das erste Mal gespeichert, ist die Sequenznummer 1, danach wird sie bei jedem Speichern jeweils um 1 erhöht. Finden kann man die Sequenznummer eines Dokuments auf dem sechsten Reiter der Dokument-Eigenschaften - als Hexadezimalzahl in der dritten Zeile nach dem Bindestrich:
    A picture named M2

    Dieses Dokument wurde also insgesamt 15 mal gespeichert.

    Außer den Dokumenten hat auch jedes einzelne Item eine Sequenznummer. Wenn man auf dem zweiten Reiter der Dokument-Eigenschaften links ein Item auswählt, werden rechts die Details dargestellt - darunter auch die Sequenznummer als Dezimalzahl:
    A picture named M3


    Wird ein Dokument das erste Mal gespeichert, erhalten es selbst und alle seine Items die Sequenznummer 1. Wird es später bearbeitet und erneut gespeichert, wird die Sequenznummer des Dokuments um 1 erhöht. Außerdem wird für jedes Item geprüft, ob es geändert wurde seit dem letzten Speichern. Falls nicht, wird es nicht verändert, behält also auch seine bisherige Sequenznummer. Hat es sich aber geändert, so bekommt es die aktuelle Nummer des Dokuments als Sequenznummer. Das Bild oben besagt also, dass das Item EntryHTML beim 15. Speichern des Dokuments geändert wurde - und nicht, dass das Item 15 Mal geändert wurde.

    Zusätzlich wird in jedem Dokument die Zeitpunkte der Erstellung und der letzten Änderung in einer internen Eigenschaft gespeichert, die man auf dem ersten Reiter der Dokument-Eigenschaften nachsehen kann. Im Item $Revisions wird die Liste der Zeitpunkte gespeichert, wann es geändert wurde, und in $UpdatedBy die Liste der NotesNamen, wer es geändert hat.

    Alle diese Angaben zusammen helfen dem Replikator zu bestimmen, wo wann welche Änderungen vorgenommen wurden und ob ein Replikationskonflikt vorliegt. Normalerweise wird dann, wenn ein Dokument seit der letzten Replikation auf beiden Seiten geändert wurde, ein Replikationskonflikt erstellt. Ist in der Maske "Replikationskonflikte mischen" ausgewählt - und hat dadurch das Dokument ein Item $ConflictAction mit dem Wert "1", so wird auf Item- statt Dokumentenebene bestimmt, ob ein Konflikt vorliegt. Der Replikator nutzt die Sequenznummern der Items in beiden Dokumente, um zu bestimmen, welcher Wert in das gemischte Dokument einfließt. Wenn er feststellt, dass das gleiche Item auf beiden Seiten verändert wurde, erstellt er wieder ein Replikationskonflikt. In diesem Fall wird das eine Dokument zum Kind-Dokument des anderen gemacht und bekommt ein Item $Conflict.

    Sonderfall: gelöschte Dokumente
    Wird ein Dokument gelöscht, soll es natürlich (im Normalfall) nicht bei der nächsten Replikation wieder - wie ein neu erstelltes Dokument - von der anderen Replik übernommen werden. Damit Notes unterscheiden kann, ob es ein neues oder gelöschtes Dokument ist, wenn der Replikator das Dokument nur in einer Datenbank findet, wird beim Löschen eines Dokuments ein "Deletion Stub" angelegt. Dieser enthält im Wesentlichen die Information, dass es ein Dokument mit einer bestimmten Unique ID gegeben hat und es gelöscht wurde. Findet der Replikator beim Vergleichen der Datenbank-Repliken auf einer Seite einen Deletion Stub, so löscht er das Dokument aus der anderen Replik.

    Update:
    Rob Axelrod, Vice-President von Technotics, Inc. hat mich freundlicherweise unterstützt und einige Unklarheiten beseitigt.

    Update 2:
    Scheinbar gibt es einen Fehler mit $ConflictAction und der "Repklikationskonflikte mischen"-Einstellung seit der Version 6.5.1. Details und Links zu den entsprechenden Technotes gibt es hier:
    Is IBM Lotus asleep at the wheel? What is up with $ConflictAction???, Lord Lotus Blog

Kommentare

#1 Details zur Replizierung Gravatar Image

Senden Sie einen Kommentar

Kommentare

:-D:-o:-p:-x:-(:-):-\:angry::cool::cry::emb::grin::huh::laugh::lips::rolleyes:;-)

Tags

Deutsche RSS-Feeds (German)

Custom Button Custom Button

English RSS feeds

Custom Button Custom Button