资源监视器


资源监视器提供了资源 DLL 同群集服务之间的通讯接口 。当群集服务需要从资源获取数据时,资源监视器会收到该请求并将它转交给相应的资源 DLL。相反,当资源 DLL 需要报告其状态或需要通知群集服务某个事件时,资源监视器会将这些来自资源的信息转交给群集服务 。
【资源监视器】资源监视器进程是作为群集服务的子进程而派生的,该进程在自己的进程空间中加载监视群集资源的资源 DLL ( 在同群集服务进程不同的进程中加载资源 DLL 将有助于隔离故障 )。同时可以派生和执行多个资源监视器进程 。一个同资源关联的共用属性将确定是将对应的 DLL 载入单独的监视器进程还是载入默认的监视器进程 。在 Windows server 2003 群集中,只能在单独的监视器进程载入一个资源 DLL,不允许进行资源分组 。默认情况下,仅会派生一个资源监视器进程,而所有的资源 DLL 都将被载入该单一进程 。
每个资源监视器都充当群集服务进程的 LRPC 服务器 。当群集服务收到要求同资源 DLL 通讯的群集 API 调用时,它会使用这种 LRPC 接口来调用资源监视器 RPC。为了接收来自资源监视器的响应,群集服务会为每一个资源监视器进程创建一个通知线程 。该通知线程将调用暂时停留在资源监视器中的 RPC,从而一旦有通知生成就可以立即接收它们(比如“资源 X 已联机“) 。该线程只有当资源监视器终止或通过来自群集服务的关闭命令明确停止了资源监视器时才会被释放 。
资源监视器并不维护同自身有关的任何存续状态 。其所有初始状态都是群集服务提供的,它仅保存某些有限的资源内存状态 。资源监视器通过完善定义的入口点(这是资源 DLL 必须提供的,类似于 COM V-Table )同资源 DLL 通讯 。对资源监视器自身而言,它要执行的唯一操作是通过 “ IsAlive ” 和 “ LooksAlive ” 入口点来轮询资源 DLL ( 或者说轮流检查资源 DLL 表明的故障事件 ) 、派生计时器线程 ( 针对那些从 Online 或 Offline 入口点返回 ERROR_IO_PENDING 的资源 DLL,目的是监视其未决的超时 ) 、检测群集服务是否崩溃 ( 如果崩溃,则关闭资源 )。在资源监视器中发生的其它操作则要取决于群集服务通过 RPC 接口请求了什么样的操作 。
群集服务会监视资源监视器是否崩溃,如果检测到该进程崩溃,它将重新启动一个监视器 。在目前的群集服务器中,群集服务不会执行任何 hang (暂停)检测 。
群集服务和资源监视器进程共享一个内存映射扇区(由分页文件支持),在资源监视器启动时,系统会将该扇区的句柄传递给资源监视器 。资源监视器随即会复制该句柄 。资源监视器进程在调用资源 DLL 入口点之前会将入口点编号和资源名称记录到该映射区中 。如果资源监视器崩溃,群集服务(以及该资源监视器的上级异常过滤器)会读取这个共享扇区,以检测导致监视器进程崩溃的资源及其入口点 。

    推荐阅读