Exchange 群集交互

 

上一次修改主题: 2005-05-23

Exchange 2003 具有群集感知能力,它为与 Windows 群集服务进行通信和交互而提供了它自己的群集资源 DLL(叫做 EXRES.DLL)。Windows 群集服务通过资源监视器与 EXRES.DLL 通信,然后 EXRES.DLL 与 Exchange 组件通信。EXRES.DLL 将群集操作转换为与 Exchange 相关的服务的操作。EXRES.DLL 还监视这些资源是否停止,如果操作是不成功,它还会通知群集服务。下图说明了 EXRES.DLL 和群集服务之间的关系。

b105d839-bb3e-421f-a846-7310eda553eb

在群集中,群集服务负责通过 EXRES.DLL 来启动和停止 Exchange 服务。因此,管理员不应当从命令行、Windows 服务管理单元、资源工具包工具或第三方应用程序停止服务。在群集以外停止服务时,对该服务进行IsAlive 调用将失败,这会导致群集服务试图重新启动已停止的服务。IsAlive 函数将返回从资源运行状况监视线程入池的最后一个值。LooksAlive 函数有与 IsAlive 相同的实现。LooksAlive 函数不被调用,因为 EXRES.DLL 向群集资源监视器提供了用于指示资源什么时候失败的资源失败事件句柄。运行状况监视线程每隔十秒检查一次资源。该资源检查无法进行配置。EXCLUADM.DLL 提供了与 Exchange 和特定于群集的向导关联的接口。

一旦 Exchange 资源被移动到当前节点,就会调用 ExchangeOpen 和 ExchangeClose 函数。在 ExchangeOpen 函数内部,将为基本的资源信息初始化或分配内存。这些函数还会处理资源 DLL 所使用的 DLL 文件的加载和卸载。该过程是由引用计数器控制的。

ExchangeOnline 和 ExchangeOffline 函数用于创建新的 OnlineWrapperThread 和 OfflineWrapperThread 工作线程,并将 ERROR_IO_PENDING 立即返回给群集资源监视器。当包装线程将失败返回给资源监视器时,资源监视器会再尝试重新启动该资源两次。在这些重新启动尝试期间,ExchangeOnline 函数将确定前面的联机/脱机线程是否已返回。如果联机/脱机线程没有返回,则 ExchangeOnline 函数将重新启动。

对于 OfflineWrapperThread,如果 ExchangeOffline 线程没有在针对存储、系统助理和 MTA 资源的 PendingTimeOut 限制时间内返回,则资源监视器将结束相应的进程。

为了防止 RPC 发生挂起的情况,这两个工作线程将创建真实的联机/脱机线程。包装线程充当了联机/脱机线程的监视器,它使用计时器来监视联机/脱机线程的操作情况。如果联机/脱机线程没有在 PendingTimeOut 值(在群集管理器中设置)以内返回,则包装线程将确定操作不成功,并将资源的状态设置为已失败。然后返回错误。该行为的唯一例外是对于升级操作或存储资源联机操作。在这两种情况中,包装线程将等待升级完成,或等待存储资源联机,而不考虑是否超时。

ExchangeOnlineThread 和 ExchangeOfflineThread 为以下 Exchange 资源提供服务:

  • Micrsoft Exchange System Attendant 服务、Microsoft Exchange Information Store 服务和路由:这些资源中的每一个都将启动服务(如果它尚未启动),然后对每个服务进行 RPC 调用,指示它们启动或停止相应的 Exchange 虚拟服务器。
  • 协议资源:协议资源将设置 IIS 元数据库中的命令位,然后启动服务(如果它尚未启动)。相应的服务将挑选命令并启动或停止虚拟服务器。唯一的例外是 SMTP 虚拟服务器。在这种情况下,当虚拟服务器实例脱机时,全部 SMTP 服务都必须停止。IsAlive 函数会检查是否有其他虚拟服务器在同一台物理计算机上运行,并检测到基本 SMTP 服务已停止,然后重新启动该虚拟服务器。

ExchangeOnline 函数将事件句柄返回给资源监视器,然后资源监视器停止调用 ExchangeLooksAlive 函数。但在这里,资源监视器将按照在群集管理器查找活动轮询间隔中所设置的间隔来调用 ExchangeIsAlive 函数。一旦资源已联机,则 EXRES.DLL 将创建两个线程来监视资源的状态。第一个线程名为 ExchangeIsAliveMonitor,它通过唤醒名为 ExchangeCheckIsAliveWrapper 的第二个线程,每隔十秒检查一次资源的状态。ExchangeCheckIsAliveWrapper 执行实际的 IsAlive 检查。如果 ExchangeCheckIsAliveWrapper 线程在 PendingTimeOut 限制内没有返回,或者 IsAlive 检查不成功,那么 ExchangeIsAliveMonitor 线程将把特定资源的失败事件通知资源监视器。ExchangeIsAlive 函数返回最后一次 IsAlive 检查的状态。

该函数用于结束现有 ExchangeIsAliveMonitor 线程。对于 Exchange 存储、系统助理和 MTA 资源,它还执行相应的脱机过程,以确保数据库已卸除。如果脱机过程没有在 PendingTimeOut 限制内成功完成,则 EXRES.DLL 也将终止相应的进程。

用户首先创建资源,然后创建对 EXCLUADM.DLL 的调用,这时系统会提示输入信息。EXCLUADM.DLL 获得资源所需的信息并将它传递给群集服务。资源监视器创建对 EXRES.DLL 中的 ExchangeResourceControl 函数的调用。该调用包含从 EXCLUADM.DLL 和 Clusctl_Resource_Set_Private_Properties 作为控制代码传递来的信息。ExchangeSetPrivateResProperties 用来处理该控制代码。它首先将该信息保存到该资源的 Parameters 注册表项下面的群集数据库中,然后调用 EXSETDATA.DLL 以便让 EXSETDATA.DLL 在 Active Directory 中创建对象。在某些情况下,有可能发生问题,并且一些配置信息在 Exchange 系统管理器中可能已遭修改却没有与群集数据库的更改同步。

 
显示: