Freigeben über


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

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

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

Ein Writer fügt beim Erstellen des Writer-Metadatendokuments mithilfe der IVssCreateWriterMetadata::AddComponentDependency Methode eine oder mehrere Abhängigkeiten hinzu. Der Writer übergibt die Methode den Namen und den logischen Pfad der abhängigen Komponente (die sie verwaltet), sowie den Namen und den logischen Pfad sowie 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, 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 zusammenarbeiten.

Die abhängige Komponente und/oder die Ziel(en) ihrer Abhängigkeiten können entweder explizit oder implizit in sicherungs- oder wiederherstellungsvorgängen .

Der explizite Writer-Komponentenabhängigkeitsmechanismus sollte nicht verwendet werden, um eine Abhängigkeit zwischen zwei Komponenten desselben Writers zu erstellen. Die Auswahlregeln können die gleiche Funktionalität effizienter bereitstellen, ohne dass Zirkelabhängigkeiten gefährdet sind.

Als Beispiel können IVssCreateWriterMetadata::AddComponentDependency verwendet werden, um die Abhängigkeit der Komponenten writerData (mit logischem Pfad "") des Autors MyWriter auf Komponenten-InternetData (mit einem logischen Pfad von "Connections") eines Writers namens "InternetConnector" mit einer Writer-Klassen-ID X zu definieren. (Es ist zwar möglich, dass mehrere Autoren mit derselben Klassen-ID gleichzeitig im System vorhanden sind, Verwirrung wird vermieden, da die Kombination aus logischem Pfad und Komponentenname auf dem System unter VSS eindeutig ist.)

Ein Writer fügt einer bestimmten Komponente einfach mehrere Abhängigkeiten hinzu, indem einfach IVssCreateWriterMetadata::AddComponentDependency wiederholt mit verschiedenen Komponenten verschiedener Autoren aufgerufen wird. Die Anzahl der anderen Komponenten, von der eine komponente abhängt, ist zu finden, indem sie das cDependencies Member der VSS_COMPONENTINFO Struktur untersuchen.

Ein Writer oder Einforderer ruft Instanzen der IVssWMDependency Schnittstelle mit IVssWMComponent::GetDependencyab. Die 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 Präferenzreihenfolge zwischen der abhängigen Komponente und den Zielen seiner Abhängigkeiten vor. Wie bereits erwähnt, bedeutet dies, dass die Komponente, von der sie abhängig ist, auch gesichert oder wiederhergestellt werden muss, wenn eine bestimmte Komponente gesichert oder wiederhergestellt wird. Die genaue Implementierung der Abhängigkeit liegt im Ermessen der Sicherungsanwendung.

Im obigen Fall hängt der Component writerData (logischer Pfad "") beispielsweise von der Komponente "InternetConnector" (logischer Pfad "Connections") ab. Ein Antragsteller 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 ist, muss der Antragsteller (implizit oder explizit) das Ziel seiner Abhängigkeit, internetData, auswählen (implizit oder explizit).
  • 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 entwickler jedoch beachten, dass es keine Möglichkeit gibt, zu bestimmen, ob eine der Komponenten ein Ziel einer Abhängigkeit ist.

Deklarieren von Remoteabhängigkeiten

Eine verteilte Anwendung ist eine Anwendung, die so konfiguriert werden kann, dass sie jeweils einen oder mehrere Computer verwendet. In der Regel wird die Anwendung auf einem oder mehreren Anwendungsservercomputern ausgeführt und kommuniziert mit einem oder mehreren Datenbankservercomputern (möglicherweise oder nicht tatsächlich ausgeführt). Diese Konfiguration wird manchmal als Multisystembereitstellung bezeichnet. Häufig kann dieselbe Anwendung auch so konfiguriert werden, dass sie auf einem einzelnen Computer ausgeführt wird, auf dem sowohl ein Anwendungsserver als auch ein Datenbankserver ausgeführt werden. Eine solche Konfiguration wird als Bereitstellung mit einem einzigen System bezeichnet. In beiden Konfigurationen verfügen der Anwendungsserver und der Datenbankserver über eigene unabhängige VSS-Autoren.

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

Betrachten Sie als Beispiel für eine Multisystembereitstellung einen Anwendungsserver, der einen SQL Server-Datenbankserver als Datenspeicher verwendet. Die anwendungsspezifischen Daten, die Webparts, Webinhaltsdateien und die IIS-Metabasis enthalten, befinden sich auf einem oder mehreren Computern, die als Front-End-Webserver bezeichnet werden. Der eigentliche SQL-Datenspeicher, der die Config-Datenbank und mehrere Inhaltsdatenbanken enthält, befindet sich auf einem oder mehreren anderen Computern, die als Back-End-Datenbankserver bezeichnet werden. Jeder der Front-End-Webserver enthält denselben anwendungsspezifischen Inhalt und dieselbe Konfiguration. Jeder der Back-End-Datenbankserver kann jede der Inhaltsdatenbanken oder die Konfigurationsdatenbank hosten. Die Anwendungssoftware wird nur auf den Front-End-Webservern und nicht auf den Datenbankservern ausgeführt. In dieser Konfiguration verfügt der VSS Writer der Anwendung über Remoteabhängigkeiten von den vom SQL Writer verwalteten Komponenten.

Ein Writer kann eine Remoteabhängigkeit deklarieren, indem die AddComponentDependency--Methode aufgerufen wird, wobei "\\RemoteComputerName\", 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 Remoteabhängigkeiten erst deklarieren, wenn Windows Server 2003 mit Service Pack 1 (SP1) ausgeführt wird.

Um eine Abhängigkeit zu identifizieren, ruft ein Anforderer die GetWriterId, GetLogicalPathund GetComponentName Methoden der IVssWMDependency Schnittstelle auf. Der Antragsteller muss den Komponentennamen untersuchen, der GetComponentName im parameter pbstrComponentName zurückgibt. Wenn der Komponentenname mit "\\" beginnt, muss der Antragsteller davon ausgehen, dass er eine Remoteabhängigkeit angibt und dass die erste Komponente, die "\\" folgt, die RemoteComputerName- ist, die angegeben wurde, wenn der Writer AddComponentDependencyaufgerufen wurde. Wenn der Komponentenname nicht mit "\\" beginnt, sollte der Antragsteller davon ausgehen, dass er eine lokale Abhängigkeit angibt.

Wenn eine Remoteabhängigkeit besteht, muss der Anforderer die Remotekomponente sichern, wenn sie die lokale Komponente sichert. Um die Remotekomponente zu sichern, sollte der Antragsteller ü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 und von sich selbst 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 gehalten. Da nur Komponenten ausgewählt werden können, nicht einzelne Dateien, muss die Strukturierung der Abhängigkeiten von Component A auf diese Weise erfordern, dass die gesamte Komponente, sowohl die Dateien als auch die Abhängigkeiten, immer 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 bietet einer verteilten Anwendung viel mehr Flexibilität bei der Verwaltung ihrer Remoteabhängigkeiten.

Unterstützen von Remoteabhängigkeiten

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

Um vollständigen Support bereitzustellen, sollte der Antragsteller die folgenden Schritte zur Sicherung und Wiederherstellung ausführen.

Zur Sicherungszeit muss der Antragsteller die Sicherung auf dem Front-End-Computer (lokal) starten, die vorhandenen Abhängigkeiten ermitteln und zusätzliche Sicherungsaufträge zum Erfassen der Back-End-Datenbanken spoolen. Der Antragsteller muss warten, bis die Back-End-Sicherungsaufträge auf dem Remotecomputer abgeschlossen wurden, bevor die IVssBackupComponents::SetBackupSucceededed und IVssBackupComponents::BackupComplete Methoden aufgerufen werden. Wenn der Antragsteller wartet, bis die Sicherung von Back-End-Komponenten abgeschlossen ist, bevor BackupComplete-aufgerufen wird, erzeugt dies eine einfacher wiederherstellbare Sicherung für einen Writer, der zusätzliche Verbesserungen implementiert, z. B. topologiesperren, während der Sicherung. Das folgende Verfahren beschreibt, was der Antragsteller tun soll:

  1. Auf dem lokalen Computer ruft der Antragsteller die IVssBackupComponents::InitializeForBackup, IVssBackupComponents::GatherWriterMetadataauf, IVssBackupComponents::P repareForBackupund IVssBackupComponents::D oSnapshotSet Methoden.
  2. Nachdem die lokale Schattenkopie abgeschlossen wurde, aber bevor die Sicherung abgeschlossen ist, spoolt der Antragsteller 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 gepoolte Sicherungssequenz durch Aufrufen InitializeForBackup, GatherWriterMetadata, PrepareForBackup, DoSnapshotSet, SetBackupSucceededund BackupComplete.
  4. Wenn der Agent des Antragstellers die Poolaufträge auf dem Remotecomputer abgeschlossen hat, schließt der Antragsteller die Sicherungssequenz ab, indem er SetBackupSucceededed und BackupComplete-aufruft.

Zur Wiederherstellungszeit muss der Anforderer die Wiederherstellung mit dem Front-End-Computer (lokal) starten, die Komponenten und deren Abhängigkeiten auswählen, die wiederhergestellt werden sollen, und senden Sie dann das PreRestore--Ereignis, indem sie die IVssBackupComponents::P restore--Methode aufruft. Der Antragsteller sollte dann die Back-End-Wiederherstellungsaufträge auf dem Remotecomputer spoolen und die IVssBackupComponents::P ostRestore Methode aufrufen, wenn die Back-End-Wiederherstellung abgeschlossen ist. Diese Anforderung bietet dem Front-End-Writer mehr Kontrolle über die Wiederherstellungserfahrung und eine bessere Benutzerfreundlichkeit des Administrators insgesamt. Da die Sicherungen auf den einzelnen Systemen nicht gleichzeitig auftreten, muss der Front-End-Writer einige Bereinigungen der Back-End-Daten durchführen. In der Beispielanwendung, die im vorherigen Abschnitt "Deklarieren von Remoteabhängigkeiten" erläutert wird, sollte der Writer eine Websiteneuzuordnung initiieren oder neu indizieren, nachdem eine Wiederherstellung einer der Back-End-Datenbanken abgeschlossen wurde. Dazu muss der Writer Ereignisse auf dem Front-End-Server empfangen. Das folgende Verfahren beschreibt, was der Antragsteller tun soll:

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

Um teilweise Unterstützung für Remoteabhängigkeiten bereitzustellen, muss der Antragsteller Remoteabhängigkeiten befolgen und als Teil der Sicherung einschließen, die Anordnung von Ereignissen auf Front-End- und Back-End-Systemen wie in den vorherigen beiden Verfahren ist jedoch nicht erforderlich. Für einen Antragsteller, der nur teilweisen Support implementiert, sollte der Antragsteller auf die Sicherungs-/Wiederherstellungsdokumentation der Writer-Anwendung verweisen, um zu verstehen, welche Szenarien unterstützt werden können.