不同编写器管理的组件之间的依赖关系
在某些情况下,一个编写器中的数据依赖于另一个编写器管理的数据。 在这些情况下,应从这两个编写器备份或还原数据。
VSS 通过显式编写器组件依赖项和 IVssWMDependency 接口的概念来处理此问题。
编写器在使用 IVssCreateWriterMetadata::AddComponentDependency 方法创建编写器元数据文档时添加一个或多个依赖项。 编写器向方法传递它管理) 的依赖组件 (的名称和逻辑路径,以及名称和逻辑路径以及 编写器类 ID (标识其所依赖组件的类) GUID。
建立后,此依赖项会通知请求者,在任何备份或还原操作期间,依赖组件及其依赖项的目标都必须参与。
给定的组件可以有多个依赖项,这要求它及其所有依赖目标一起参与备份和还原。
依赖组件和/或目标 (其依赖项) 可以 显式 或 隐式 包含在备份或还原操作中。
不应使用显式编写器组件依赖机制在同一编写器上的两个组件之间创建依赖关系。 选择规则可以更高效地提供相同的功能,而不会带来循环依赖项的风险。
例如, IVssCreateWriterMetadata::AddComponentDependency 可用于使用逻辑路径“”) 编写器 MyWriter 在组件 internetData (上定义组件编写器 Data (的依赖项,其逻辑路径为“Connections”) 编写器名为 InternetConnector 且编写器类 ID 为 X 的编写器。 (虽然多个具有相同类 ID 的编写器可以同时位于系统上, 将避免混淆,因为逻辑路径和组件名称的组合在 VSS.)
编写器只需调用 IVssCreateWriterMetadata::AddComponentDependency ,即可向给定组件添加多个依赖项,这些组件来自不同编写器的不同组件。 通过检查 VSS_COMPONENTINFO 结构的 cDependencies 成员,可以找到给定组件依赖的其他组件数。
编写器或请求者使用 IVssWMComponent::GetDependency 检索 IVssWMDependency 接口的实例。 IVssWMDependency 返回管理组件(作为依赖项目标)的编写器的组件名称、逻辑路径和类 ID。
依赖项机制没有规定依赖组件与其依赖项的目标之间的任何特定优先顺序。 如上所述,所有依赖项都表明,每当备份或还原给定组件时,也必须备份或还原它所依赖的一个或多个组件。 依赖项的确切实现由备份应用程序决定。
例如,在上述情况下,组件 writerData (逻辑路径“”) 依赖于组件 InternetConnector (逻辑路径“Connections”) 。 请求者可通过以下方式之一自由解释:
- 如果选择依赖组件 writerData (隐式或显式) 进行备份或还原,则请求者必须隐式或显式选择 () 其依赖项的目标 internetData
- 如果未选择其依赖项的目标 internetData 进行备份,则不应选择依赖组件 writerData。
但是,在开发对依赖项的支持时,请求者开发人员应注意,编写器无法确定其组件之一是否是依赖项的目标。
声明远程依赖项
分布式应用程序是可以配置为一次使用一台或多台计算机的应用程序。 通常,应用程序在一台或多台应用程序服务器计算机上运行并与 (通信,但实际上可能在) 一台或多台数据库服务器计算机上运行,也可能不运行。 此配置有时称为多系统部署。 通常,也可以将同一应用程序配置为在同时运行应用程序服务器和数据库服务器的单台计算机上运行。 此类配置称为单系统部署。 在这两种配置中,应用程序服务器和数据库服务器都有自己的独立 VSS 编写器。
在多系统部署中,如果由应用程序的编写器管理的组件依赖于由数据库服务器的编写器管理的远程组件,则这称为远程依赖项。 (相反,单系统部署只有本地依赖项。)
作为多系统部署的示例,请考虑使用 SQL Server 数据库服务器作为数据存储的应用程序服务器。 特定于应用程序的数据(包括 Web 部件、Web 内容文件和 IIS 元数据库)驻留在一台或多台计算机上,称为前端 Web 服务器。 实际的 SQL 数据存储(包括配置数据库和多个内容数据库)驻留在一台或多台其他计算机上,称为后端数据库服务器。 每个前端 Web 服务器都包含相同的特定于应用程序的内容和配置。 每个后端数据库服务器都可以托管任何内容数据库或 Config 数据库。 应用程序软件仅在前端 Web 服务器上运行,而不在数据库服务器上运行。 在此配置中,应用程序的 VSS 编写器对 SQL 编写器管理的组件具有远程依赖项。
编写器可以通过调用 AddComponentDependency 方法声明远程依赖项,并将“\\RemoteComputerName\”(其中 RemoteComputerName 是远程组件所在的计算机的名称)追加到 wszOnLogicalPath 参数中的逻辑路径。 RemoteComputerName 的值可以是 GETComputerNameEx 函数返回的 IP 地址或计算机名称。
Windows Server 2003: 在 Windows Server 2003 Service Pack 1 (SP1) 之前,编写器无法声明远程依赖项。
为了标识依赖项,请求者调用 IVssWMDependency 接口的 GetWriterId、GetLogicalPath 和 GetComponentName 方法。 请求者必须检查 GetComponentName 在 pbstrComponentName 参数中返回的组件名称。 如果组件名称以“\\”开头,则请求者必须假定它指定了远程依赖项,并且“\\”后面的第一个组件是编写器调用 AddComponentDependency 时指定的 RemoteComputerName。 如果组件名称不以“\\”开头,则请求者应假定它指定了本地依赖项。
如果存在远程依赖项,则请求者在备份本地组件时必须备份远程组件。 若要备份远程组件,请求者应在远程计算机上具有代理,并且应在远程计算机上启动备份。
构建远程依赖项
请务必了解依赖项本身不是 其中的组件。 需要一个组件来保存依赖项。
以下示例演示了构建一组依赖项的两种方法。
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, "\")
在示例 1 中,依赖项由组件 A 持有。由于只能选择组件,而不能选择单个文件,因此,以这种方式构建组件 A 的依赖项需要始终一起备份和还原整个组件(文件和依赖项)。 无法单独备份或还原它们。
在示例 2 中,单独的组件 (组件 A 和组件 B) 保存每个依赖项。 在这种情况下,可以独立选择这两个组件,因此可以独立备份和还原。 以这种方式构建依赖项使分布式应用程序在管理其远程依赖项方面具有更大的灵活性。
支持远程依赖项
请求者可以为远程依赖项提供完全或部分支持。
若要提供完全支持,请求者应在备份和还原时执行以下操作。
在备份时,请求者必须在前端 (本地) 计算机上启动备份,确定存在的依赖项,并假脱机其他备份作业以捕获后端数据库。 请求者必须等到远程计算机上的后端备份作业完成后,才能调用 IVssBackupComponents::SetBackupSucceeded 和 IVssBackupComponents::BackupComplete 方法。 如果请求者在调用 BackupComplete 之前等待后端组件的备份完成,这将为在备份期间实现其他增强功能(例如拓扑锁定)的编写器生成更易于恢复的备份。 以下过程概述了请求者应执行的操作:
- 在本地计算机上,请求者调用 IVssBackupComponents::InitializeForBackup、 IVssBackupComponents::GatherWriterMetadata、 IVssBackupComponents::P repareForBackup 和 IVssBackupComponents::D oSnapshotSet 方法。
- 在本地卷影复制完成后,但在备份完成之前,请求者会通过向远程计算机上的代理发送请求来后台处理其他备份作业。
- 在远程计算机上,请求者的代理通过调用 InitializeForBackup、 GatherWriterMetadata、 PrepareForBackup、 DoSnapshotSet、 SetBackupSucceeded 和 BackupComplete 来执行后台处理备份序列。
- 当请求者的代理在远程计算机上完成后台处理作业时,请求者通过调用 SetBackupSucceeded 和 BackupComplete 来完成备份序列。
在还原时,请求者必须启动涉及前端 (本地) 计算机的还原,选择要还原的组件及其依赖项,然后通过调用 IVssBackupComponents::P reRestore 方法发送 PreRestore 事件。 然后,请求者应在远程计算机上后台处理后端还原作业,并在后端还原完成后调用 IVssBackupComponents::P ostRestore 方法。 此要求使前端编写器能够更好地控制还原体验,并改善管理员整体用户体验。 由于每个系统中的备份不会在同一时间点进行,因此前端编写器将需要对后端数据执行一些清理。 在前面的“声明远程依赖项”中讨论的示例应用程序中,编写器应在完成其中一个后端数据库的还原后启动站点重新映射或重新编制索引。 为此,编写器必须在前端服务器上接收事件。 以下过程概述了请求者应执行的操作:
- 在本地计算机上,请求者调用 IVssBackupComponents::InitializeForRestore、 GatherWriterMetadata、 IVssBackupComponents::SetSelectedForRestore (或 IVssBackupComponentsEx::SetSelectedForRestoreEx) 和 PreRestore。
- 在预存储阶段完成后,但在 PostRestore 阶段开始之前,请求者通过向远程计算机上的代理发送请求来后台处理其他还原作业。
- 在远程计算机上,请求者的代理通过调用 InitializeForRestore、 GatherWriterMetadata、 SetSelectedForRestore、 PreRestore、 SetFileRestoreStatus (或 SetSelectedForRestoreEx) 和 PostRestore 来执行后台处理还原作业。
- 当请求者的代理在远程计算机上完成后台处理作业时,请求者通过调用 IVssBackupComponents::SetFileRestoreStatus 和 PostRestore 来完成还原序列。
若要提供对远程依赖项的部分支持,请求者必须遵循远程依赖项并将其作为备份的一部分包含在内,但不需要对前端和后端系统上的事件进行排序,如前两个过程中所述。 对于仅实现部分支持的请求者,请求者应参考编写器的备份/还原文档,了解可以支持的方案。