Sun Cluster 数据服务开发者指南(适用于 Solaris OS)

第 2 章 开发数据服务

本章向您介绍如何使应用程序具有高可用性和可伸缩性,并提供有关开发数据服务的详细信息。

本章包括以下主题:

分析应用程序的适用性

创建数据服务的第一步是确定目标应用程序是否满足具有高可用性或可伸缩性的要求。如果应用程序没有满足所有要求,您可以修改应用程序源代码,使其具有高可用性或可伸缩性。

下表列出了要具有高可用性或可伸缩性的应用程序需要满足的要求。如果需要详细信息或者需要修改应用程序源代码,请参见附录 B,数据服务样例代码列表


注 –

为了具有高可用性,可伸缩服务必须满足以下所有条件,同时还需满足下列项之后的一些附加条件。


此外,可伸缩服务必须满足以下要求:

对于可伸缩服务,应用程序的特征也可以确定负载平衡策略。例如,允许任一实例响应客户机请求的负载平衡策略 Lb_weighted 不能用于使用服务器内存中的高速缓存进行客户机连接的应用程序。在这种情况下,您应该指定一个负载平衡策略,以限制指定客户机到应用程序的一个实例的通信。负载平衡策略 Lb_stickyLb_sticky_wild 将反复地把客户机发出的所有请求发送到同一应用程序实例,在该实例中请求可以使用内存中的高速缓存。 请注意,如果传入的多个客户机请求来自不同的客户机,RGM 将在服务的实例中分配这些请求。有关设置可伸缩数据服务的负载平衡策略的更多信息,请参见实现故障切换资源

确定要使用的接口

Sun Cluster 开发者支持软件包 (SUNWscdev) 提供了两组用来对数据服务方法进行编码的接口:

Sun Cluster 开发者支持软件包中还提供了一个用来自动创建数据服务的工具 SunPlex Agent Builder。

以下是开发数据服务的建议方法:

  1. 决定是在 C shell 中还是在 Korn shell 中进行编码。如果决定使用 Korn shell,则不能使用仅提供 C 接口的 DSDL。

  2. 运行 Agent Builder,指定所需的信息并生成数据服务,其中包括源代码和可执行代码、一个 RTR 文件和一个软件包。

  3. 如果需要定制生成的数据服务,您可以向生成的源文件添加 DSDL 代码。Agent Builder 将通过注释指明源文件中可添加用户自己的代码的特定位置。

  4. 如果需要进一步定制代码以支持目标应用程序,您可以向现有源代码添加 RMAPI 函数。

在实际情况中,您可以采用多种方法来创建数据服务。例如,除了向 Agent Builder 生成的代码中的特定位置添加自己的代码,您还可以用使用 DSDL 或 RMAPI 函数临时编写的程序完全替换生成的某一方法或生成的监视程序。但是,无论采取哪种方法,在绝大多数情况下从 Agent Builder 出发都很有效,原因如下:


注 –

与 RMAPI 提供一组用于脚本的 C 函数和命令不同,DSDL 仅提供了一个 C 函数接口。因此,如果在 Agent Builder 中指定 Korn shell (ksh) 输出,生成的源代码将调用 RMAPI,因为没有 DSDL ksh 命令。


设置用来编写数据服务的开发环境

开始进行数据服务开发之前,您必须安装 Sun Cluster 开发软件包 (SUNWscdev),以便可以访问 Sun Cluster 头文件和库文件。虽然该软件包已安装在所有群集节点上,但是您通常是在一个独立的、非群集开发计算机上进行数据服务开发,而不是在群集节点上进行。在此情况下,您必须使用 pkgadd 命令在开发计算机上安装 SUNWscdev 软件包。

当编译和链接代码时,您必须设置特定选项来标识头文件和库文件。


注 –

不可在 Solaris 操作系统和 Sun Cluster 产品中同时使用兼容模式编译的 C++ 代码和标准模式编译的 C++ 代码。因此,如果要创建在 Sun Cluster 上使用的基于 C++ 的数据服务,您必须对该数据服务进行编译,如下所示:


在非群集节点上完成开发后,可以将已完成的数据服务传送到群集以进行测试。


注 –

请确保使用的是 Solaris 8 操作系统(或更高版本)的 Developer 或 Entire Distribution 软件组。


本节中的过程将介绍如何完成以下任务:

Procedure如何设置开发环境

此步骤介绍了如何安装 SUNWscdev 软件包和设置用于数据服务开发的编译器和链接程序选项。

步骤
  1. 成为超级用户或作为等效角色。

  2. 将目录更改为所需的 CD-ROM 目录。


    # cd cd-rom-directory
    
  3. 在当前目录下安装 SUNWscdev 软件包。

    • 针对区环境中的 Solaris 10 操作系统,在全局区域中以全局管理员身份键入以下命令:


      # pkgadd -G -d . SUNWscdev
      

      如果 SUNWscdev 的内容对全局区域中与非全局区域共享的区域没有任何影响,则将 SUNWscdev 软件包添加到全局区域。

    • 针对非区环境中的 Solaris 操作系统的其他任何版本或 Solaris 10 操作系统,键入以下命令:


      # pkgadd -d . SUNWscdev
      
  4. makefile 中,指定用于标识数据服务代码的库文件和其他文件的编译器和链接程序选项。

    指定 -I 选项用于标识 Sun Cluster 头文件、-L 选项用于指定开发系统上的编译时库搜索路径、-R 选项用于指定群集中运行时链接程序的库搜索路径。

    # Makefile for sample data service
    ...
    
    -I /usr/cluster/include
    
    -L /usr/cluster/lib
    
    -R /usr/cluster/lib
    ...

将数据服务传送到群集

在开发计算机上完成数据服务后,您必须将其传送到群集以进行测试。为了降低在传送过程中发生错误的可能性,请将数据服务代码和 RTR 文件合并成软件包,然后将该软件包安装在群集的所有节点上。


注 –

无论是使用 pkgadd 还是使用其它方法来安装数据服务,您必须将数据服务安装在所有群集节点上。请注意,Agent Builder 将自动创建此软件包。


设置资源和资源类型属性

Sun Cluster 提供了一组用来定义数据服务静态配置的资源类型属性和资源属性。资源类型属性可指定资源的类型及其版本、API 版本和每个回调方法的路径。资源类型属性中列出了所有资源类型属性。

资源属性(例如 Failover_modeThorough_probe_interval 和方法超时)还定义资源的静态配置。动态资源属性(例如 Resource_state Status)反映受管理资源的活动状态。资源属性中介绍了资源属性。

资源类型和资源属性在资源类型注册 (RTR) 文件中声明,该文件是数据服务的基本组件。RTR 文件用于在群集管理员使用 Sun Cluster 注册数据服务时定义数据服务的初始配置。

请使用 Agent Builder 生成数据服务的 RTR 文件,这是因为 Agent Builder 声明了一组对任何数据服务既有用又必需的属性。例如,某些特殊属性(如 Resource_type)必须在 RTR 文件中声明。否则,数据服务注册将失败。其他属性尽管没有此方面的要求,但是如果不在 RTR 文件中声明它们,群集管理员将无法使用。而某些属性无论是否进行了声明都可以使用,这是因为 RGM 对其进行了定义并为其提供默认值。为了避免这种复杂的情况,请使用 Agent Builder 以确保生成正确的 RTR 文件。如果需要,您可以在以后对该 RTR 文件进行编辑,以更改特定值。

本节的其余部分介绍了由 Agent Builder 创建的 RTR 文件样例。

声明资源类型属性

群集管理员无法配置您在 RTR 文件中声明的资源类型属性。这些属性将成为永久资源类型配置中的一部分。


注 –

资源类型属性 Installed_nodes 只能由群集管理员进行配置。您无法在 RTR 文件中声明 Installed_nodes


资源类型声明的语法如下所示:

property-name = value;

注 –

资源组、资源和资源类型的属性名称区分大小写。在指定属性名称时,您可以使用大小写字母的任意组合。


以下是 RTR 文件中用于样例 (smpl) 数据服务的资源类型声明:

# Sun Cluster Data Services Builder template version 1.0
# Registration information and resources for smpl
#
#NOTE: Keywords are case insensitive, i.e., you can use
#any capitalization style you prefer.
#
Resource_type = "smpl";
Vendor_id = SUNW;
RT_description = "Sample Service on Sun Cluster";

RT_version ="1.0"; 
API_version = 2;
Failover = TRUE;

Init_nodes = RG_PRIMARIES;

RT_basedir=/opt/SUNWsmpl/bin;

Start           =    smpl_svc_start;
Stop            =    smpl_svc_stop;

Validate        =    smpl_validate;
Update          =    smpl_update;

Monitor_start   =    smpl_monitor_start;
Monitor_stop    =    smpl_monitor_stop;
Monitor_check   =    smpl_monitor_check;

提示 –

您必须将 Resource_type 属性声明为 RTR 文件中的第一项。否则,资源类型注册将失败。


第一组资源类型声明提供了有关资源类型的基本信息。

Resource_typeVendor_id

提供资源类型的名称。您可以仅使用 Resource_type 属性指定资源类型名称 (smpl),或使用 Vendor_id 属性作为前缀,并用“.”将该属性与资源类型分隔开 (SUNW.smpl),如样例中所示。如果您使用 Vendor_id,请使其成为公司用于定义资源类型的股市符号。在群集中资源类型的名称必须唯一。


注 –

按照约定,资源类型名称 (vendoridApplicationname) 用作软件包名称。从 Solaris 9 操作系统开始,供应商 ID 和应用程序名称的组合可以超过九个字符。但是,如果您使用的是 Solaris 操作系统的早期版本,则供应商 ID 和应用程序名称的组合不能超过九个字符(尽管 RGM 并没有强制此限制)。

另外,在所有情况下,Agent Builder 都明确地根据资源类型名称生成软件包名称,因此它将强制执行九个字符的限制。


RT_description

简要地介绍资源类型。

RT_version

用于标识数据服务样例的版本。

API_version

用于标识 API 的版本。例如,API_version = 2 表明数据服务可以安装在从 Sun Cluster 3.0 开始的 Sun Cluster 的所有版本上;API_version = 5 表明数据服务可以安装在从 Sun Cluster 3.1 9/04 开始的 Sun Cluster 的所有版本上。但是,API_version = 5 还表明数据服务无法安装在 Sun Cluster 3.1 9/04 发行之前的 Sun Cluster 的所有版本上。有关该属性的详细信息,请参见资源类型属性中有关 API_version 条目下的内容。

Failover = TRUE

表明数据服务无法在可同时在多个节点上联机的资源组中运行。换句话说,该声明指定了一个故障转移数据服务。有关该属性的详细信息,请参见资源类型属性中有关 Failover 条目下的内容。

StartStopValidate

提供由 RGM 调用的各个回调方法程序的路径。这些路径是 RT_basedir 所指定的目录的相对路径。

其余的资源类型声明提供了配置信息。

Init_nodes = RG_PRIMARIES

指定 RGM 仅在可以主控数据服务的节点上调用 InitBootFiniValidate 方法。RG_PRIMARIES 所指定的节点是安装有数据服务的所有节点的一个子集。将值设置为 RT_INSTALLED_NODES 可指定 RGM 在安装有数据服务的所有节点上调用这些方法。

RT_basedir

指向 /opt/SUNWsample/bin,作为指向完整相对路径(例如回调方法路径)的目录路径。

StartStop Validate

提供指向由 RGM 调用的各个回调方法程序的路径。这些路径是 RT_basedir 所指定的目录的相对路径。

声明资源属性

与资源类型属性一样,资源属性也在 RTR 文件中声明。按照惯例,在 RTR 文件中资源属性声明位于资源类型声明之后。资源声明的语法是一组用花括号括起来的属性值对:

{
    attribute = value;
    attribute = value;
             .
             .
             .
    attribute = value;
}

对于 Sun Cluster 提供的资源属性(称为系统定义的属性),您可以在 RTR 文件中更改特定属性。例如,Sun Cluster 为每个回调方法的方法超时属性提供默认值。在 RTR 文件中,您可以指定各种缺省值。

您还可以使用一组由 Sun Cluster 提供的属性的属性,在 RTR 文件中定义新的资源属性(称为扩展属性)。资源特性属性中列出了用于更改和定义资源属性的属性。在 RTR 文件中,扩展属性声明位于系统定义的属性声明之后。

第一组系统定义的资源属性指定了回调方法的超时值。

...

# Resource property declarations appear as a list of bracketed
# entries after the resource type declarations. The property 
# name declaration must be the first attribute after the open
# curly bracket of a resource property entry.
#
# Set minimum and default for method timeouts.
{
        PROPERTY = Start_timeout;
        MIN=60;
        DEFAULT=300;
}

{
        PROPERTY = Stop_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Validate_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Update_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Monitor_Start_timeout;
        MIN=60;
        DEFAULT=300;
}
{
        PROPERTY = Monitor_Stop_timeout;
        MIN=60;
        DEFAULT=300;
{
        PROPERTY = Monitor_Check_timeout;
        MIN=60;
        DEFAULT=300;
}

属性名称 (PROPERTY = value) 必须是每个资源属性声明的第一个属性。您可以在由 RTR 文件中属性的属性定义的限制内配置资源属性。例如,样例中每个方法超时的缺省值都是 300 秒。群集管理员可以更改此值。但是,由 MIN 属性指定的最小允许值是 60 秒。资源特性属性中包含资源属性的属性列表。

下一组资源属性用于定义在数据服务中有特定用法的属性。

{
        PROPERTY = Failover_mode;
        DEFAULT=SOFT;
        TUNABLE = ANYTIME;
}
{
        PROPERTY = Thorough_Probe_Interval;
        MIN=1;
        MAX=3600;
        DEFAULT=60;
        TUNABLE = ANYTIME;
}

# The number of retries to be done within a certain period before concluding
# that the application cannot be successfully started on this node.
{
        PROPERTY = Retry_count;
        MAX=10;
        DEFAULT=2;
        TUNABLE = ANYTIME; 
}

# Set Retry_interval as a multiple of 60 since it is converted from seconds
# to minutes, rounding up. For example, a value of 50 (seconds)
# is converted to 1 minute. Use this property to time the number of
# retries (Retry_count).
{
        PROPERTY = Retry_interval;
        MAX=3600;
        DEFAULT=300;
        TUNABLE = ANYTIME;
}

{
        PROPERTY = Network_resources_used;
        TUNABLE = WHEN_DISABLED;
        DEFAULT = "";
}
{
        PROPERTY = Scalable;
        DEFAULT = FALSE;
        TUNABLE = AT_CREATION;
}
{
        PROPERTY = Load_balancing_policy;
        DEFAULT = LB_WEIGHTED;
        TUNABLE = AT_CREATION;
}
{
        PROPERTY = Load_balancing_weights;
        DEFAULT = "";
        TUNABLE = ANYTIME;
}
{
        PROPERTY = Port_list;
        TUNABLE = ANYTIME;
        DEFAULT = ;
}

这些资源属性声明包含 TUNABLE 属性。该属性将限制在哪种情况下群集管理员可以更改与该属性相关的属性值。例如,值 AT_CREATION 表明群集管理员仅能在创建资源时指定值,并且以后无法更改此值。

对于这些属性中的大多数,您可以接受由 Agent Builder 生成的默认值,除非您有理由更改它们。以下是有关这些属性的信息。有关附加信息,请参见资源属性r_properties(5) 手册页。

Failover_mode

表明在 StartStop 方法失败的情况下,RGM 是应重新查找资源组还是应异常中止节点。

Thorough_probe_intervalRetry_countRetry_interval

用于故障监视器。Tunable 等于 ANYTIME,因此如果故障监视器不能发挥最佳工作效果,群集管理员可以对它们进行调整。

Network_resources_used

数据服务使用的逻辑主机名或共享地址资源的列表。Agent Builder 将声明该属性,以便群集管理员对数据服务进行配置时,可以指定资源列表(如果有)。

Scalable

设置为 FALSE 以表明该资源没有使用群集网络(共享地址)设备。如果将该属性设置为 FALSE,资源类型属性 Failover 必须设置为 TRUE 以表明故障转移服务。有关如何使用该属性的附加信息,请参见将数据服务传送到群集实现回调方法

Load_balancing_policyLoad_balancing_weights

自动声明这些属性。但是,这些属性在故障转移资源类型中不起作用。

Port_list

标识服务器侦听的端口的列表。Agent Builder 将声明该属性,以便群集管理员对数据服务进行配置时,可以指定端口列表。

声明扩展属性

扩展属性位于样例 RTR 文件的结尾处。

# Extension Properties
#

# The cluster administrator must set the value of this property to point to the 
# directory that contains the configuration files used by the application.
# For this application, smpl, specify the path of the configuration file on
# PXFS (typically named.conf).
{
        PROPERTY = Confdir_list;
        EXTENSION;
        STRINGARRAY;
        TUNABLE = AT_CREATION;
        DESCRIPTION = "The Configuration Directory Path(s)";
}

# The following two properties control restart of the fault monitor.
{
        PROPERTY = Monitor_retry_count;
        EXTENSION;
        INT;
        DEFAULT = 4;
        TUNABLE = ANYTIME;
        DESCRIPTION = "Number of PMF restarts allowed for fault monitor.";
}
{
        PROPERTY = Monitor_retry_interval;
        EXTENSION;
        INT;
        DEFAULT = 2;
        TUNABLE = ANYTIME;
        DESCRIPTION = "Time window (minutes) for fault monitor restarts.";
}
# Time out value in seconds for the probe.
{
        PROPERTY = Probe_timeout;
        EXTENSION;
        INT;
        DEFAULT = 120;
        TUNABLE = ANYTIME;
        DESCRIPTION = "Time out value for the probe (seconds)";
}

# Child process monitoring level for PMF (-C option of pmfadm).
# Default of -1 means to not use the -C option of pmfadm.
# A value of 0 or greater indicates the desired level of child-process.
# monitoring.
{
        PROPERTY = Child_mon_level;
        EXTENSION;
        INT;
        DEFAULT = -1;
        TUNABLE = ANYTIME;
        DESCRIPTION = “Child monitoring level for PMF";
}
# User added code -- BEGIN VVVVVVVVVVVV
# User added code -- END   ^^^^^^^^^^^^

Agent Builder 将创建以下扩展属性,这些属性对于大多数数据服务来说都有用。

Confdir_list

指定应用程序配置目录的路径,这对于很多应用程序是有用的信息。当群集管理员对数据服务进行配置时,可以提供该目录的位置。

Monitor_retry_countMonitor_retry_intervalProbe_timeout

控制故障监视器本身的重新启动操作,而非服务器守护进程。

Child_mon_level

设置 PMF 要执行的监视级别。有关更多信息,请参见 pmfadm(1M) 手册页。

您可以在由 User added code 注释分界的区域内创建其他扩展属性。

实现回调方法

本节提供有关实现回调方法的一般信息。

访问资源和资源组属性信息

通常,回调方法需要访问资源属性。RMAPI 同时提供了可在回调方法中使用的 shell 命令和 C 函数,以访问系统定义的资源属性和扩展资源属性。请参见 scha_resource_get(1HA)scha_resource_get(3HA) 手册页。

DSDL 提供一组用于访问系统定义的属性的 C 函数(每种属性一个函数)和一个用于访问扩展属性的函数。请参见 scds_property_functions(3HA)scds_get_ext_property(3HA) 手册页。

您无法使用属性机制存储数据服务的动态状态信息,因为没有 API 函数可用于设置 StatusStatus_msg 以外的资源属性。您应该将动态状态信息存储在全局文件中。


注 –

群集管理员可以使用 scrgadm 命令或通过图形管理命令或界面来设置特定资源属性。但是,请勿从任何回调方法中调用 scrgadm,这是因为在群集重新配置期间(即 RGM 调用方法时)scrgadm 将失败。


方法的幂等性

通常情况下,RGM 不会使用相同的参数对同一资源连续多次调用某个方法。但是,如果 Start 方法失败,RGM 会对资源调用 Stop 方法,即使该资源从未启动过。同样,即使资源守护进程能够终止其自身,RGM 可能仍会对其运行 Stop 方法。相同的情况也适用于 Monitor_startMonitor_stop 方法。

由于这些原因,您必须在 StopMonitor_stop 方法中构建幂等性。使用相同参数对同一资源重复调用 StopMonitor_stop 的结果与调用一次的结果相同。

幂等性的一个含义是使 StopMonitor_stop 必须返回 0(成功),即使这时资源或监视器已经停止并且无工作要完成。


注 –

InitFiniBootUpdate 方法也必须具有幂等性。Start 方法无需具有幂等性。


普通数据服务

普通数据服务 (GDS) 是一种机制,通过将简单的应用程序插入到 Sun Cluster 资源组管理器框架中,可以使其具有高可用性或可伸缩性。该机制不需要对数据服务进行编码,而编码是使应用程序具有高可用性或可伸缩性的常用方法。

GDS 模型依赖于预编译的资源类型 SUNW.gds,以与 RGM 框架进行交互式操作。有关附加信息,请参见第 10 章,普通数据服务

控制应用程序

每当节点加入或退出群集时,回调方法将启用 RGM 来控制基本资源(即应用程序)。

启动和停止资源

资源类型实现至少需要使用 Start 方法和 Stop 方法。RGM 将于适当时候在适当的节点上调用资源类型的方法程序,以使资源组脱机或联机。例如,群集节点崩溃后,RGM 将把该节点主控的所有资源组移到新的节点上。您必须实现 Start 方法,以通过重启未崩溃主机节点上每个资源的方法来提供 RGM。

在资源启动并可用于本地节点之前不能返回 Start方法。请确保需要较长初始化时间的资源类型的 Start 方法设置了足够长的超时。要确保超时足够,请在 RTR 文件中设置 Start_timeout 属性的默认值和最小值。

在 RGM 使资源组脱机的情况下,您必须实现 Stop 方法。例如,假设某个资源组在 Node1 上脱机,在 Node2 上恢复联机。在使资源组脱机的同时,RGM 将对该组中的资源调用 Stop 方法以停止 Node1 上的所有活动。当在 Node1 上对所有资源执行完 Stop 方法后,RGM 将使资源组在 Node2 上恢复联机。

在资源完全停止本地节点上的所有活动并完全关闭之前,Stop 方法不能返回。Stop 方法的最安全实现将终止与该资源相关的本地节点上的所有进程。需要较长时间进行关闭的资源类型的 Stop 方法应设置了足够长的超时。在 RTR 文件中设置 Stop_timeout 属性。

Stop 方法的失败或超时将导致资源组进入需要群集管理员介入的错误状态。要避免进入这种状态,StopMonitor_stop 方法实现应该尝试从所有可能出错的情况下恢复。理想的情况是,成功地停止本地节点上的资源及其监视器的所有活动之后,这些方法将在 0(成功)错误状态下退出。

确定使用哪种 StartStop 方法

与使用 Prenet_startPostnet_stop 方法相比,本节介绍了一些有关何时使用 StartStop 方法的提示。您必须对客户机和数据服务的客户机-服务器联网协议的知识都有深入了解,才能确定要使用的正确方法。

使用网络地址资源的服务可能需要按照与逻辑主机名地址配置相对的特定顺序来执行启动或停止步骤。可选的回调方法 Prenet_start 允许资源类型实现在将同一资源组中的网络地址配置为启用之前执行特定的启动操作,而可选的回调方法 Postnet_stop 允许资源类型实现在将同一资源组中的网络地址配置为关闭之后执行特定的关闭操作。

在调用数据服务的 Prenet_start 方法之前,RGM 调用检测网络地址(但不将网络地址配置为启用)的方法。在调用数据服务的 Postnet_stop 方法之后,RGM 调用不检测网络地址的方法。RGM 使资源组联机时,采用以下顺序:

  1. 检测网络地址。

  2. 调用数据服务的 Prenet_start 方法(如果有)。

  3. 将网络地址配置为启用。

  4. 调用数据服务的 Start 方法(如果有)。

RGM 使资源组脱机时采用相反的顺序:

  1. 调用数据服务的 Stop 方法(如果有)。

  2. 将网络地址配置为关闭。

  3. 调用数据服务的 Postnet_stop 方法(如果有)。

  4. 取消检测网络地址。

在决定使用以下哪一个方法时,请首先考虑服务器端:StartStopPrenet_startPostnet_stop 方法。当使同时包含数据服务应用程序资源和网络地址资源的资源组联机时,RGM 将在调用该数据服务资源的 Start 方法之前,调用用来将网络地址配置为启用的方法。因此,如果数据服务需要在启动时将网络地址配置为启用,请使用 Start 方法启动该数据服务。

同样,当使同时包含数据服务资源和网络地址资源的资源组脱机时,RGM 将在调用数据服务资源的 Stop 方法之后,调用用来将网络地址配置为关闭的方法。因此,如果数据服务需要在停止时将网络地址配置为关闭,请使用 Stop 方法来停止该数据服务。

例如,要启动或关闭某个数据服务,您可能需要运行该数据服务的管理实用程序或库。有时,数据服务具有使用客户机-服务器网络接口进行管理的管理实用程序或库。即管理公用程序将调用服务器守护进程,因此可能需要将网络地址配置为启用来使用管理公用程序或库。在此情况中使用 StartStop 方法。

如果数据服务需要在启动和停止时将网络地址配置为关闭,请使用 Prenet_startPostnet_stop 方法来启动和停止该数据服务。请考虑在进行群集重新配置(带有 SCHA_GIVEOVER 参数的 scha_control() 或带有 scswitch 命令的切换)之后,网络地址还是数据服务首先联机的不同情况会不会使客户机软件做出不同响应。例如,客户机实现可能进行最小限度的重试,当确定数据服务端口不可用后将立即放弃重试。

如果数据服务不需要在启动时将网络地址配置为启用,请在将网络接口配置为启用之前启动该数据服务。使用此方法启动数据服务,可确保当网络地址配置为启用时,数据服务能够立即响应客户机请求。其结果是,客户机不太可能停止重试。在这种情况下,请勿使用 Start 方法,最好使用 Prenet_start 方法来启动数据服务。

如果使用 Postnet_stop 方法,在将网络地址配置为关闭时,数据服务资源仍然可用。仅在将网络地址配置为关闭后,才能运行 Postnet_stop 方法。其结果是,数据服务的 TCP 或 UDP 服务端口或其 RPC 程序号始终可供网络上的客户机使用(除非网络地址也未响应)。


注 –

如果在群集中安装 RPC 服务,则该服务不能使用以下程序号:100141、100142 和 100248。这些编号分别专用于 Sun Cluster 守护进程 rgmd_receptionistfedpmfd。如果您安装的 RPC 服务使用上述程序号之一,请更改该 RPC 服务的程序号。


与使用 Prenet_startPostnet_stop 方法相比,决定使用 StartStop 方法时,或者决定同时使用这两套方案,必须考虑服务器和客户机的要求和行为。

InitFiniBoot 方法

InitFiniBoot 这三种可选方法可启用 RGM 对资源执行初始化和终止代码。

当资源受管理后出现以下一种情况时,RGM 将运行 Init 方法对该资源执行一次性初始化:

当资源不受管理后出现以下一种情况时,RGM 将运行 Fini 方法清理该资源:

清理操作必须具有幂等性。即如果已经完成了清理操作,Fini 将成功退出。

RGM 在新加入群集的节点(即刚刚对这些节点进行了引导或重新引导)上运行 Boot 方法。

使用 Boot 方法执行的初始化操作通常与使用 Init 执行的初始化操作相同。此初始化操作必须具有幂等性,即如果资源已在本地节点上进行了初始化,则 BootInit 将成功退出。

监视资源

通常需要使用监视器,以在资源上运行周期性故障探测来检测所探测的资源是否工作正常。如果故障探测失败,该监视器可以尝试在本地重新启动或请求对受影响的资源组进行故障转移。该监视器可通过调用 scha_control() RMAPI 函数或 scds_fm_action() DSDL 函数请求故障转移。

您还可以监视资源的性能,并调谐或报告性能。编写特定于资源类型的故障监视器是可选操作。即使您选择不编写故障监视器,Sun Cluster 本身进行的基本群集监视操作也会为资源类型带来好处。Sun Cluster 将检测主机硬件的故障、主机操作系统的严重故障以及主机的故障,以便可以在其公共网络上进行通信。

尽管 RGM 并不直接调用资源监视器,但是 RGM 为资源提供了自动启动的监视器。当使资源脱机时,RGM 将在停止资源本身之前,调用 Monitor_stop 方法来停止该资源在本地节点上的监视器。当使资源联机时,RGM 将在启动资源本身之后,调用 Monitor_start 方法。

scha_control() RMAPI 函数和 scds_fm_action() DSDL 函数(它调用 scha_control())允许资源监视器请求将资源组故障转移到另一个节点上。作为它的一次完整性检查,scha_control() 将调用 Monitor_check(如果已定义)来确定请求的节点在主控包含资源的资源组方面是否足够可靠。如果 Monitor_check 报告该节点不可靠或方法超时,RGM 将寻找另一个节点来接收故障转移请求。如果 Monitor_check 在所有节点上都失败,将取消该故障转移操作。

资源监视器可以设置 StatusStatus_msg 属性来反映监视器所监测到的资源状态视图。使用 scha_resource_setstatus() RMAPI 函数、scha_resource_setstatus 命令或 scds_fm_action() DSDL 函数来设置这些属性。


注 –

尽管 StatusStatus_msg 属性对于资源监视器有特定的作用,但是任何程序均可以设置这些属性。


要获得使用 RMAPI 实现的故障监视器的示例,请参见定义故障监视器。要获得使用 DSDL 实现的故障监视器的示例,请参见SUNW.xfnts 故障监视器。有关在 Sun 提供的数据服务中内置的故障监视器的信息,请参见《Sun Cluster Data Services Planning and Administration Guide for Solaris OS》

向资源添加消息日志

如果您希望将状态消息记录到记录其他群集消息的同一个日志文件中,请使用方便的函数 scha_cluster_getlogfacility() 来检索用来记录群集消息的工具号。

使用此工具号和常规的 Solaris syslog() 函数将消息写入群集日志。您也可以通过普通的 scha_cluster_get() 接口访问群集日志工具信息。

提供进程管理

RMAPI 和 DSDL 提供了进程管理工具来实现资源监视器及资源控制回调。RMAPI 定义了以下工具:

进程监视工具 (PMF):pmfadmrpc.pmfd

提供了监视进程及其子进程以及在失败后重新启动进程的方法。该工具由 pmfadm 命令(用于启动和控制受监视的进程)和 rpc.pmfd 守护进程组成。

DSDL 提供一组用于实现 PMF 功能的函数(以 scds_pmf_ 名称开头)。有关 DSDL PMF 功能的概述和各个函数的列表,请参见PMF 函数

有关该命令和守护进程的详细信息,请参见 pmfadm(1M)rpc.pmfd(1M) 手册页。

halockrun

一种用于在保留文件锁定时运行子程序的程序。此命令在 shell 脚本中使用很方便。

有关此命令的详细信息,请参见 halockrun(1M) 手册页。

hatimerun

用于在超时控制下运行子程序的程序。此命令在 shell 脚本中使用很方便。

DSDL 提供了用于实现 hatimerun 功能的 scds_hatimerun() 函数。

有关此命令的详细信息,请参见 hatimerun(1M) 手册页。

提供资源的管理支持

群集管理员对资源执行的操作包括设置和更改资源属性。API 定义了 ValidateUpdate 回调方法,以便您可以创建挂钩到这些管理操作中的代码。

当创建资源时以及群集管理员更新资源或其包含的组的属性时,RGM 将调用可选的 Validate 方法。RGM 将把该资源及其资源组的属性值传送到 Validate 方法。RGM 将在由资源类型的 Init_nodes 属性表示的一组群集节点上调用 Validate。有关 Init_nodes 的信息,请参见资源类型属性rt_properties(5) 手册页。在进行创建或更新之前,RGM 将调用 Validate。在任一节点上来自方法的故障退出代码将导致创建或更新失败。

仅当群集管理员更改资源或组属性时(而不是在 RGM 设置属性时,或者监视器设置 StatusStatus_msg 资源属性时),RGM 才调用 Validate

RGM 将调用可选的 Update 方法来通知运行的资源已对属性进行了更改。群集管理员成功设置了资源或其组的属性后,RGM 将运行 Update。RGM 将对资源处于联机状态的节点调用此方法。此方法可用来通过 API 访问函数读取可能会影响活动资源的属性值,并相应地调整运行资源。

实现故障切换资源

故障转移资源组包含网络地址(例如内置资源类型 LogicalHostnameSharedAddress)和故障转移资源(例如用于故障转移数据服务的数据服务应用程序资源)。当数据服务进行故障转移或切换时,网络地址资源及其依赖的数据服务资源在群集节点之间移动。RGM 提供了多个支持故障切换资源实现的属性。

将布尔 Failover 资源类型属性设置为 TRUE,以限制资源在可同时在多个节点上联机的资源组中进行配置。该属性的默认值为 FALSE,因此您必须在 RTR 文件中将其声明为 TRUE,以用于故障转移资源。

Scalable 资源属性用于确定资源是否使用群集共享地址工具。对于故障转移资源,请将 Scalable 设置为 FALSE,这是因为故障转移资源不使用共享地址。

RG_mode 资源组属性允许群集管理员将资源组标识为故障转移或可伸缩。如果 RG_mode 的值为 FAILOVER,则 RGM 将资源组的 Maximum_primaries 属性设置为 1,并将该资源组限制为由单个节点主控。RGM 不允许在其 RG_mode 的值为 SCALABLE 的资源组中创建其 Failover 属性的值为 TRUE 的资源。

Implicit_network_dependencies 资源组属性用于指定 RGM 应该在资源组内的所有网络地址资源(LogicalHostnameSharedAddress)上强制执行非网络地址资源的隐含强依赖性。其结果是,在资源组中的网络地址配置为启用之前,将不会调用该组中的非网络地址(数据服务)资源的 Start 方法。Implicit_network_dependencies 属性的默认值为 TRUE

实现可伸缩资源

可伸缩资源可以同时在多个节点上联机。可伸缩资源包括数据服务,例如,Sun Cluster HA for Sun Java System Web Server(以前称为 Sun Cluster HA for Sun ONE Web Server)和 Sun Cluster HA for Apache。

RGM 提供了许多支持可伸缩资源实现的属性。

将布尔 Failover 资源类型属性设置为 FALSE,将允许在可同时在多个节点上联机的资源组中配置资源。

Scalable 资源属性用于确定资源是否使用群集共享地址工具。将该属性设置为 TRUE,这是因为可伸缩服务使用共享地址资源,以将该可伸缩服务的多个实例显示为客户机的单个服务。

RG_mode 属性使群集管理员可以将资源组标识为故障切换或可伸缩。如果 RG_mode 的值为 SCALABLE,RGM 将允许 Maximum_primaries 的值大于 1,这意味着该组可以同时由多个节点主控。RGM 将允许其 Failover 属性的值为 FALSE 的资源在其 RG_mode 的值为 SCALABLE 的资源组中实例化。

群集管理员将创建一个用于包含可伸缩服务资源的可伸缩资源组,以及一个用于包含可伸缩资源所依赖的共享地址资源的独立故障转移资源组。

群集管理员使用 RG_dependencies 资源组属性来指定在节点上使资源组联机和脱机的顺序。此顺序对于可伸缩服务很重要,因为可伸缩资源和其依赖的共享地址资源位于不同的资源组中。可伸缩数据服务需要在启动前将其网络地址(共享地址)资源配置为启用。因此,群集管理员必须设置包含可伸缩服务的资源组的 RG_dependencies 属性,以包括含有共享地址资源的资源组。

当您在 RTR 文件中为资源声明 Scalable 属性时,RGM 将自动为该资源创建以下一组可伸缩属性。

Network_resources_used

标识该资源所使用的共享地址资源。此属性默认为空字符串,因此群集管理员必须在创建资源时提供可伸缩服务使用的共享地址的实际列表。scsetup 命令和 SunPlex Manager 为可伸缩服务提供了自动设置所需资源和组的功能。

Load_balancing_policy

为资源指定负载平衡策略。您可以在 RTR 文件中明确设置该策略,或允许使用默认值 LB_WEIGHTED。无论是以上哪种情况,群集管理员都可以在创建资源时更改该值(除非您在 RTR 文件中将 Load_balancing_policyTunable 设置为 NONEFALSE)。以下是您可以使用的合法值:

LB_WEIGHTED

根据在 Load_balancing_weights 属性中设置的权重在不同的节点间分配负载。

LB_STICKY

可伸缩服务的给定客户机(由客户机的 IP 地址标识)总是发送到同一群集节点。

LB_STICKY_WILD

连接到通配符粘滞服务 IP 地址的给定客户机(通过客户机的 IP 地址标识)总是发送到同一个群集节点,无论指向哪个端口号。

对于使用 LB_STICKYLB_STICKY_WILDLoad_balancing_policy 的可伸缩服务,在服务处于联机状态时更改 Load_balancing_weights,可能会导致复位现有的客户机关联。在此情况下,一个不同的节点可能会处理后续的客户机请求(即使该客户机之前已由群集中的另一个节点处理过)。

同样地,在群集中启动该服务的一个新实例可能也会复位现有的客户机关联。

Load_balancing_weights

用来指定要分配给每个节点的负载。其格式为 weight@node,weight@node,其中 weight 是一个反映分配到指定 node 的相对负载部分的整数。分配到某个节点的负载部分是此节点的权数除以所有活动实例权数的和。例如,1@1,3@2 表明节点 1 接收到 ? 的负载,而节点 2 接收到 ? 的负载。

Port_list

用来标识服务器所侦听的端口。此属性缺省为空字符串。您可以在 RTR 文件中提供端口列表。否则,群集管理员在创建资源时必须提供实际端口列表。

您可以将由群集管理员配置的数据服务创建为具有可伸缩性或故障转移。要进行此操作,请在数据服务的 RTR 文件中将 Failover 资源类型属性和 Scalable 资源属性都声明为 FALSE。创建时请将 Scalable 属性指定为可调。

Failover 属性值 FALSE 允许将资源配置到可伸缩资源组中。通过在创建资源时将 Scalable 的值更改为 TRUE,群集管理员将可以启用共享地址来创建可伸缩服务。

另一方面,即使将 Failover 设置为 FALSE,群集管理员也可以将资源配置到故障转移资源组中,以实现故障转移服务。群集管理员不会更改值为 FALSEScalable 的值。要支持此情况,您应该检查 Scalable 属性的 Validate 方法。如果 Scalable 的值为 FALSE,请检验资源是否配置到故障转移资源组中。

《Sun Cluster 概念指南(适用于 Solaris OS)》中包含有关可伸缩资源的其他信息。

可伸缩服务的验证检查

每当在将可伸缩属性值设置为 TRUE 的情况下创建资源或更新资源时,RGM 都将验证各种资源属性。如果属性值未正确配置,RGM 将拒绝更新或创建尝试。RGM 将执行以下方面的检查:

编写和测试数据服务

使用 TCP 持续连接保护服务器

在服务器端使用 TCP 持续连接保护服务器,以避免为关闭的(或网络分区的)客户机浪费系统资源。如果在持续运行了足够长时间的服务器中没有清理这些资源,当客户机崩溃或重新引导时,会最终导致浪费的资源量无限地增长。

如果客户机-服务器通信使用 TCP 流,则客户机和服务器都应启用 TCP 持续连接机制。这也适用于非 HA 单服务器情况。

其他面向连接的协议可能也需要具有持续连接机制。

在客户机端,使用 TCP 持续连接机制,将使客户机在网络地址资源进行故障转移或从一个物理主机切换到另一个物理主机时收到通知。网络地址资源的这种传送将中断 TCP 连接。但是,除非该客户机已启用了持续连接机制,否则当连接中断而当时该连接又正处于静止状态时,该客户机不一定会收到关于此情况的通知。

例如,假设客户机正在等待服务器对长时间运行请求的反应,且该客户机的请求消息已发送到服务器并已在 TCP 层得到了确认。在此情况下,客户机的 TCP 模块无需不断重新传送请求。另外,客户机应用程序将处于阻塞状态,等待对该请求的响应。

在可能的情况下,客户机应用程序除了使用 TCP 持续连接机制以外,还必须在其级别上执行自己的定期持续连接。TCP 持续连接机制在处理所有可能的边界问题上并不都是完美的。通常情况下,使用应用程序级的持续连接机制要求客户机-服务器协议支持空操作,或至少支持有效的只读操作(例如状态操作)。

测试 HA 数据服务

本节提供了如何在 HA 环境中测试数据服务实现的建议。测试情况只是一些建议,并不很全面。您需要访问测试平台 Sun Cluster 的配置,以便测试工作不会对生产计算机造成影响。

测试 HA 数据服务在资源组在物理主机之间移动的所有情况下是否能正常运行。这些情况包括系统崩溃以及使用 scswitch 命令的情况。测试客户机在这些情况下是否可以继续获取服务。

测试方法的幂等性。例如,用可多次调用原始方法的简短 shell 脚本暂时替换所有方法。

协调资源间的依赖性

有时,某个客户机-服务器数据服务在满足某个客户机请求的同时,也会向其他的客户机-服务器数据服务发出请求。例如,如果当数据服务 A 提供其服务时,数据服务 B 也必须提供其服务,则说明数据服务 A 依赖于数据服务 B。为了满足此要求,Sun Cluster 允许在资源组内配置资源的依赖性。这些依赖性会影响 Sun Cluster 启动和停止数据服务的顺序。有关详细信息,请参见 scrgadm(1M) 手册页。

如果您的资源类型的资源依赖于其他类型的资源,则您需要指导群集管理员正确配置资源和资源组。或者,提供正确配置它们的脚本或工具。如果依赖资源必须和“被依赖”资源在同一节点上运行,则必须在同一资源组中配置这两种资源。

决定是使用显式资源依赖性,还是忽略它们,并用您 HA 数据服务的自身代码轮询其他数据服务的可用性。如果依赖资源和被依赖资源可以在不同节点上运行,则可以在不同的资源组中对它们进行配置。在此情况下,需要进行轮询,这是因为不能跨组配置资源依赖性。

某些数据服务本身不直接存储数据。而是依赖其他后端数据服务存储其所有的数据。这样的数据服务将所有只读和更新请求转送到对后端数据服务的调用中。例如,假设一个将其所有数据都保留在 SQL 数据库(例如 Oracle)中的客户机-服务器日程日历服务。日程日历服务具有自己的客户机-服务器网络协议。例如,它可能已使用 RPC 规范语言(例如 ONC RPC)定义了自己的协议。

在 Sun Cluster 环境中,您可以使用 HA-ORACLE 使后端 Oracle 数据库具有高可用性。然后,就可以编写用于启动和停止日程日历守护进程的简单方法。群集管理员使用 Sun Cluster 注册日程日历资源类型。

如果日程日历应用程序必须与 Oracle 数据库在同一节点上运行,则群集管理员必须在与 HA-ORACLE 资源所在的同一资源组中配置日程日历资源并使其依赖于 HA-ORACLE 资源。使用 scrgadm 中的 Resource_dependencies 属性标记指定该依赖性。

如果 HA-ORACLE 资源可以在与日程日历资源不同的节点上运行,则群集管理员将它们配置到两个不同的资源组中。群集管理员可能会在 Oracle 资源组中配置日历资源组的资源组依赖性。但是,资源组依赖性仅当两个资源组同时在同一节点上启动或停止时才有效。因此,日历数据服务守护进程在启动后可能进行轮询,以等待 Oracle 数据库成为可用的数据库。在此情况下,日历资源类型的 Start 方法通常返回成功消息。但是,如果 Start 方法无限期地处于阻塞状态,它将使其资源组处于繁忙状态。此繁忙状态将阻止对该组进行任何进一步的状态更改(例如编辑、故障转移或切换)。但是,如果日历资源的 Start 方法超时或以非零状态退出,则其超时或非零退出状态可能会导致该资源组在两个或多个节点之间切换,而 Oracle 数据库仍不可用。