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:

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:

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:

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