Tombstone-Dokumente

Tombstone-Dokumente sind kleine Platzhalterdokumente, die in einer Datenbank erhalten bleiben, wenn das Originaldokument gelöscht wird. Sie ermöglichen das Replizieren des Löschvorgangs.

Nachdem das Replizieren abgeschlossen ist, werden die Tombstones nicht mehr benötigt. Die automatische Komprimierung sorgt dafür, dass beim Replizieren nur ein minimales Datenvolumen beibehalten und übertragen wird. Dennoch, werden die Dokumente auf dem Grabstein nicht automatisch entfernt.

Wenn im Laufe der Zeit immer mehr Dokumente erstellt und gelöscht werden, nimmt die Anzahl der Tombstone-Dokumente zu. Die einzelnen Tombstone-Dokumente sind zwar nur klein, aber sie führen nach und nach zu einer immer höheren Plattenspeicherplatzbelegung durch die Datenbank und zu längeren Abfragezeiten für den Primärindex. Um diese Auswirkungen zu reduzieren, können Sie die Tombstones entfernen.

Manuelles Entfernen von Tombstone-Dokumenten

Führen Sie die folgenden Schritte aus, um Tombstones manuell zu entfernen:

  1. Erstellen Sie eine Datenbank zum Speichern der erforderlichen Dokumente.

Diese neue Datenbank soll alle Dokumente außer den Tombstone-Dokumenten enthalten.

  1. Richten Sie eine gefilterte Replikation ein, um die Dokumente aus der ursprünglichen Datenbank in die neue Datenbank zu replizieren.

Konfigurieren Sie den Filter so, dass Dokumente mit dem Attribut _deleted nicht repliziert werden.

  1. Nachdem die Replikation abgeschlossen ist, modifizieren Sie die Logik Ihrer Anwendung so, dass die neue Datenbank verwendet wird.

  2. Überprüfen Sie, dass Ihre Anwendungen mit der neuen Datenbank ordnungsgemäß funktionieren.

Wenn Sie sicher sind, dass die neue Konfiguration ordnungsgemäß arbeitet, können Sie die alte Datenbank löschen.

Generell sollten Ihre Anwendungen so konzipiert und eingerichtet werden, dass möglichst wenige Löschvorgänge erforderlich sind.

Der folgende Beispielfilter schließt gelöschte Dokumente bei einer Replikation aus:

{
	"_id": "_design/filters",
	"filters": {
		"deleted_filter": "function(doc, req) { return !doc._deleted; };"
	}
}

Erweitertes Entfernen von Tombstone-Dokumenten

Die Methode für manuelles Entfernen funktioniert einwandfrei, wenn keine Dokumente in der Quellendatenbank aktualisiert werden, während die Replikation stattfindet.

Wenn während der Replikation Aktualisierungen durchgeführt werden, kann es vorkommen, dass ein vollständiges Dokument ordnungsgemäß in die Zieldatenbank repliziert und in der Quellendatenbank gelöscht wird (d. h. ein Tombstone bleibt zurück). Das Problem besteht darin, dass der Tombstone nicht in die Zieldatenbank repliziert wird, da er durch den Filter ausgeschlossen wird. Darum wird das Dokument, das in der Quellendatenbank gelöscht wurde, in der Zieldatenbank nicht gelöscht und es entsteht eine Inkonsistenz.

Eine Lösung besteht darin, die Entfernung von Grabsteinen mit Hilfe einer validate_doc_update Funktion.

Eine Funktion validate_doc_update wird in einem Entwurfsdokument gespeichert. Die Funktion wird bei jeder Aktualisierung eines Dokuments in der Datenbank ausgeführt. Mit dieser Funktion können ungültige oder nicht autorisierte Dokumentaktualisierungen verhindert werden.

In dieser Funktion werden die folgenden Parameter verwendet:

  • Die neue Version des Dokuments
  • Die aktuelle Version des Dokuments in der Datenbank
  • Ein Benutzerkontext mit Details zu dem Benutzer, von dem das aktualisierte Dokument bereitgestellt wurde

Die Funktion prüft die Anforderung und ermittelt, ob die Aktualisierung zulässig ist. Wenn die Aktualisierung zulässig ist, gibt die Funktion die weitere Verarbeitung frei. Ist die Aktualisierung nicht zulässig, wird ein entsprechendes Fehlerobjekt zurückgegeben. Wenn der Benutzer nicht berechtigt ist, die Aktualisierung durchzuführen, wird ein Fehlerobjekt unauthorized zusammen mit einer erklärenden Fehlernachricht zurückgegeben. Es kann vorkommen, dass die angeforderte Aktualisierung aus ähnlichen Gründen nicht zulässig ist (z. B. wenn Pflichtfelder im neuen Dokument fehlen). In diesem Fall wird ebenfalls ein Fehlerobjekt forbidden mit einer erklärenden Fehlernachricht zurückgegeben.

Eine geeignete Funktion validate_doc_update zum Entfernen von Tombstone-Dokumenten kann wie folgt arbeiten:

  1. Wenn die Aktualisierung eine Änderung an einem vorhandenen Dokument (oldDoc) in der Zieldatenbank vornehmen soll, gibt die Funktion die Verarbeitung dieser Änderung frei.

Dies liegt darin begründet, dass die Aktualisierung sich auf ein Dokument bezog, das zwar während der Replikation in die Zieldatenbank kopiert wurde, jedoch zwischenzeitlich in der Quellendatenbank geändert wurde. Falls die Änderung aus einer DELETE-Anforderung bestand, wurde ein Tombstone-Datensatz in der Zieldatenbank erstellt. Der Tombstone-Datensatz wird später durch einen nachfolgenden Replikationsprozess entfernt. 2. Die Zieldatenbank verfügt nicht über eine Kopie des aktuellen Dokuments und das zu aktualisierende Dokument wird durch die Eigenschaft _deleted als Tombstone-Dokument ausgewiesen. Daher muss das aktualisierte Dokument ein ebenfalls ein Tombstone-Dokument sein, das bereits früher vorkam, d. h. die Aktualisierung muss abgelehnt werden.

Die folgende JavaScript-Beispielfunktion validate_doc_update weist gelöschte Dokumente zurück, die nicht in der Zieldatenbank enthalten sind:

function(newDoc, oldDoc, userCtx) {
	// any update to an existing doc is OK
	if(oldDoc) {
		return;
	}

	// reject tombstones for docs we don’t know about
	if(newDoc["_deleted"]) {
		throw({forbidden : "Deleted document rejected"});
	}

	return; // Not strictly necessary, but clearer.
}

Gehen Sie wie folgt vor, um Tombstone-Dokumente mithilfe einer Funktion validate_doc_update zu entfernen:

  1. Stoppen Sie die Replikation von der Quellen- in die Zieldatenbank.
  2. Löschen Sie bei Bedarf die Zieldatenbank und erstellen Sie anschließend eine neue Zieldatenbank.
  3. Fügen Sie eine geeignete Funktion validate_doc_update ähnlich dem angegebenen Beispiel hinzu.
  4. Fügen Sie die Funktion zum Entwurfsdokument in der Zieldatenbank hinzu.
  5. Starten Sie die Replikation von der Quellen- in die (neue) Zieldatenbank erneut.
  6. Nachdem die Replikation abgeschlossen ist, modifizieren Sie die Logik Ihrer Anwendung so, dass die neue Datenbank verwendet wird.
  7. Überprüfen Sie, dass Ihre Anwendungen mit der neuen Datenbank ordnungsgemäß funktionieren.

Wenn Sie sicher sind, dass die neue Konfiguration ordnungsgemäß arbeitet, können Sie die alte Datenbank löschen.

Sie können eine weitere Variante der Funktion validate_doc_update verwenden, um Tombstone-Dokumente zu entfernen (falls möglich).

  1. Fügen Sie einige Metadaten zu den Tombstone-Dokumenten hinzu, z. B. zum Aufzeichnen des Löschdatums.
  2. Verwenden Sie die Funktion, um die Metadaten zu überprüfen und das Löschen von Dokumenten zu ermöglichen, wenn sie auf die Zieldatenbank angewendet werden müssen.

Durch diesen Prüfvorgang kann das korrekte Replizieren des Löschvorgangs sichergestellt werden.

Auswirkung der Tombstone-Entfernung auf die Leistung

Tombstones werden für die konsistente Löschung von Dokumenten in Datenbanken verwendet. Diese Verwendung ist besonders für mobile Geräte wichtig: Ohne Tombstone-Dokument wird ein Löschvorgang möglicherweise nicht korrekt auf ein mobiles Gerät repliziert. Dies kann dazu führen, dass Dokumente auf dem Gerät gar nicht gelöscht werden.

Angenommen, Sie erstellen eine Datenbank erneut, z. B. als neues Replikationsziel. In diesem Fall müssen alle Clients, die diese Zieldatenbank als Server nutzen, sämtliche Änderungen erneut verarbeiten, da die Datenbanksequenznummern wahrscheinlich geändert wurden.

Wenn Sie eine Funktion validate_doc_update verwenden, sollten Sie vermeiden, dass diese Funktion in Clients repliziert wird. Diese Regel dient zur Vermeidung unerwünschter Nebeneffekte, die durch das Vorhandensein der Funktion auf dem Client entstehen können.

IBM Cloudant-Synchronisationsbibliotheken replizieren keine Entwurfsdokumente, daher sind validate_doc_update-Funktionen in der Regel kein Problem für IBM Cloudant. Falls andere Clients jedoch die Entwurfsdokumente oder validate_doc_update-Funktionen replizieren, kann dies unerwünschte Nebeneffekte verursachen.