Dipendenze tra componenti gestiti da diversi writer
Esistono situazioni in cui i dati di un writer dipendono dai dati gestiti da un altro writer. In questi casi, è necessario eseguire il backup o ripristinare i dati da entrambi i writer.
VsS gestisce questo problema attraverso la nozione di dipendenza esplicita del componente writer e dell'interfaccia IVssWMDependency .
Un writer aggiunge una o più dipendenze durante la creazione del documento metadati writer usando il metodo IVssCreateWriterMetadata::AddComponentDependency . Il writer passa il metodo il nome e il percorso logico del componente dipendente (che gestisce), nonché il nome e il percorso logico e l'ID classe writer (GUID che identifica la classe) del componente a seconda del quale dipende.
Una volta stabilita, questa dipendenza informa il richiedente che durante qualsiasi operazione di backup o ripristino sia il componente dipendente che le destinazioni delle relative dipendenze devono partecipare.
Un determinato componente può avere più dipendenze, che richiede che e tutte le relative destinazioni dipendenti partecipino insieme al backup e al ripristino.
Il componente dipendente e/o le entità di destinazione delle relative dipendenze possono essere inclusi in modo esplicito o implicito in operazioni di backup o ripristino.
Il meccanismo di dipendenza del componente writer esplicito non deve essere usato per creare una dipendenza tra due componenti nello stesso writer. Le regole di selezione possono fornire la stessa funzionalità in modo più efficiente senza rischi di dipendenze circolari.
Ad esempio, IVssCreateWriterMetadata::AddComponentDependency può essere usato per definire la dipendenza del writer del componenteData (con percorso logico "") del writer MyWriter su InternetData (con un percorso logico di "Connessioni") di un writer denominato InternetConnector con un ID classe writer X. (Anche se è possibile che più writer siano nello stesso ID classe per essere nel sistema contemporaneamente, la confusione verrà evitata perché la combinazione di percorso logico e nome del componente è univoca nel sistema in VSS.
Un writer aggiunge più dipendenze a un determinato componente chiamando semplicemente IVssCreateWriterMetadata::AddComponentDependency ripetuto con componenti diversi da diversi writer. Il numero di altri componenti dipende da un determinato componente può essere trovato esaminando il membro cDependencies della struttura VSS_COMPONENTINFO .
Un writer o un richiedente recupera le istanze dell'interfaccia IVssWMDependency con IVssWMComponent::GetDependency. IVssWMDependency restituisce il nome del componente, il percorso logico e l'ID classe del writer che gestisce il componente di destinazione della dipendenza.
Il meccanismo di dipendenza non prevede alcun ordine specifico di preferenza tra il componente dipendente e le destinazioni delle relative dipendenze. Come indicato in precedenza, tutte le dipendenze indicano che ogni volta che un determinato componente viene eseguito il backup o il ripristino, il componente o i componenti a seconda di deve essere eseguito anche il backup o il ripristino. L'implementazione esatta della dipendenza è a discrezione dell'applicazione di backup.
Nel caso precedente, ad esempio, il writer del componenteData (percorso logico "") dipende dal componente InternetConnector (percorso logico "Connessioni"). Un richiedente è libero di interpretare questa operazione in uno dei modi seguenti:
- Se il componente dipendente, writerData, viene selezionato (in modo implicito o esplicito) per il backup o il ripristino, il richiedente deve selezionare (implicitamente o in modo esplicito) la destinazione della dipendenza, InternetData
- Se la destinazione della dipendenza, InternetData, non è selezionata per il backup, il componente dipendente, writerData, non deve essere selezionato.
Tuttavia, quando si sviluppa il supporto per le dipendenze, gli sviluppatori del richiedente devono tenere presente che non esiste alcun modo in cui un writer può determinare se uno dei relativi componenti è una destinazione di una dipendenza.
Dichiarazione di dipendenze remote
Un'applicazione distribuita è un'applicazione che può essere configurata per l'uso di uno o più computer alla volta. In genere l'applicazione viene eseguita su uno o più computer server applicazioni e comunica con (ma può o non essere effettivamente eseguito) uno o più computer server di database. Questa configurazione viene talvolta definita distribuzione multis system. Spesso la stessa applicazione può essere configurata anche per l'esecuzione in un singolo computer che esegue sia un server applicazioni che un server di database. Tale configurazione viene chiamata distribuzione a sistema singolo. In entrambe le configurazioni, il server applicazioni e il server di database hanno i propri writer VSS indipendenti.
In una distribuzione multi-sistema, se un componente gestito dal writer dell'applicazione dipende da un componente remoto gestito dal writer del server di database, questo viene chiamato dipendenza remota. Una distribuzione a sistema singolo, al contrario, ha solo dipendenze locali.
Come esempio di distribuzione multis system, prendere in considerazione un server applicazioni che usa un server di database SQL Server come archivio dati. I dati specifici dell'applicazione, che includono le web part, i file di contenuto Web e la metabase IIS, si trovano in uno o più computer, denominati server Web front-end. L'archivio dati SQL effettivo, che include il database Config e più database contenuto, risiede in uno o più computer, chiamati server di database back-end. Ognuno dei server Web front-end contiene lo stesso contenuto e configurazione specifici dell'applicazione. Ognuno dei server di database back-end può ospitare uno qualsiasi dei database contenuto o del database Config. Il software dell'applicazione viene eseguito solo nei server Web front-end, non nei server di database. In questa configurazione il writer VSS dell'applicazione ha dipendenze remote sui componenti gestiti dal writer SQL.
Un writer può dichiarare una dipendenza remota chiamando il metodo AddComponentDependency , prepending "\\RemoteComputerName\", dove RemoteComputerName è il nome del computer in cui risiede il componente remoto, al percorso logico nel parametro wszOnLogicalPath . Il valore di RemoteComputerName può essere un indirizzo IP o un nome computer restituito dalla funzione GetComputerNameEx .
Windows Server 2003: Un writer non può dichiarare dipendenze remote fino a Windows Server 2003 con Service Pack 1 (SP1).
Per identificare una dipendenza, un richiedente chiama i metodi GetWriterId, GetLogicalPath e GetComponentName dell'interfaccia IVssWMDependency . Il richiedente deve esaminare il nome del componente restituito da GetComponentName nel parametro pbstrComponentName . Se il nome del componente inizia con "\\", il richiedente deve presupporre che specifica una dipendenza remota e che il primo componente che segue "\\" è il nome RemoteComputerName specificato quando il writer denominato AddComponentDependency. Se il nome del componente non inizia con "\\", il richiedente deve presupporre che specifica una dipendenza locale.
Se esiste una dipendenza remota, il richiedente deve eseguire il backup del componente remoto quando esegue il backup del componente locale. Per eseguire il backup del componente remoto, il richiedente deve avere un agente nel computer remoto e deve avviare il backup nel computer remoto.
Struttura delle dipendenze remote
È importante comprendere che una dipendenza non è un componente in e di se stesso. Un componente è necessario per contenere la dipendenza.
Gli esempi seguenti illustrano due modi per strutturare un set di dipendenze.
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, "\")
Nell'esempio 1 le dipendenze vengono mantenute da Component A. Poiché è possibile selezionare solo i componenti, non singoli file, strutturare le dipendenze di Component A in questo modo richiederebbe che l'intero componente, sia i file che le dipendenze, deve sempre essere eseguito il backup e il ripristino insieme. Non possono essere sottoposti a backup o ripristinati singolarmente.
Nell'esempio 2, i componenti separati (Componenti A e B) contengono ognuna delle dipendenze. In questo caso, i due componenti possono essere selezionati in modo indipendente e quindi sottoposti a backup e ripristinati in modo indipendente. La struttura delle dipendenze in questo modo offre un'applicazione distribuita molto più flessibilità nella gestione delle dipendenze remote.
Supporto delle dipendenze remote
Un richiedente può fornire supporto completo o parziale per le dipendenze remote.
Per fornire il supporto completo, il richiedente deve eseguire le operazioni seguenti in fase di backup e ripristino.
In fase di backup, il richiedente deve avviare il backup nel computer front-end (locale), determinare le dipendenze esistenti e eseguire il pool di processi di backup aggiuntivi per acquisire i database back-end. Il richiedente deve attendere fino al completamento dei processi di backup back-end nel computer remoto prima di chiamare i metodi IVssBackupComponents::SetBackupSucceeded e IVssBackupComponents::BackupComplete . Se il richiedente attende fino al completamento del backup dei componenti back-end prima di chiamare BackupComplete, questo genererà un backup più facilmente recuperabile per un writer che implementa miglioramenti aggiuntivi, ad esempio il blocco della topologia, ad esempio durante il backup. La procedura seguente descrive le operazioni del richiedente:
- Nel computer locale il richiedente chiama i metodi IVssBackupComponents::InitializeForBackup, IVssBackupComponents::GatherWriterMetadata, IVssBackupComponents::P repareForBackup e IVssBackupComponents::D oSnapshotSet .
- Al termine della copia shadow locale, ma prima del completamento del backup, il richiedente esegue il pool di processi di backup aggiuntivi inviando una richiesta al relativo agente nel computer remoto.
- Nel computer remoto l'agente del richiedente esegue la sequenza di backup spooled chiamando InitializeForBackup, GatherWriterMetadata, PrepareForBackup, DoSnapshotSet, SetBackupSucceeded e BackupComplete.
- Quando l'agente del richiedente ha completato i processi di spooling nel computer remoto, il richiedente completa la sequenza di backup chiamando SetBackupSucceed e BackupComplete.
Al momento del ripristino, il richiedente deve avviare il ripristino che coinvolge il computer front-end (locale), selezionare i componenti e le relative dipendenze da ripristinare e quindi inviare l'evento PreRestore chiamando il metodo IVssBackupComponents::P reRestore . Il richiedente deve quindi eseguire ilpooling dei processi di ripristino back-end nel computer remoto e chiamare il metodo IVssBackupComponents::P ostRestore al termine del ripristino back-end. Questo requisito offre al writer front-end un maggiore controllo sull'esperienza di ripristino e un'esperienza utente di amministratore migliore nel complesso. Poiché i backup in ogni sistema non si verificano allo stesso tempo, il writer front-end dovrà eseguire alcune operazioni di pulizia dei dati back-end. Nell'applicazione di esempio descritta nell'argomento precedente "Dichiarare dipendenze remote", il writer deve avviare un mapping o reindexing del sito dopo il ripristino di uno dei database back-end completato. A tale scopo, il writer deve ricevere eventi nel server front-end. La procedura seguente descrive le operazioni del richiedente:
- Nel computer locale il richiedente chiama IVssBackupComponents::InitializeForRestore, GatherWriterMetadata, IVssBackupComponents::SetSelectedForRestore (o IVssBackupComponentsEx::SetSelectedForRestoreEx) e PreRestore.
- Al termine della fase PreRestore , ma prima dell'inizio della fase PostRestore , il richiedente esegue il pool di processi di ripristino aggiuntivi inviando una richiesta al relativo agente nel computer remoto.
- Nel computer remoto l'agente del richiedente esegue i processi di ripristino spooled chiamando InitializeForRestore, GatherWriterMetadata, SetSelectedForRestore, PreRestore, SetFileRestore, SetFileRestoreStatus (o SetSelectedForRestoreEx) e PostRestore.
- Quando l'agente del richiedente ha completato i processi di spooling nel computer remoto, il richiedente completa la sequenza di ripristino chiamando IVssBackupComponents::SetFileRestoreStatus e PostRestore.
Per fornire supporto parziale per le dipendenze remote, il richiedente deve seguire le dipendenze remote e includerle come parte del backup, ma l'ordinamento degli eventi nei sistemi front-end e back-end come descritto nelle due procedure precedenti non sarebbe necessario. Per un richiedente che implementa solo il supporto parziale, il richiedente deve fare riferimento alla documentazione di backup/ripristino dell'applicazione writer per comprendere quali scenari possono essere supportati.