Dependências entre componentes gerenciados por gravadores diferentes
Há situações em que os dados de um gravador dependem dos dados gerenciados por outro gravador. Nesses casos, você deve fazer backup ou restaurar dados de ambos os gravadores.
O VSS lida com esse problema por meio da noção de uma dependência explícita de componente de gravador e da interface IVssWMDependency .
Um gravador adiciona uma ou mais dependências ao criar o Documento de Metadados do Gravador usando o método IVssCreateWriterMetadata::AddComponentDependency . O gravador passa ao método o nome e o caminho lógico do componente dependente (que ele gerencia), bem como o nome e o caminho lógico e a ID da classe de gravador (o GUID que identifica a classe) do componente do qual ele depende.
Uma vez estabelecida, essa dependência informa ao solicitante que, durante qualquer operação de backup ou restauração, o componente dependente e os destinos de suas dependências devem participar.
Um determinado componente pode ter várias dependências, o que exige que ele e todos os seus destinos dependentes participem do backup e da restauração juntos.
O componente dependente e/ou os destinos de suas dependências podem ser incluídos explicitamente ou implicitamente em operações de backup ou restauração.
O mecanismo de dependência de componente de gravador explícito não deve ser usado para criar uma dependência entre dois componentes no mesmo gravador. As regras de seleção podem fornecer a mesma funcionalidade com mais eficiência sem risco de dependências circulares.
Por exemplo, IVssCreateWriterMetadata::AddComponentDependency poderia ser usado para definir a dependência do componente writerData (com o caminho lógico "") do gravador MyWriter no componente internetData (com um caminho lógico de "Conexões") de um gravador chamado InternetConnector com um gravador classe ID X. (Embora seja possível para vários gravadores com a mesma ID de classe estar no sistema simultaneamente, A confusão será evitada porque a combinação de caminho lógico e nome do componente é exclusiva no sistema em VSS.)
Um gravador adiciona várias dependências a um determinado componente simplesmente chamando IVssCreateWriterMetadata::AddComponentDependency repetidos com diferentes componentes de diferentes gravadores. O número de outros componentes dos quais um determinado componente depende pode ser encontrado examinando o membro cDependencies da estrutura VSS_COMPONENTINFO .
Um gravador ou solicitante recupera instâncias da interface IVssWMDependency com IVssWMComponent::GetDependency. A IVssWMDependency retorna o nome do componente, o caminho lógico e a ID de classe do gravador que gerencia o componente que é o destino da dependência.
O mecanismo de dependência não prescreve nenhuma ordem de preferência específica entre o componente dependente e os destinos de suas dependências. Conforme observado acima, tudo o que uma dependência indica é que sempre que um determinado componente é copiado em backup ou restaurado, o componente ou os componentes dos quais ele depende também devem ser copiados ou restaurados. A implementação exata da dependência fica a critério do aplicativo de backup.
Por exemplo, no caso acima, o componente writerData (caminho lógico "") depende do componente InternetConnector (caminho lógico "Conexões"). Um solicitante é livre para interpretar isso de qualquer uma das seguintes maneiras:
- Se o componente dependente, writerData, estiver selecionado (implicitamente ou explicitamente) para backup ou restauração, o solicitante deverá selecionar (implicitamente ou explicitamente) o destino de sua dependência, InternetData
- Se o destino de sua dependência, InternetData, não estiver selecionado para backup, o componente dependente, writerData, não deverá ser selecionado.
No entanto, ao desenvolver suporte para dependências, os desenvolvedores solicitantes devem estar cientes de que não há como um gravador determinar se um de seus componentes é um destino de uma dependência.
Declarando dependências remotas
Um aplicativo distribuído é um aplicativo que pode ser configurado para usar um ou mais computadores por vez. Normalmente, o aplicativo é executado em um ou mais computadores do servidor de aplicativos e se comunica com (mas pode ou não ser executado) em um ou mais computadores de servidor de banco de dados. Às vezes, essa configuração é conhecida como uma implantação de vários sistemas. Geralmente, o mesmo aplicativo também pode ser configurado para ser executado em um único computador que executa um servidor de aplicativos e um servidor de banco de dados. Essa configuração é chamada de implantação de sistema único. Em ambas as configurações, o servidor de aplicativos e o servidor de banco de dados têm seus próprios gravadores VSS independentes.
Em uma implantação de vários sistemas, se um componente gerenciado pelo gravador do aplicativo depender de um componente remoto gerenciado pelo gravador do servidor de banco de dados, isso será chamado de dependência remota. (Uma implantação de sistema único, por outro lado, tem apenas dependências locais.)
Como exemplo de uma implantação de vários sistemas, considere um servidor de aplicativos que usa um servidor de banco de dados SQL Server como um armazenamento de dados. Os dados específicos do aplicativo, que incluem web parts, arquivos de conteúdo da Web e a metabase do IIS, residem em um ou mais computadores, chamados servidores Web front-end. O repositório de dados SQL real, que inclui o banco de dados Config e vários bancos de dados content, reside em um ou mais computadores, chamados servidores de banco de dados back-end. Cada um dos servidores Web front-end contém o mesmo conteúdo e configuração específicos do aplicativo. Cada um dos servidores de banco de dados de back-end pode hospedar qualquer um dos bancos de dados de conteúdo ou o banco de dados Config. O software de aplicativo é executado somente nos servidores Web front-end, não nos servidores de banco de dados. Nessa configuração, o gravador VSS do aplicativo tem dependências remotas nos componentes gerenciados pelo gravador SQL.
Um gravador pode declarar uma dependência remota chamando o método AddComponentDependency , acrescentando "\\RemoteComputerName\", em que RemoteComputerName é o nome do computador em que o componente remoto reside, para o caminho lógico no parâmetro wszOnLogicalPath . O valor de RemoteComputerName pode ser um endereço IP ou um nome de computador retornado pela função GetComputerNameEx .
Windows Server 2003: Um gravador não pode declarar dependências remotas até o Windows Server 2003 com Service Pack 1 (SP1).
Para identificar uma dependência, um solicitante chama os métodos GetWriterId, GetLogicalPath e GetComponentName da interface IVssWMDependency . O solicitante deve examinar o nome do componente que GetComponentName retorna no parâmetro pbstrComponentName . Se o nome do componente começar com "\\", o solicitante deverá assumir que ele especifica uma dependência remota e que o primeiro componente a seguir "\\" é o RemoteComputerName que foi especificado quando o gravador chamou AddComponentDependency. Se o nome do componente não começar com "\\", o solicitante deverá assumir que ele especifica uma dependência local.
Se houver uma dependência remota, o solicitante deverá fazer backup do componente remoto quando fizer backup do componente local. Para fazer backup do componente remoto, o solicitante deve ter um agente no computador remoto e deve iniciar o backup no computador remoto.
Estruturando dependências remotas
É importante entender que uma dependência não é um componente em si mesma. Um componente é necessário para manter a dependência.
Os exemplos a seguir mostram duas maneiras de estruturar um conjunto de dependências.
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, "\")
No exemplo 1, as dependências são mantidas pelo Componente A. Como somente os componentes podem ser selecionados, não arquivos individuais, estruturar as dependências do Componente A dessa maneira exigiria que todo o componente, tanto os arquivos quanto as dependências, sempre fossem copiados em backup e restaurados juntos. Eles não podem ser copiados em backup ou restaurados individualmente.
No exemplo 2, componentes separados (Componentes A e B) mantêm cada uma das dependências. Nesse caso, os dois componentes podem ser selecionados de forma independente e, portanto, são copiados em backup e restaurados de forma independente. Estruturar as dependências dessa maneira proporciona a um aplicativo distribuído muito mais flexibilidade no gerenciamento de suas dependências remotas.
Suporte a dependências remotas
Um solicitante pode fornecer suporte total ou parcial para dependências remotas.
Para fornecer suporte completo, o solicitante deve fazer o seguinte no momento do backup e da restauração.
No momento do backup, o solicitante deve iniciar o backup no computador front-end (local), determinar as dependências existentes e fazer spool de trabalhos de backup adicionais para capturar os bancos de dados de back-end. O solicitante deve aguardar até que os trabalhos de backup de back-end no computador remoto tenham sido concluídos antes de chamar os métodos IVssBackupComponents::SetBackupSucceeded e IVssBackupComponents::BackupComplete . Se o solicitante aguardar até que o backup de componentes de back-end seja concluído antes de chamar BackupComplete, isso produzirá um backup mais facilmente recuperável para um gravador que implementa aprimoramentos adicionais, como bloqueio de topologia, por exemplo, durante o backup. O procedimento a seguir descreve o que o solicitante deve fazer:
- No computador local, o solicitante chama os métodos IVssBackupComponents::InitializeForBackup, IVssBackupComponents::GatherWriterMetadata, IVssBackupComponents::P repareForBackup e IVssBackupComponents::D oSnapshotSet .
- Depois que a cópia de sombra local é concluída, mas antes que o backup seja concluído, o solicitante faz spool de trabalhos de backup adicionais enviando uma solicitação para seu agente no computador remoto.
- No computador remoto, o agente do solicitante executa a sequência de backup em spool chamando InitializeForBackup, GatherWriterMetadata, PrepareForBackup, DoSnapshotSet, SetBackupSucceeded e BackupComplete.
- Quando o agente do solicitante concluir os trabalhos em spool no computador remoto, o solicitante concluirá a sequência de backup chamando SetBackupSucceeded e BackupComplete.
No momento da restauração, o solicitante deve iniciar a restauração envolvendo o computador front-end (local), selecionar os componentes e suas dependências a serem restaurados e, em seguida, enviar o evento PreRestore chamando o método IVssBackupComponents::P reRestore . Em seguida, o solicitante deve fazer o spool dos trabalhos de restauração de back-end no computador remoto e chamar o método IVssBackupComponents::P ostRestore quando as restaurações de back-end forem concluídas. Esse requisito dá ao gravador de front-end mais controle sobre a experiência de restauração e uma melhor experiência de usuário administrador em geral. Como os backups em cada um dos sistemas não ocorrem no mesmo ponto no tempo, o gravador de front-end precisará executar alguma limpeza dos dados de back-end. No aplicativo de exemplo discutido no "Declarando Dependências Remotas", o gravador deve iniciar um site remapeando ou reindexando após a conclusão de uma restauração de um dos bancos de dados de back-end. Para fazer isso, o gravador deve receber eventos no servidor front-end. O procedimento a seguir descreve o que o solicitante deve fazer:
- No computador local, o solicitante chama IVssBackupComponents::InitializeForRestore, GatherWriterMetadata, IVssBackupComponents::SetSelectedForRestore (ou IVssBackupComponentsEx::SetSelectedForRestoreEx) e PreRestore.
- Após a conclusão da fase de Pré-repositório , mas antes do início da fase do PostRestore , o solicitante faz spool de trabalhos de restauração adicionais enviando uma solicitação ao agente no computador remoto.
- No computador remoto, o agente do solicitante executa os trabalhos de restauração em spool chamando InitializeForRestore, GatherWriterMetadata, SetSelectedForRestore, PreRestore, SetFileRestoreStatus (ou SetSelectedForRestoreEx) e PostRestore.
- Quando o agente do solicitante concluir os trabalhos em spool no computador remoto, o solicitante concluirá a sequência de restauração chamando IVssBackupComponents::SetFileRestoreStatus e PostRestore.
Para fornecer suporte parcial para dependências remotas, o solicitante deve seguir dependências remotas e incluí-las como parte do backup, mas a ordenação de eventos em sistemas front-end e back-end, conforme detalhado nos dois procedimentos anteriores, não seria necessária. Para um solicitante que implementa apenas suporte parcial, o solicitante deve consultar a documentação de backup/restauração do aplicativo gravador para entender quais cenários podem ter suporte.