Abhängigkeiten zwischen Komponenten, die von verschiedenen Writern verwaltet werden

Es gibt Situationen, in denen Daten von einem Writer von Daten abhängen, die von einem anderen Writer verwaltet werden. In diesen Fällen sollten Sie Daten aus beiden Autoren sichern oder wiederherstellen.

VSS behandelt dieses Problem durch das Konzept einer expliziten Writer-Komponentenabhängigkeit und der IVssWMDependency-Schnittstelle .

Ein Writer fügt beim Erstellen des Writer Metadata Document mithilfe der IVssCreateWriterMetadata::AddComponentDependency-Methode eine oder mehrere Abhängigkeiten hinzu. Der Writer übergibt der Methode den Namen und den logischen Pfad der abhängigen Komponente (die er verwaltet), sowie den Namen und den logischen Pfad und die Writer-Klassen-ID (die GUID, die die Klasse identifiziert) der Komponente, von der sie abhängt.

Nach der Einrichtung informiert diese Abhängigkeit den Anforderer darüber, dass während eines Sicherungs- oder Wiederherstellungsvorgangs sowohl die abhängige Komponente als auch die Ziele ihrer Abhängigkeiten teilnehmen müssen.

Eine bestimmte Komponente kann mehrere Abhängigkeiten aufweisen, was erfordert, dass sie und alle abhängigen Ziele an der Sicherung und Wiederherstellung gemeinsam teilnehmen.

Die abhängige Komponente und/oder die Ziele ihrer Abhängigkeiten können entweder explizit oder implizit in sicherungs- oder wiederherstellungsvorgänge einbezogen werden.

Der Abhängigkeitsmechanismus für explizite Writerkomponenten sollte nicht verwendet werden, um eine Abhängigkeit zwischen zwei Komponenten auf demselben Writer zu erstellen. Die Auswahlregeln können dieselbe Funktionalität effizienter bereitstellen, ohne das Risiko zirkulärer Abhängigkeiten zu riskieren.

Als Beispiel könnte IVssCreateWriterMetadata::AddComponentDependency verwendet werden, um die Abhängigkeit der Komponente writerData (mit dem logischen Pfad "") des Writers MyWriter auf der Komponente internetData (mit dem logischen Pfad "Connections") eines Writers namens InternetConnector mit einer Writer-Klassen-ID X zu definieren. (Es ist zwar möglich, dass sich mehrere Autoren mit derselben Klassen-ID gleichzeitig im System befinden, Verwechslungen werden vermieden, da die Kombination aus logischem Pfad und Komponentenname auf dem System unter VSS eindeutig ist.)

Ein Writer fügt einer bestimmten Komponente mehrere Abhängigkeiten hinzu, indem er einfach IVssCreateWriterMetadata::AddComponentDependency aufruft, der mit verschiedenen Komponenten aus verschiedenen Writern wiederholt wird. Die Anzahl der anderen Komponenten, von der eine bestimmte Komponente abhängt, kann ermittelt werden, indem Sie das cDependencies-Element der VSS_COMPONENTINFO-Struktur untersuchen.

Ein Writer oder Anforderer ruft Instanzen der IVssWMDependency-Schnittstelle mit IVssWMComponent::GetDependency ab. IVssWMDependency gibt den Komponentennamen, den logischen Pfad und die Klassen-ID des Writers zurück, der die Komponente verwaltet, die das Ziel der Abhängigkeit ist.

Der Abhängigkeitsmechanismus schreibt keine bestimmte Reihenfolge der Präferenz zwischen der abhängigen Komponente und den Zielen ihrer Abhängigkeiten vor. Wie oben erwähnt, weist eine Abhängigkeit darauf hin, dass immer, wenn eine bestimmte Komponente gesichert oder wiederhergestellt wird, auch die komponente oder die Komponenten, von denen sie abhängt, gesichert oder wiederhergestellt werden muss. Die genaue Implementierung der Abhängigkeit liegt im Ermessen der Sicherungsanwendung.

Im obigen Fall ist beispielsweise die Komponente writerData (logischer Pfad "") von der Komponente InternetConnector (logischer Pfad "Connections") abhängig. Ein Anforderer kann dies auf eine der folgenden Arten interpretieren:

  • Wenn die abhängige Komponente writerData (implizit oder explizit) für die Sicherung oder Wiederherstellung ausgewählt wird, muss der Anforderer (implizit oder explizit) das Ziel seiner Abhängigkeit, internetData, auswählen.
  • Wenn das Ziel der Abhängigkeit, internetData, nicht für die Sicherung ausgewählt ist, sollte die abhängige Komponente writerData nicht ausgewählt werden.

Beim Entwickeln der Unterstützung für Abhängigkeiten sollten sich die Entwickler des Anforderers jedoch bewusst sein, dass ein Writer nicht feststellen kann, ob eine seiner Komponenten ein Ziel einer Abhängigkeit ist.

Deklarieren von Remoteabhängigkeiten

Eine verteilte Anwendung ist eine Anwendung, die für die Gleichzeitige Verwendung eines oder mehrerer Computer konfiguriert werden kann. In der Regel wird die Anwendung auf einem oder mehreren Anwendungsservercomputern ausgeführt und kommuniziert mit einem oder mehreren Datenbankservercomputern (kann aber nicht tatsächlich ausgeführt werden). Diese Konfiguration wird manchmal als Bereitstellung mit mehreren Systemen bezeichnet. Häufig kann dieselbe Anwendung auch für die Ausführung auf einem einzelnen Computer konfiguriert werden, auf dem sowohl ein Anwendungsserver als auch ein Datenbankserver ausgeführt wird. Eine solche Konfiguration wird als Einzelsystembereitstellung bezeichnet. In beiden Konfigurationen verfügen der Anwendungsserver und der Datenbankserver jeweils über eigene unabhängige VSS-Writer.

Wenn eine vom Writer der Anwendung verwaltete Komponente in einer Bereitstellung mit mehreren Systemen von einer Remotekomponente abhängt, die vom Writer des Datenbankservers verwaltet wird, wird dies als Remoteabhängigkeit bezeichnet. (Eine Einzelsystembereitstellung weist dagegen nur lokale Abhängigkeiten auf.)

Als Beispiel für eine Bereitstellung mit mehreren Systemen betrachten Sie einen Anwendungsserver, der einen SQL Server Datenbankserver als Datenspeicher verwendet. Die anwendungsspezifischen Daten, zu denen die Webparts, Webinhaltsdateien und die IIS-Metabasis gehören, befinden sich auf einem oder mehreren Computern, die als Front-End-Webserver bezeichnet werden. Der eigentliche SQL-Datenspeicher, der die Konfigurationsdatenbank und mehrere Inhaltsdatenbanken umfasst, befindet sich auf einem oder mehreren anderen Computern, die als Back-End-Datenbankserver bezeichnet werden. Jeder Front-End-Webserver enthält denselben anwendungsspezifischen Inhalt und dieselbe Konfiguration. Jeder Back-End-Datenbankserver kann alle Inhaltsdatenbanken oder die Config-Datenbank hosten. Die Anwendungssoftware wird nur auf den Front-End-Webservern ausgeführt, nicht auf den Datenbankservern. In dieser Konfiguration weist der VSS-Writer der Anwendung Remoteabhängigkeiten von den vom SQL Writer verwalteten Komponenten auf.

Ein Writer kann eine Remoteabhängigkeit deklarieren, indem er die AddComponentDependency-Methode aufruft, wobei "\\RemoteComputerName\" der Name des Computers ist, auf dem sich die Remotekomponente befindet, zum logischen Pfad im wszOnLogicalPath-Parameter. Der Wert von RemoteComputerName kann eine IP-Adresse oder ein Computername sein, der von der GetComputerNameEx-Funktion zurückgegeben wird.

Windows Server 2003: Ein Writer kann erst unter Windows Server 2003 mit Service Pack 1 (SP1) Remoteabhängigkeiten deklarieren.

Um eine Abhängigkeit zu identifizieren, ruft ein Anforderer die Methoden GetWriterId, GetLogicalPath und GetComponentName der IVssWMDependency-Schnittstelle auf. Der Anforderer muss den Komponentennamen untersuchen, den GetComponentName im PbstrComponentName-Parameter zurückgibt. Wenn der Komponentenname mit "\\" beginnt, muss der Anforderer davon ausgehen, dass er eine Remoteabhängigkeit angibt und dass die erste Komponente nach "\\" der RemoteComputerName ist, der beim Aufruf des Writers AddComponentDependency angegeben wurde. Wenn der Komponentenname nicht mit "\\" beginnt, sollte der Anforderer davon ausgehen, dass er eine lokale Abhängigkeit angibt.

Wenn eine Remoteabhängigkeit besteht, muss der Anforderer die Remotekomponente sichern, wenn die lokale Komponente gesichert wird. Um die Remotekomponente zu sichern, sollte der Anforderer über einen Agent auf dem Remotecomputer verfügen und die Sicherung auf dem Remotecomputer initiieren.

Strukturieren von Remoteabhängigkeiten

Es ist wichtig zu verstehen, dass eine Abhängigkeit keine Komponente an sich ist. Eine Komponente ist erforderlich, um die Abhängigkeit zu halten.

Die folgenden Beispiele zeigen zwei Möglichkeiten zum Strukturieren einer Reihe von Abhängigkeiten.

Example 1:
    Writer 1
        Component A
            File A
            File B
            Dependency (SQL/MSDE Writer, Component X, "\")
            Dependency (SQL/MSDE Writer, Component Y, "\")

Example 2:
    Writer 2
        Component A
            File A
            File B
        Component B
            Dependency (SQL/MSDE Writer, Component X, "\")
            Dependency (SQL/MSDE Writer, Component Y, "\")

In Beispiel 1 werden die Abhängigkeiten von Komponente A gespeichert. Da nur Komponenten ausgewählt werden können, nicht einzelne Dateien, erfordert die Strukturierung der Abhängigkeiten von Komponente A auf diese Weise, dass die gesamte Komponente, sowohl die Dateien als auch die Abhängigkeiten, immer zusammen gesichert und wiederhergestellt werden muss. Sie können nicht einzeln gesichert oder wiederhergestellt werden.

In Beispiel 2 enthalten separate Komponenten (Komponenten A und B) jede der Abhängigkeiten. In diesem Fall können die beiden Komponenten unabhängig voneinander ausgewählt und somit unabhängig gesichert und wiederhergestellt werden. Die Strukturierung der Abhängigkeiten auf diese Weise ermöglicht einer verteilten Anwendung viel mehr Flexibilität bei der Verwaltung ihrer Remoteabhängigkeiten.

Unterstützen von Remoteabhängigkeiten

Ein Anforderer kann vollständige oder teilweise Unterstützung für Remoteabhängigkeiten bereitstellen.

Um vollständigen Support zu bieten, sollte der Anforderer zur Sicherungs- und Wiederherstellungszeit folgendes tun.

Zur Sicherungszeit muss der Anforderer die Sicherung auf dem (lokalen) Front-End-Computer starten, die vorhandenen Abhängigkeiten ermitteln und zusätzliche Sicherungsaufträge anpoolen, um die Back-End-Datenbanken zu erfassen. Der Anforderer muss warten, bis die Back-End-Sicherungsaufträge auf dem Remotecomputer abgeschlossen sind, bevor er die Methoden IVssBackupComponents::SetBackupSucceeded und IVssBackupComponents::BackupComplete aufruft . Wenn der Anforderer wartet, bis die Sicherung der Back-End-Komponenten abgeschlossen ist, bevor Er BackupComplete aufruft, wird eine einfacher wiederherzustellende Sicherung für einen Writer erzeugt, der während der Sicherung zusätzliche Verbesserungen wie z. B. topologiesperren implementiert. Im folgenden Verfahren wird beschrieben, was der Anforderer tun sollte:

  1. Auf dem lokalen Computer ruft der Anforderer die Methoden IVssBackupComponents::InitializeForBackup, IVssBackupComponents::GatherWriterMetadata, IVssBackupComponents::P repareForBackup und IVssBackupComponents::D oSnapshotSet auf.
  2. Nachdem die lokale Schattenkopie abgeschlossen ist, aber bevor die Sicherung abgeschlossen ist, poolt der Anforderer zusätzliche Sicherungsaufträge, indem er eine Anforderung an seinen Agent auf dem Remotecomputer sendet.
  3. Auf dem Remotecomputer führt der Agent des Anforderers die Sicherungssequenz im Spool aus, indem er InitializeForBackup, GatherWriterMetadata, PrepareForBackup, DoSnapshotSet, SetBackupSucceeded und BackupComplete aufruft.
  4. Wenn der Agent des Anforderers die Spoolaufträge auf dem Remotecomputer abgeschlossen hat, schließt der Anforderer die Sicherungssequenz ab, indem er SetBackupSucceeded und BackupComplete aufruft.

Zur Wiederherstellungszeit muss der Anforderer die Wiederherstellung starten, die den Front-End-Computer (lokaler) Computer umfasst, die zu wiederherstellenden Komponenten und deren Abhängigkeiten auswählen und dann das PreRestore-Ereignis senden, indem er die IVssBackupComponents::P reRestore-Methode aufruft . Der Anforderer sollte dann die Back-End-Wiederherstellungsaufträge auf dem Remotecomputer in einen Pool bringen und die IVssBackupComponents::P ostRestore-Methode aufrufen, wenn die Back-End-Wiederherstellungen abgeschlossen sind. Diese Anforderung gibt dem Front-End-Writer mehr Kontrolle über die Wiederherstellungserfahrung und eine bessere Benutzerfreundlichkeit des Administrators insgesamt. Da die Sicherungen auf den einzelnen Systemen nicht zum gleichen Zeitpunkt erfolgen, muss der Front-End-Writer eine bereinigung der Back-End-Daten durchführen. In der beispielbasierten Anwendung, die im vorherigen Abschnitt "Deklarieren von Remoteabhängigkeiten" erläutert wurde, sollte der Writer nach Abschluss der Wiederherstellung einer der Back-End-Datenbanken eine Neuzuordnung oder Neuindizierung einer Website initiieren. Dazu muss der Writer Ereignisse auf dem Front-End-Server empfangen. Im folgenden Verfahren wird beschrieben, was der Anforderer tun sollte:

  1. Auf dem lokalen Computer ruft der Anforderer IVssBackupComponents::InitializeForRestore, GatherWriterMetadata, IVssBackupComponents::SetSelectedForRestore (oder IVssBackupComponentsEx::SetSelectedForRestoreEx) und PreRestore auf.
  2. Nachdem die PreRestore-Phase abgeschlossen ist, aber bevor die PostRestore-Phase beginnt, spoolt der Anforderer zusätzliche Wiederherstellungsaufträge, indem er eine Anforderung an seinen Agent auf dem Remotecomputer sendet.
  3. Auf dem Remotecomputer führt der Agent des Anfordernden die Spool-Wiederherstellungsaufträge durch Aufrufen von InitializeForRestore, GatherWriterMetadata, SetSelectedForRestore, PreRestore, SetFileRestoreStatus (oder SetSelectedForRestoreEx) und PostRestore aus.
  4. Wenn der Agent des Anforderers die Spoolaufträge auf dem Remotecomputer abgeschlossen hat, schließt der Anforderer die Wiederherstellungssequenz ab, indem er IVssBackupComponents::SetFileRestoreStatus und PostRestore aufruft.

Damit Remoteabhängigkeiten teilweise unterstützt werden können, muss der Anforderer Remoteabhängigkeiten befolgen und diese als Teil der Sicherung einschließen, aber die Reihenfolge der Ereignisse auf Front-End- und Back-End-Systemen, wie in den vorherigen beiden Verfahren beschrieben, ist nicht erforderlich. Für einen Anforderer, der nur teilweise Unterstützung implementiert, sollte sich der Anforderer in der Dokumentation zur Sicherung/Wiederherstellung der Writer-Anwendung informieren, um zu verstehen, welche Szenarien unterstützt werden können.