Windows .NET Server 2003 中的 Microsoft 群集服务 (MSCS) 简介

Windows .NET Server 2003 中的 Microsoft 群集服务 (MSCS) 简介


Mohan Rao Cavale
Microsoft Corporation
2002年11月

适用于:Microsoft® Windows® .NET Server 2003 Enterprise Edition
    Microsoft Windows .NET Server 2003 Datacenter Edition
    Microsoft 群集服务

摘要:了解如何在群集环境中对应用程序轻松执行性能检查,而无需更改应用程序代码。本文着重介绍三个支持群集的 Microsoft 服务器技术之一:群集服务。本文包含英文的屏幕拍图。

目录

简介

在任何情况下,仅仅交付一个具有丰富功能集的高质量应用程序是不够的,越来越多的情况下它还必须满足高可用性条件。您是否因为群集技术看起来过于高深,难于理解和使用而没有将应用程序升级?随着 Microsoft® 群集服务(在 Windows® NT™ 4 中引入,在 Windows .NET Server 2003、Enterprise Edition 和 Datacenter Edition 中可用)的出现,开发人员可使用一些简单工具在群集环境中部署应用程序。这些工具能够将群集中的应用程序登记为一般应用程序,并能够借助 Windows 脚本控制应用程序的配置。

群集将两个或多个服务器连接在一起,使其对客户端呈现为单个计算机。将服务器连结到一个群集中可以分担负载、启用单点操作/管理,并为满足日益增长的需求进行相应的调整提供了途径。因此,通过群集可以生成高可用性的应用程序。

本文着重介绍三个支持群集的 Microsoft 服务器技术之一:群集服务。我们将介绍如何在群集环境中对应用程序轻松执行性能检查,而无需更改应用程序代码。

三种群集技术

Microsoft 服务器提供了三种支持群集的技术:网络负载平衡 (NLB)、组件负载平衡 (CLB) 和 Microsoft 群集服务 (MSCS)。

网络负载平衡

网络负载平衡充当前端群集,用于在服务器群集中分配传入的 IP 流量,是为电子商务 Web 站点实现增量可伸缩性和显著可用性的理想选择。可将最多 32 个 Windows .NET Enterprise Server 连结在一起共享一个虚拟 IP 地址。NLB 通过在群集内的多个服务器之间分配客户端请求增强了可伸缩性。随着流量的增加,可以向群集中添加更多的服务器,任何一个群集最多可容纳 32 个服务器。NLB 在为用户提供连续服务的同时还提供了高可用性,即自动检测服务器故障,并在 10 秒钟内在其余服务器中重新分配客户端流量。

组件负载平衡

组件负载平衡可以在多个运行站点业务逻辑的服务器之间分配负载。它在最多包含八个等同服务器的服务器集中提供 COM+ 组件的动态平衡。在 CLB 中,COM+ 组件位于单独的 COM+ 群集中的服务器上。激活 COM+ 组件的调用是平衡到 COM+ 群集中的不同服务器的负载。CLB 通过作用于多层群集网络的中间层与 NLB 和群集服务配合工作。CLB 是作为 Application Center 2000 的功能提供的,可与 Microsoft 群集服务在同一组计算机上运行。

群集服务

群集服务充当后端群集,可为数据库、消息以及文件和打印服务等应用程序提供高可用性。当任一节点(群集中的服务器)发生故障或脱机工作时,MSCS 将尝试最大程度地减少故障对系统的影响。

图 1:三种支持群集的 Microsoft 服务器技术

通过 Microsoft 群集服务实现的故障转移功能

MSCS 故障转移功能是通过群集中连接的多台计算机中的冗余实现的,每台计算机都具有独立的故障状态。冗余要求在群集中的多台计算机上安装应用程序。但是,应用程序任何时刻只在一个节点上处于联机状态。当该应用程序出现故障或该服务器停机时,此应用程序将在另一个节点上重新启动。Windows .NET Server 2003 Datacenter Edition 支持在一个群集中最多包含 8 个节点。

每个节点都具有自己的内存、系统磁盘、操作系统和群集资源的子集。如果某一节点出现故障,另一个节点将接管故障节点的资源(此过程称为“故障转移”)。然后,Microsoft 群集服务将在新节点上注册资源的网络地址,以便将客户端流量路由至当前拥有该资源的可用系统。当故障资源恢复联机状态时,MSCS 可配置为适当地重新分配资源和客户端请求(此过程称为“故障回复”)。要使应用程序恢复到发生故障转移时的那一点,节点必须能够访问保持应用程序状态的共享存储器。

请注意,Microsoft 群集服务旨在提供高可用性,而不是真正的容错功能。“容错”一词通常用于描述提供更高级别恢复功能的技术。容错服务器通常使用结合了特定软件的高级硬件或数据冗余,为单个硬件或软件故障提供近乎瞬时的恢复。这些解决方案的成本远远高于群集解决方案,因为必须支付冗余硬件的费用,而冗余硬件只不过闲置在那里等待恢复故障。Microsoft 群集服务使用价格适宜的标准硬件提供优秀的高可用性解决方案,同时最大程度地利用计算资源。

Microsoft 群集服务基于非共享的群集模型。非共享模型规定,尽管群集中有多个节点可以访问设备或资源,但该资源一次只能由一个系统占有和管理。(在 MSCS 群集中,资源是指任何可以联机或脱机、可在群集中进行管理、一次只能由一个节点提供并可在节点之间移动的物理或逻辑组件。)

图 2:Microsoft 群集服务

群集服务体系结构

Microsoft 群集服务包含三个主要组件:群集服务、资源监视器和资源 DLL。此外,群集管理器还允许生成提供管理功能的扩展 DLL。

群集服务

群集服务是核心组件,并作为高优先级的系统服务运行。群集服务控制群集活动并执行如下任务:协调事件通知、方便群集组件间的通信、处理故障转移操作和管理配置。每个群集节点都运行自己的群集服务。

资源监视器

资源监视器是群集服务和群集资源之间的接口,并作为独立进程运行。群集服务使用资源监视器与资源 DLL 进行通信。DLL 处理所有与资源的通信,因此在资源监视器上宿主 DLL 可以保护群集服务免受错误运行或停止工作的资源造成的影响。资源监视器的多个副本可以在单个节点上运行,从而可以将无法预测的资源与其他资源隔离开。

群集服务在需要对资源执行操作时将向分配给该资源的资源监视器发送请求。如果资源监视器的进程中没有可以处理该类型资源的 DLL,则使用注册信息加载与该资源类型相关的 DLL。然后,将群集服务的请求传递至其中一个 DLL 的入口点函数。资源 DLL 将处理操作的详细信息以符合资源的特定需要。

资源 DLL

第三个主要的 Microsoft 群集服务组件是资源 DLL。资源监视器和资源 DLL 使用资源 API 进行通信。资源 API 是用于管理资源的入口点、回叫函数和相关结构及宏的集合。

对于群集服务而言,资源是任何可进行管理的物理或逻辑组件,例如磁盘、网络名、IP 地址、数据库、站点、应用程序和任何其他可以联机和脱机的实体。资源可按类型进行组织。资源类型包括物理硬件(例如磁盘驱动器)和逻辑项(例如 IP 地址、文件共享和一般应用程序)。

每个资源都使用资源 DLL,它主要是资源监视器和资源之间的被动转换层。资源监视器调用资源 DLL的入口点函数查看资源的状态并使资源联机和脱机。资源 DLL 负责通过便利的 IPC 机制与其资源进行通信,以实现这些方法。

实现其自身资源 DLL 与群集服务通信的应用程序以及使用群集 API 请求和更新群集信息的应用程序都被定义为群集相关应用程序。不使用群集或资源 API 以及群集控制代码函数的应用程序和服务都不识别群集,也无法识别群集服务是否正在运行。这些群集无关应用程序通常作为一般应用程序或服务进行管理。

群集相关和群集无关应用程序都可以在群集节点上运行,并且都可以作为群集资源进行管理。但是,只有群集相关应用程序可以利用群集服务通过群集 API 提供的功能。开发群集相关应用程序需要建立自定义资源类型。通过自定义资源类型,开发人员可以使应用程序在群集发生各种事件(例如,节点即将脱机,因此会关闭数据库连接)时,做出必要的响应并采取措施。

对于大多数需要在群集中运行的应用程序,最好花费一些时间和资源开发自定义资源类型。可先在群集环境中对应用程序进行测试,而不必修改应用程序的代码或创建新的资源类型。在 Windows .NET Server 2003 中,未经修改的应用程序可以作为“群集相关”应用程序在基础级别运行。群集服务专为此用途提供了一般应用程序资源类型。

群集管理器扩展 DLL

群集管理器扩展 DLL 在群集管理器内提供特定于应用程序的管理功能,允许用户以同样的方式管理他们的应用程序,无论该应用程序是在群集内部还是在群集外部运行。开发人员可以在群集管理器框架内提供应用程序管理功能,或只是链接到现有的管理工具。

开发人员可通过编写扩展 DLL 扩展群集管理器的功能。群集管理器应用程序通过一组已定义的 COM 接口与扩展 DLL 进行通信。扩展 DLL 必须实现一组特定的接口并且在群集的每个节点都进行注册。

图 3:主要组件:群集服务、资源监视器和资源 DLL

群集无关应用程序

不提供其自身资源 DLL 的应用程序或服务仍可以在群集环境中进行配置。Windows .NET Server 2003 中的群集服务包括仅用于此目的的一般资源 DLL:一般应用程序资源 DLL 和一般服务资源 DLL。群集服务将这些应用程序或服务看作是群集无关的一般应用程序或服务。

一般资源 DLL 只提供最基本的控制。例如,一般应用程序资源 DLL 通过确定应用程序的进程是否依然存在来检查应用程序是否发生故障,并通过终止进程使应用程序脱机。但它并不依赖于其他资源,而是提供一个在群集环境中测试应用程序的简单方法。

高可用性记事本

并非所有应用程序都能在群集中有效工作。最有效的评估方式就是在群集中实际部署应用程序。执行初始测试的最简单机制是使用内置的一般应用程序资源类型将应用程序登记到群集中。“Generic Application”(一般应用程序)资源类型作为 Windows .NET Server 2003 中群集服务的一部分提供,可以通过查看“Cluster Administrator”(群集管理器)工具中“Cluster Configuration”(群集配置)下的“Resource Types”(资源类型)节点查看该类型以及其他内置资源类型(参见图 4)。

图 4:群集管理器工具中的资源类型节点

群集管理器具有交互式向导,使您能够为列出的任何资源类型创建资源。群集服务还提供了 COM 接口,允许以编程方式创建和管理资源。

注意:最新的群集管理器工具及关联的开发资源可以从 Platform SDK 获得。

群集自动化服务器

群集自动化服务器提供一组自动化对象,用于向脚本语言公开一个完整的群集管理接口,使您能够开发基于 Web 的远程管理工具。群集自动化服务器能够简化和增强创建群集管理应用程序的进程。

群集自动化服务器的面向对象的本质意味着几乎所有群集编程任务都将执行以下步骤:

  1. 确定需要执行的群集操作。
  2. 查找具有属性或方法的群集自动化服务器对象以完成操作。
  3. 确定如何获取步骤 2 中的对象。MSDN® 中提供的对象层次结构可用于此目的。
  4. 获取对象并调用属性或方法。

为了进行说明,我们将使用 Windows Scripting Host 和 Microsoft VBScript 以编程方式创建一般应用程序资源。

群集对象

群集对象是顶层对象,允许创建新实例。群集对象的 ProgID 是“MSCLUSTER.CLUSTER”:

    Set oCluster = CreateObject( "MSCluster.Cluster" )

打开群集

在使用群集上的任何方法之前,必须先打开与该群集的连接。Open 方法将打开与群集的连接。将空字符串 ("") 以参数形式传递给 Open 方法将打开 localhost 上与群集的连接。脚本将在 localhost 服务器上运行:

    oCluster.Open( "" )

创建一个组

群集组是群集资源的容器。当组中的一个资源出现故障且必须将资源转移到其他节点时,该组中的所有资源都将被移动。组还定义了依赖关系边界。如果资源在同一个组中,则该资源只能建立与另一个资源的依赖关系。在测试中,我们将创建一个名为“高可用性记事本”的独特组:

    Set oGroup = oCluster.ResourceGroups.CreateItem( "高可用性记事本" )

创建资源

每个组都包含资源集合。CreateItem 方法创建一个新资源,并将其添加至组集合中。在示例中,我们将创建一个名为“Notepad”的资源,资源类型为“Generic Application”:

    Set oResource = oGroupResources.CreateItem( "Notepad", "Generic 
      Application", 0 )

设置资源属性

每个一般应用程序资源都具有两个可使资源联机的基本属性:CommandLine 和 CurrentDirectory。CommandLine 包含资源联机时要执行的命令,而 CurrentDirectory 则指定从中执行命令的文件系统目录。当此脚本执行使资源联机的语句时,将启动 Notepad。要查看 Notepad,我们还必须将 InteractWithDesktop 属性设置为 1。

    Set oProperties = oResource.PrivateProperties

    ' 设置一般应用程序的属性
    oProperties.Item("CommandLine") = "notepad" 
    oProperties.Item("CurrentDirectory") = "c:\"
    oProperties.Item("InteractWithDesktop") = 1

    oProperties.SaveChanges

使资源联机

Online 方法使资源联机。Online 是一个状态,用于描述资源对群集可用。对于我们的一般应用程序,使资源联机表示启动 Notepad。

    oResource.Online 10

完整脚本列表

Option Explicit

Main
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
  主子例程。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  Sub Main

    Dim oGroup
    Dim oCluster
    Dim oResource

    ' 创建 Cluster 对象。
    Set oCluster = CreateObject( "MSCluster.Cluster" )

    ' 打开群集。空字符串表示打开本地群集。
    oCluster.Open( "" )

    ' 创建或打开组。
    AddGroup oCluster, oGroup

    ' 创建或打开资源。
    AddResource oGroup, oResource

    ' 使资源联机,并在 10 秒内等待
    ' 它实际恢复联机状态。
    oResource.Online 10

End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 此子例程将创建或打开组。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub AddGroup( oCluster, oGroup )
    Set oGroup = oCluster.ResourceGroups.CreateItem( "高可用性记事本" )
End Sub

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
  此子例程将向组添加资源。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub AddResource( oGroup, oResource )
    Dim oGroupResources
    Dim oProperties
    Dim oCLProperty
    Dim oCDPropery

    Set oGroupResources = oGroup.Resources
    Set oResource = oGroupResources.CreateItem( "Notepad", "Generic 
      Application", 0 ) 'CLUSTER_RESOURCE_DEFAULT_MONITOR
    Set oProperties = oResource.PrivateProperties

    ' 设置一般应用程序的属性
    oProperties.Item("CommandLine") = "notepad" 
    oProperties.Item("CurrentDirectory") = "c:\"
    oProperties.Item("InteractWithDesktop") = 1

    oProperties.SaveChanges
End Sub

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 等待指定的时间。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Sub Sleep( PauseTime )
    Dim Start

    Start = Timer

    Do While Timer < Start + PauseTime
    Loop

End Sub

通过运行此简单脚本,将创建新的“Notepad”资源,并将其放入自身的组(“高可用性记事本”)中。

验证结果

我们可以使用群集管理器来验证结果。通过查看“群集管理器”中 Notepad 资源的属性,可以看到已经正确设置了参数(见图 5)。

图 5:Notepad 资源参数

查看 Advanced(高级)选项卡,您将看到默认属性,表明发生故障时应用程序至多重新启动 3 次。LooksAlive 和 IsAlive 轮询间隔默认为资源类型中的值,但也可以指定其他值将其改写。由于此应用程序没有特殊代码使其成为群集相关应用程序,因此仅通过在系统中运行的进程存在与否确定其是否处于活动状态。

图 6:Notepad 资源 Advanced(高级)选项卡

测试应用程序

Notepad 资源联机后将在服务器上启动。如果 Notepad 进程被终止,它将立即再次启动。这是因为群集服务在发挥作用,试图使应用程序保持打开和运行状态。作为一般应用程序资源,群集服务能够注意到应用程序进程何时不再运行,并根据策略采取纠正措施。

如果应用程序发生的故障不会导致进程终止(例如,网络故障、挂起或后台线程终止),结果会怎样呢?遗憾的是,对于一般应用程序资源类型,您只能获得一般故障检测。大多数编写在群集环境中运行的应用程序的开发人员都倾向于生成自定义资源 DLL,来处理应用程序特定的问题。要不是作为在群集中评估应用程序的快捷方法,一般应用程序资源类型不会得到应用。

小结

Microsoft 群集服务使用价格适宜的标准硬件提供高可用性,同时最大程度地利用计算资源。Windows .NET Server 2003 中的群集服务提供了强大的工具,使您的应用程序具有较高的可用性。对于某些开发人员而言,编写群集相关应用程序可能要花费很大成本,且难度较大。为了向开发人员提供使用低投入实现集群的好处,群集服务提供了一般应用程序资源类型,允许在群集内对应用程序进行便捷配置。尽管一般应用程序资源类型可能不会提供生产应用程序所需的复杂性,但是它提供了一个检查方法,可以查看应用程序在群集内的执行情况。

posted @ 2006-11-22 11:36  疯一样的自由  阅读(815)  评论(0编辑  收藏  举报