理解 pureScale 背后的 TSAMP 是如何工作的

  • DB2 pureScale 和 TSAMP 简介
  • peer domain
  • resources
  • resource groups
  • equivalencies
  • managed relationships
  • quorum
  • pureScale 中的 peer domain
  • pureScale 中的 resource, resource group 和 equivalency
  • pureScale 中的 Managed Relationship
  • pureScale 中的 quorum
  • 结束语
  • 参考资源 (resources)


DB2 pureScale 和 TSAMP 简介

pureScale 是 DB2 数据库的特性之一,提供无限的容量、持续的可用性和应用程序程序透明性,它通过把数据库部署到一组服务器上,来降低业务增长的风险和成本。通俗地说,pureScale 是基于共享磁盘架构的数据库集群技术。

TSAMP 全称 Tivoli System Automation for Multiplatforms,可以运行在 AIX、Linux、Solaris 和 Windows 上,被用来管理集群中软硬件资源的高可用,一旦发生故障时,这些资源可以被自动恢复或故障转移。

我们知道,如果 pureScale 某个 member 实例进程被 kill 了,会自动重启,某个节点不可用了,会自动把这个节点的实例转移到其他可用的节点,这一切正是通过 TSAMP 来实现的。要了解 TSAMP 是如何工作的,我们先要对 TSAMP 的术语有所了解:

peer domain

peer domain 也就是通常说的集群,由一定数量的 node 组成。一个 DB2 pureScale 的集群其实是一个抽象概念,从逻辑上说,它由三部分组成,运行在每个 node 上的 DB2 实例环境、GPFS 集群以及 TSAMP 集群(RSCT peer domain)。通常用 lsrpdomain 和 lsrpnode 命令查看 peer domain 的信息。

resources

resource 是集群中软件或者硬件的实体。在 pureScale 中,网卡、DB2 实例、GPFS 文件系统、每一台集群中的节点、仲裁机制这些都是一种 resource。Resource 有如下几个重要属性:

  • NodeNameList:所有可以运行这个 resource 的 node 列表
  • SelectFromPolicy:resource 首先在哪个 node 上运行,一般对于 floating resource 才用到,Any 表示随机选择一个 node;Ordered 表示按照 NodeNameList 的顺序来选择;Ordered,Failback 表示 Ordered 的基础上加上 failback 功能。
  • ResourceType:resource 类型,0 表示 fixed,resource 固定运行在某个 node 上,相应地,NodeNameList 必须只有一个 node;1 表示 floating,resource 运行在多个 node 的某一个上;2 表示 concurrent,resource 运行在多个 node 的每一个上
  • OpState:resource 的运行状态,Online 表示已经启动,Pending Online 表示正在启动,Offline 表示已经停止,Pending Offline 表示正在停止,其余的属于异常状态。

通常用 lsrsrc、lsrg 和 lssam 命令查看 resource 的相关信息。

resource groups

存放一组 resource 的逻辑容器,在集群里,不能对 resouce 进行启动和停止操作,而是把 resource 放进 resource group,通过改变 resource group 的期望状态(Nominal State)来统一的控制 resource 的运行状态(OpState)。放进同一组 resource group 的 resource 可以统一协调的进行工作。通常我们用 lsrg 和 lssam 命令查看 resource group 的信息。

equivalencies

和 resource group 有些类似,equivalency 也是一种 resource 的集合。equivalency 只能由 fixed resource 组成,理解这一点非常重要。例如,集群中的部分 node 可以组成一个 equivalency,集群中所有 node 的所有网卡也可以是一个 equivalency。equivalency 并不像 resource group 那样可以启动和停止,它的主要作用是定义在 resource group 的 AllowedNode 中,或者服务于 managed relationship。通常用 lsequ 命令来查看 equivalency。和 floating resource 相类似,equivalency 也有 SelectFromPolicy 属性。

managed relationships

定义了 source resource 和 target resource 之间的关系,有两个重要的属性:relationship 属性和 condition 属性,具体如下表:

Relationship attribute

Condition attribute

Start or Stop dependencies

Location dependencies

IfOnline

StartAfter

Collocated

IfNotOnline

StopAfter

AntiCollocated

IfOffline

DependsOn

Affinity

IfNotOffline

DependsOnAny

AntiAffinity

IfPossible

ForcedDownBy

IsStartable

None

Start or Stop dependencies 表示 resource 之间启停的关系,Location dependencies 表示 resource 之间位置的关系,Condition attribute 表示 resource 之间的条件。例如:A 是 source resource 和 B 是 target resource,DependsOn 则意味着 source resource 的启动必须依赖于 target resource 的启动,如果 target resource 停止了,那么 source resource 也随即停止;Collocated 则意味着 source resource 必须和 target resource 运行在同一个 node 上;IfOnline 则意味着 source resource 和 target resource 运行在同一个 node 上是有条件的,条件是只有在 targe resource 也启动在该 node 上。有了 managed relationship,TSAMP 可以定制出很多复杂的自动化场景。通常用 lsrel 命令来查看 managed relationship 的信息。

quorum

在某些故障的情况下,集群会分裂成两个子集群甚至更多个,因为它们之间相互看不见,所以 k 可能会重复运行同一个 critical resource,造成数据的不一致,为了避免这种情况,规定:如果某个子集群拥有超过一半数量的 node,那么这个子集群就能幸存下来,幸存下来的子集群被称为是有 operational quorum 的。如果集群内 node 的个数 n 是偶数,分裂成两个 n/2 个 node 组成的子集群,这时 TSAMP 就需要通过 tie breaker 来确定哪个子集群是拥有 operational quorum 的。通常 tie breaker 有如下几种类型:

Tie breaker

支持的操作系统

描述

Operator

AIX, Linux, Windows,Solaris

由管理员决定是否 operational quorum

Fail

AIX, Linux, Windows,Solaris

所有子集群都没有 operational quorum

SCSI

Linux

使用 SCSI 共享磁盘进行 tie breaker

DISK

AIX

使用类 SCSI 的物理磁盘共享磁盘进行 tie breaker

EXEC

AIX, Linux, Windows,Solaris

用用户的可执行程序来确定 tie breaker,比如 samtb_net 可以被用来设置网络 tie breaker

通过 lsrsrc 可以来查看集群的 tie breaker 设置。

接下来,我们通过一个 pureScale 的例子阐述 TSAMP 如何让 pureScale 自动化故障恢复和转移。例子中的 pureScale 配置如下:

  • DBTEST01 和 DBTEST02 是 member 0 和 member 1,CFTEST01 是 primary CF,CFTEST02 是 peer CF;
  • 实例 GPFS 文件系统是 db2sd_20140402163958,数据库 GPFS 文件系统是 db2data;

pureScale 中的 peer domain

我们可以用 lsrpdomain 和 lsrpnode 查看集群和所属节点的状态:

清单 1. lsrpdomain 和 lsrpnode 的输出

-----> lsrpdomain <-----
Name                     OpState RSCTActiveVersion MixedVersions TSPort GSPort
db2domain_20140402163709 Online  3.1.4.4           No            12347  12348  
  -----> lsrpnode -i <-----
Name     OpState RSCTVersion NodeNum NodeID           
CFTEST02 Online  3.1.4.4     4       2be7911c016545ca
CFTEST01 Online  3.1.4.4     2       dd5d10e8017b4f72
DBTEST02 Online  3.1.4.4     3       1082324c017a420e
DBTEST01 Online  3.1.4.4     1       ff4a11ca017b6c0a

Name 是集群和 node 的名字,
OpState 是集群和 node 的运行状态,Online 表示已经启动,可以正常使用
RSCTVersion 是 RSCT 的版本
NodeNum 是 node 编号。
12347 和 12348 分别是 RSCT 中 cthats 和 cthags 两个服务需要监听的端口号。

NodeID 是每个 node 在集群中的唯一标示号,需要指出的是,如果是克隆的 Linux 操作系统,往往会造成不同 node 的 NodeID 相同,这时创建集群就会报错:

“2632-044 the domain cannot be created due to the following errors that were detected while harvesting information from the target nodes:
node1: 2632-068 this node has the same internal identifier as node2 and cannot be included in the domain definition.”

可以运行/usr/sbin/rsct/install/bin/recfgct 来重置 NodeID。

pureScale 中的 resource, resource group 和 equivalency

我们先通过 lssam 命令看下 pureScale 中所有的 resource 及其所属的 resource group 或 equivalency:
清单 2. lssam 的输出

-----> lssam -nocolor <-----
Online IBM.ResourceGroup:ca_db2sdin1_0-rg Nominal=Online
        '- Online IBM.Application:ca_db2sdin1_0-rs
                |- Online IBM.Application:ca_db2sdin1_0-rs:CFTEST01
                '- Online IBM.Application:ca_db2sdin1_0-rs:CFTEST02
Online IBM.ResourceGroup:db2_db2sdin1_0-rg Nominal=Online
        '- Online IBM.Application:db2_db2sdin1_0-rs
                |- Online IBM.Application:db2_db2sdin1_0-rs:DBTEST01
                |- Offline IBM.Application:db2_db2sdin1_0-rs:DBTEST02
Online IBM.ResourceGroup:db2_db2sdin1_1-rg Nominal=Online
        '- Online IBM.Application:db2_db2sdin1_1-rs
                |- Offline IBM.Application:db2_db2sdin1_1-rs:DBTEST01
                |- Online IBM.Application:db2_db2sdin1_1-rs:DBTEST02
Online IBM.ResourceGroup:db2mnt-db2data-rg Nominal=Online
        '- Online IBM.Application:db2mnt-db2data-rs
                |- Online IBM.Application:db2mnt-db2data-rs:DBTEST01
                |- Online IBM.Application:db2mnt-db2data-rs:DBTEST02
Online IBM.ResourceGroup:db2mnt-db2sd_20140402163958-rg Nominal=Online
        '- Online IBM.Application:db2mnt-db2sd_20140402163958-rs
                |- Online IBM.Application:db2mnt-db2sd_20140402163958-rs:CFTEST01
                |- Online IBM.Application:db2mnt-db2sd_20140402163958-rs:CFTEST02
                |- Online IBM.Application:db2mnt-db2sd_20140402163958-rs:DBTEST01
                |- Online IBM.Application:db2mnt-db2sd_20140402163958-rs:DBTEST02
Online IBM.ResourceGroup:idle_db2sdin1_997_DBTEST01-rg Nominal=Online
        '- Online IBM.Application:idle_db2sdin1_997_DBTEST01-rs
                '- Online IBM.Application:idle_db2sdin1_997_DBTEST01-rs:DBTEST01
Online IBM.ResourceGroup:idle_db2sdin1_997_DBTEST02-rg Nominal=Online
        '- Online IBM.Application:idle_db2sdin1_997_DBTEST02-rs
                '- Online IBM.Application:idle_db2sdin1_997_DBTEST02-rs:DBTEST02
Online IBM.ResourceGroup:idle_db2sdin1_998_DBTEST01-rg Nominal=Online
        '- Online IBM.Application:idle_db2sdin1_998_DBTEST01-rs
                '- Online IBM.Application:idle_db2sdin1_998_DBTEST01-rs:DBTEST01
Online IBM.ResourceGroup:idle_db2sdin1_998_DBTEST02-rg Nominal=Online
        '- Online IBM.Application:idle_db2sdin1_998_DBTEST02-rs
                '- Online IBM.Application:idle_db2sdin1_998_DBTEST02-rs:DBTEST02
Online IBM.ResourceGroup:idle_db2sdin1_999_DBTEST01-rg Nominal=Online
        '- Online IBM.Application:idle_db2sdin1_999_DBTEST01-rs
                '- Online IBM.Application:idle_db2sdin1_999_DBTEST01-rs:DBTEST01
Online IBM.ResourceGroup:idle_db2sdin1_999_DBTEST02-rg Nominal=Online
        '- Online IBM.Application:idle_db2sdin1_999_DBTEST02-rs
                '- Online IBM.Application:idle_db2sdin1_999_DBTEST02-rs:DBTEST02
Online IBM.ResourceGroup:primary_db2sdin1_900-rg Nominal=Online
        '- Online IBM.Application:primary_db2sdin1_900-rs Control=StartInhibited
                |- Online IBM.Application:primary_db2sdin1_900-rs:CFTEST01
                '- Offline IBM.Application:primary_db2sdin1_900-rs:CFTEST02
Online IBM.Equivalency:ca_db2sdin1_0-rg_group-equ
        |- Online IBM.PeerNode:CFTEST01:CFTEST01
        '- Online IBM.PeerNode:CFTEST02:CFTEST02
Online IBM.Equivalency:cacontrol_db2sdin1_equ
        |- Online IBM.Application:cacontrol_db2sdin1_128_CFTEST01:CFTEST01
        '- Online IBM.Application:cacontrol_db2sdin1_129_CFTEST02:CFTEST02
Online IBM.Equivalency:db2_db2sdin1_0-rg_group-equ
        |- Online IBM.PeerNode:DBTEST01:DBTEST01
        |- Online IBM.PeerNode:DBTEST02:DBTEST02
Online IBM.Equivalency:db2_db2sdin1_1-rg_group-equ
        |- Online IBM.PeerNode:DBTEST02:DBTEST02
        '- Online IBM.PeerNode:DBTEST01:DBTEST01
Online IBM.Equivalency:db2_public_network_db2sdin1_0
        |- Online IBM.NetworkInterface:en0:DBTEST01
        |- Online IBM.NetworkInterface:en0:DBTEST02
Online IBM.Equivalency:db2mnt-db2data-rg_group-equ
        |- Online IBM.PeerNode:DBTEST01:DBTEST01
        |- Online IBM.PeerNode:DBTEST02:DBTEST02
Online IBM.Equivalency:db2mnt-db2sd_20140402163958-rg_group-equ
        |- Online IBM.PeerNode:CFTEST01:CFTEST01
        |- Online IBM.PeerNode:DBTEST01:DBTEST01
        |- Online IBM.PeerNode:DBTEST02:DBTEST02
        |- Online IBM.PeerNode:CFTEST02:CFTEST02
Online IBM.Equivalency:idle_db2sdin1_997_DBTEST01-rg_group-equ
        '- Online IBM.PeerNode:DBTEST01:DBTEST01
Online IBM.Equivalency:idle_db2sdin1_997_DBTEST02-rg_group-equ
        '- Online IBM.PeerNode:DBTEST02:DBTEST02
Online IBM.Equivalency:idle_db2sdin1_998_DBTEST01-rg_group-equ
        '- Online IBM.PeerNode:DBTEST01:DBTEST01
Online IBM.Equivalency:idle_db2sdin1_998_DBTEST02-rg_group-equ
        '- Online IBM.PeerNode:DBTEST02:DBTEST02
Online IBM.Equivalency:idle_db2sdin1_999_DBTEST01-rg_group-equ
        '- Online IBM.PeerNode:DBTEST01:DBTEST01
Online IBM.Equivalency:idle_db2sdin1_999_DBTEST02-rg_group-equ
        '- Online IBM.PeerNode:DBTEST02:DBTEST02
Online IBM.Equivalency:instancehost_db2sdin1-equ
        |- Online IBM.Application:instancehost_db2sdin1_CFTEST02:CFTEST02
        |- Online IBM.Application:instancehost_db2sdin1_CFTEST01:CFTEST01
        |- Online IBM.Application:instancehost_db2sdin1_DBTEST02:DBTEST02
        |- Online IBM.Application:instancehost_db2sdin1_DBTEST01:DBTEST01
Online IBM.Equivalency:primary_db2sdin1_900-rg_group-equ
        |- Online IBM.PeerNode:CFTEST01:CFTEST01
        '- Online IBM.PeerNode:CFTEST02:CFTEST02

这里列出了 pureScale 集群用到的所有 resource 及其所属的 resource group 和 equivalency。在 resource group 中,第一列的 Online 表示的就是 resource 的 OpState,Nominal 则表示 resource group 的期望状态。TSAMP 会根据 resource group 的 Nominal State 来调整 resource 的 OpState,并监控 OpState 的变化以进行故障恢复和转移。

下面我们依次来看每个 resource:

Resource db2_db2sdin1_0-rs,和 db2_db2sdin1_1-rs 分别代表两个 member 的 db2sysc 进程

db2sdin1 11010212 4915244 23 03:31:43 - 206:49 db2sysc 0
db2sdin1 13435008 15270096 12 03:04:13 - 150:46 db2sysc 1

我们以 db2_db2sdin1_0-rs 为例,通过 lssrc IBM.Application 和 lsrg 可以看到详细的信息:
清单 3. db2_db2sdin1_0-rs 的 lsrsrc IBM.Application 输出:

resource 36:
    Name                  = "db2_db2sdin1_0-rs"
    ResourceType          = 0
    StartCommand = "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 START"
    StopCommand   = "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 STOP"
    MonitorCommand= "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST01"}
    OpState               = 1
resource 35:
    Name                  = "db2_db2sdin1_0-rs"
    ResourceType          = 0
    StartCommand  = "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 START"
    StopCommand   = "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 STOP"
    MonitorCommand= "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST02"}
    OpState               = 2
resource 37:
    Name                  = "db2_db2sdin1_0-rs"
    ResourceType          = 1
    StartCommand  = "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 START"
    StopCommand    = "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 STOP"
    MonitorCommand= "/home/db2sdin1/sqllib/adm/db2rocm 1 DB2 db2sdin1 0 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST01","DBTEST02"}
    OpState               = 1

ResourceType=1 表明了它是一个 floating resource。这其中,resource 37 是 aggregate resource,resource 35, 36 都是 constituent resources,注意它们的 NodeNameList 是不同的。一旦创建了 floating 或 concurrent 的 resource,TSAMP 就会自动创建 aggregate resource 以及每个 node 的 constituent resources。从 OpState 上可以看出,db2_db2sdin1_0-rs 当前运行在 DBTEST01 上。其余的参数的含义如下:

StartCommand 表示启动 resource 命令是 db2rocm 1 DB2 db2sdin1 0 START
StopCommand 表示停止 resource 命令是 db2rocm 1 DB2 db2sdin1 0 STOP
MonitorCommand 表示监控 resource 命令是 db2rocm 1 DB2 db2sdin1 0 MONITOR
UserName 表示运行 resource 的用户名是 db2sdin1
ProtectionMode=0 表示这是一个 non-critical resource(1 表示 critical resource),如果这是一个 critical resource,那么 IBM.PeerNode 中的 CritRsrcProtMethod 属性将会被用来决定用何种方式来保护这个 critical resource。例如 CritRsrcProtMethod=1,发生集群分裂时,每个运行了 critical resource 的非 operational quorum node 就会被强制重启。关于 CritRsrcProtMethod 的含义,可以参考下表:

表 1. CritRsrcProtMethod 设置含义

CritRsrcProtMethod

含义

1

Hard reset and reboot.

2

Halt system.

3

Sync, hard reset and reboot.

4

Sync, Halt system.

5

None.

6

Exit and restart RSCT subsystems.

ActivePeerDomain 表示集群的名字是 db2domain_20140402163709"

NodeNameList 表示运行这个 resource 的 node 清单是{“DBTEST01”,“DBTEST02”}

清单 4. db2_db2sdin1_0-rs 的 lsrg 输出:

Member Resource 10:
    Class:Resource:Node[ManagedResource]=IBM.Application:db2_db2sdin1_0-rs
    Mandatory                            = True
    MemberOf                             = db2_db2sdin1_0-rg
    SelectFromPolicy                     = ORDERED,Failback
    Subscription                         = {}
    Instances                            = 0
    Requests                             = {}
    Ordering                             = 0
    RecoveryPolicy                       = 0
    ActivePeerDomain                     = db2domain_20140402163709
    ConfigValidity                       =  
    WinSource                            = Nominal
    Location                             = DBTEST01

MemberOf 表示这个 resource 所属的 resource group 是 db2_db2sdin1_0-rg

SelectFromPolicy=ORDERED,Failback,这里的 ORDERED 表示这个资源的启动顺序将按照 NodeNameList 所定义的{“DBTEST01”,“DBTEST02”}来确定,Failback 表示如果 DBTEST01 恢复正常了,那么 resource 会回切到 DBTEST01 上去。

因此,TSAMP 处理 db2_db2sdin1_0-rs 的规则是,第一步根据 db2_db2sdin1_0-rg 的 Nominal=Online 确定需要启动 db2_db2sdin1_0-rs;第二步根据 ResourceType=1 确定它是一个 floating resource,需要在 NodeNameList=“DBTEST01”,"DBTEST02"中选择一个 node 启动它,第三步根据 SelectFromPolicy=ORDERED 确定优先在 DBTEST01 上启动,最后根据 StartCommand 来启动这个 resource,并根据 MonitorCommand 来监控 resource 的状态,如果发现 DBTEST01 的 resource 是 offline 的,则在 DBTEST01 上尝试重启 resource,如果重启多次失败或者发现 DBTEST01 的 resource 是 failed offline 的,则 failover 到 DBTEST02 上启动 resource,一旦 DBTEST01 恢复正常,再根据 SelectFromPolicy=Failback 回切到 DBTEST01 上。

所以我们就会在 pureScale 中看到,某个 member 上的实例在故障时先是会重启,如果失败会 failover 到其他 member,一旦原 member 恢复正常,实例又会 failback 到原来的 member。

同样道理,db2_db2sdin1_1-rs 代表了 member 1 上的实例,这里不再赘述。

Resource idle_db2sdin1_997_DBTEST01-rs, idle_db2sdin1_998_DBTEST01-rs, idle_db2sdin1_999_DBTEST01-rs 分别代表 DBTEST01 上三个实例 idle 进程,用于快速启动故障转移时的 light instance。

db2sdin1 15138882 16580708   0 02:48:57      -  0:01 db2sysc (idle 997)
db2sdin1 17039476 16384086   0 03:04:16      -  0:00 db2sysc (idle 998)
db2sdin1 17694786 17891408   0 03:02:52      -  0:01 db2sysc (idle 999)

限于篇幅,下面只列出 idle_db2sdin1_997_DBTEST01-rs 的信息,998 和 999 idle 进程以及 DBTEST02 的含义都是类同的:

清单 5. idle_db2sdin1_997_DBTEST01-rs 的 lsrsrc IBM.Application 输出:

resource 47:
    Name                  = "idle_db2sdin1_997_DBTEST01-rs"
    ResourceType          = 0
    StartCommand = "/home/db2sdin1/sqllib/adm/db2rocm 1 IDLE db2sdin1 997 START"
    StopCommand   = "/home/db2sdin1/sqllib/adm/db2rocm 1 IDLE db2sdin1 997 STOP"
    MonitorCommand = "/home/db2sdin1/sqllib/adm/db2rocm 1 IDLE db2sdin1 997 MONITOR"
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST01"}
    OpState               = 1
resource 48:
    Name                  = "idle_db2sdin1_997_DBTEST01-rs"
    ResourceType          = 1
    StartCommand = "/home/db2sdin1/sqllib/adm/db2rocm 1 IDLE db2sdin1 997 START"
    StopCommand  = "/home/db2sdin1/sqllib/adm/db2rocm 1 IDLE db2sdin1 997 STOP"
    MonitorCommand = "/home/db2sdin1/sqllib/adm/db2rocm 1 IDLE db2sdin1 997 MONITOR"
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST01"}
    OpState               = 1

ResourceType 表明这是一个 floating resource,但是只在 DBTEST01 上进行了定义,因此也可以看成是一个 fixed resource。

清单 6. idle_db2sdin1_997_DBTEST01-rs 的 lsrg 输出:

Member Resource 14:
    Class:Resource:Node[ManagedResource]=
IBM.Application:idle_db2sdin1_997_DBTEST01-rs
    Mandatory                            = True
    MemberOf                             = idle_db2sdin1_997_DBTEST01-rg
    SelectFromPolicy                     = ORDERED
    Subscription                         = {}
    Instances                            = 0
    Requests                             = {}
    Ordering                             = 0
    RecoveryPolicy                       = 0
    ActivePeerDomain                     = db2domain_20140402163709
    ConfigValidity                       =  
    WinSource                            = Nominal
    Location                             = DBTEST01

idle_db2sdin1_997_DBTEST01-rs 属于 idle_db2sdin1_997_DBTEST01-rg 这个 resource group。

和 ESE 类型的 DB2 实例不同,pureScale 的 DB2 实例还有 instancehost 的概念,resource instancehost_db2sdin1_DBTEST01, instancehost_db2sdin1_DBTEST02, instancehost_db2sdin1_CFTEST01, instancehost_db2sdin1_CFTEST02 分别代表了两个 member 和两个 CF 上的 instancehost,如下是 instancehost_db2sdin1_DBTEST01 的输出,其余的类同:

清单 7. instancehost_db2sdin1_DBTEST01 的 lsrsrc IBM.Application 输出:

resource 53:
    Name                  = "instancehost_db2sdin1_DBTEST01"
    ResourceType          = 0
    StartCommand          =
"/home/db2sdin1/sqllib/adm/db2rocm 1 INSTANCEHOST db2sdin1 DBTEST01 START"
    StopCommand           =
"/home/db2sdin1/sqllib/adm/db2rocm 1 INSTANCEHOST db2sdin1 DBTEST01 STOP"
    MonitorCommand        =
"/home/db2sdin1/sqllib/adm/db2rocm 1 INSTANCEHOST db2sdin1 DBTEST01 MONITOR"
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST01"}
    OpState               = 1

这是一个 fixed resource,只固定运行在 DBTEST01 上,并且从清单 2 可以看到,它属于 equivalency instancehost_db2sdin1-equ,正如我们之前所说的,equivalency 只能由 fixed resource 组成。使用 lsequ 可以找到它的信息:

清单 8. instancehost_db2sdin1_DBTEST01 的 lsequ 输出:

Equivalency 19:
    Name                                = instancehost_db2sdin1-equ
    MemberClass                         = IBM.Application
    Resource:Node[Membership]           = {instancehost_db2sdin1_CFTEST02:CFTEST02,
instancehost_db2sdin1_CFTEST01:CFTEST01,instancehost_db2sdin1_DBTEST02:DBTEST02,
instancehost_db2sdin1_DBTEST01:DBTEST01}
    SelectString                        = ""
    SelectFromPolicy                    = ANY,NoControl
    MinimumNecessary                    = 1
    Subscription                        = {}
    Color                               = 0
    ActivePeerDomain                    = db2domain_20140402163709
    Resource:Node[ValidSelectResources] = {instancehost_db2sdin1_CFTEST02:CFTEST02,instancehost_db2sdin1_CFTEST01:CFTEST01,
instancehost_db2sdin1_DBTEST02:DBTEST02,instancehost_db2sdin1_DBTEST01:DBTEST01}
    Resource:Node[InvalidResources]     = {}
    ConfigValidity                      =  
    AutomationDetails[CompoundState]    = Automation

接下来看一下 pureScale 中的 CF resource,有三种,一种是 cacontrol_db2sdin1_128_CFTEST01 和 cacontrol_db2sdin1_129_CFTEST02,由 root 用户运行,两台 CF 上都会运行各自的 cacontrol,用于监控和管理 CF 进程:

root 13041676        1   0 03:05:15      -  0:00 ca-wdog 128 [db2sdin1]
root  9830506        1   0 03:32:39      -  0:00 ca-wdog 129 [db2sdin1]

清单 9. cacontrol_db2sdin1_128_CFTEST01 和 cacontrol_db2sdin1_129_CFTEST02 的 lsrsrc IBM.Application 输出:

resource 31:
    Name                  = "cacontrol_db2sdin1_128_CFTEST01"
    ResourceType          = 0
    StartCommand          =
"/home/db2sdin1/sqllib/adm/db2rocm 1 CFCONTROL db2sdin1 128 CFTEST01 START"
    StopCommand           =
"/home/db2sdin1/sqllib/adm/db2rocm 1 CFCONTROL db2sdin1 128 CFTEST01 STOP"
    MonitorCommand        =
"/home/db2sdin1/sqllib/adm/db2rocm 1 CFCONTROL db2sdin1 128 CFTEST01 MONITOR"
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01"}
    OpState               = 1
resource 28:
    Name                  = "cacontrol_db2sdin1_129_CFTEST02"
    ResourceType          = 0
    StartCommand          =
"/home/db2sdin1/sqllib/adm/db2rocm 1 CFCONTROL db2sdin1 129 CFTEST02 START"
    StopCommand           =
"/home/db2sdin1/sqllib/adm/db2rocm 1 CFCONTROL db2sdin1 129 CFTEST02 STOP"
    MonitorCommand        =
"/home/db2sdin1/sqllib/adm/db2rocm 1 CFCONTROL db2sdin1 129 CFTEST02 MONITOR"
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST02"}
    OpState               = 1

它们都是 fixed resource,运行在各自的 node 上。从清单 2 也能看出,它属于 equivalency cacontrol_db2sdin1_equ,可以用 lsequ 进行查看:

清单 10. cacontrol_db2sdin1_128_CFTEST01 和 cacontrol_db2sdin1_129_CFTEST02 的 lsequ 输出:

Equivalency 8:
    Name                                = cacontrol_db2sdin1_equ
    MemberClass                         = IBM.Application
    Resource:Node[Membership]           = {cacontrol_db2sdin1_128_CFTEST01:CFTEST01,cacontrol_db2sdin1_129_CFTEST02:CFTEST02}
    SelectString                        = ""
    SelectFromPolicy                    = ANY,NoControl
    MinimumNecessary                    = 1
    Subscription                        = {}
    Color                               = 0
    ActivePeerDomain                    = db2domain_20140402163709
    Resource:Node[ValidSelectResources] = {cacontrol_db2sdin1_128_CFTEST01:CFTEST01,cacontrol_db2sdin1_129_CFTEST02:CFTEST02}
    Resource:Node[InvalidResources]     = {}
    ConfigValidity                      =  
    AutomationDetails[CompoundState]    = Automation

第二种 CF resource 是 ca_db2sdin1_0-rs,由实例用户运行,是真正的 CF 工作进程,在两台 CF 上都必须运行:

db2sdin1 14745662 13041676   0 03:05:15      -  1:32
ca-mgmnt-lwd -i128 -p56000 -k8e6937a -d/home/db2sdin1/sqllib/db2dump/DIAG0128
-e/home/db2sdin1/sqllib/cf/ca-server –f
db2sdin1 12189742 14745662 620 03:05:15      - 2793:58
/home/db2sdin1/sqllib/cf/ca-server -i 128 -p 56000 -k 1048580 -s 0 –f
db2sdin1 15073344  9830506   0 03:32:40      -  1:27
ca-mgmnt-lwd -i129 -p56000 -ke69a437a -d/home/db2sdin1/sqllib/db2dump/DIAG0129
-e/home/db2sdin1/sqllib/cf/ca-server –f
db2sdin1 11403304 15073344 488 03:32:40      - 2694:59
/home/db2sdin1/sqllib/cf/ca-server -i 129 -p 56000 -k 1048580 -s 0 -f

清单 11. ca_db2sdin1_0-rs 的 lsrsrc IBM.Application 输出:

resource 29:
    Name                  = "ca_db2sdin1_0-rs"
    ResourceType          = 0
    StartCommand     = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 128 START"
    StopCommand      = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 128 STOP"
    MonitorCommand = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 128 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01"}
    OpState               = 1
resource 27:
    Name                  = "ca_db2sdin1_0-rs"
    ResourceType          = 0
    StartComman      = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 129 START"
    StopCommand      = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 129 STOP"
    MonitorCommand = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 129 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST02"}
    OpState               = 1
resource 30:
    Name                  = "ca_db2sdin1_0-rs"
    ResourceType          = 2
    StartCommand     = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 128 START"
    StopCommand      = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 128 STOP"
    MonitorCommand = "/home/db2sdin1/sqllib/adm/db2rocme 1 CF db2sdin1 128 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01","CFTEST02"}
    OpState               = 1

ResourceType=2 表明了这是一个 concurrent resource,在 CFTEST01 和 CFTEST02 同时运行。清单 2 告诉我们它属于 ca_db2sdin1_0-rg 这个 resource group。

清单 12. ca_db2sdin1_0-rs 的 lsrg 输出:

Member Resource 8:
    Class:Resource:Node[ManagedResource] = IBM.Application:ca_db2sdin1_0-rs
    Mandatory                            = True
    MemberOf                             = ca_db2sdin1_0-rg
    SelectFromPolicy                     = ORDERED
    Subscription                         = {}
    Instances                            = 0
    Requests                             = {}
    Ordering                             = 0
    RecoveryPolicy                       = 0
    ActivePeerDomain                     = db2domain_20140402163709
    ConfigValidity                       =

第三种 CF resource 是 primary_db2sdin1_900-rs,只运行在 primary CF 上。

清单 13. primary_db2sdin1_900-rs 的 lsrsrc IBM.Application 输出:

resource 24:
    Name                  = "primary_db2sdin1_900-rs"
    ResourceType          = 0
    StartCommand  = "/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 START"
    StopCommand    = "/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 STOP"
    MonitorCommand="/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST02"}
    OpState               = 2
resource 25:
    Name                  = "primary_db2sdin1_900-rs"
    ResourceType          = 0
    StartCommand  = "/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 START"
    StopCommand    = "/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 STOP"
    MonitorCommand="/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01"}
    OpState               = 1
resource 26:
    Name                  = "primary_db2sdin1_900-rs"
    ResourceType          = 1
    StartCommand  = "/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 START"
    StopCommand    = "/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 STOP"
    MonitorCommand="/home/db2sdin1/sqllib/adm/db2rocme 1 PRIMARY db2sdin1 900 MONITOR"
    UserName              = "db2sdin1"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01","CFTEST02"}
    OpState               = 1

因为只在 primary CF 上运行,所以是 floating resource,ResourceType=1 也正说明了这一点。它属于 primary_db2sdin1_900-rg 这个 resource group。

清单 14. primary_db2sdin1_900-rs 的 lsrg 输出:

Member Resource 7:
    Class:Resource:Node[ManagedResource] = IBM.Application:primary_db2sdin1_900-rs
    Mandatory                            = True
    MemberOf                             = primary_db2sdin1_900-rg
    SelectFromPolicy                     = ORDERED
    Subscription                         = {}
    Instances                            = 0
    Requests                             = {}
    Ordering                             = 0
    RecoveryPolicy                       = 0
    ActivePeerDomain                     = db2domain_20140402163709
    ConfigValidity                       =  
    WinSource                            = Nominal
    Location                             = CFTEST02

SelectFromPolicy=ORDERED,表明会按照 NodeNameList 的顺序启动 primary CF,但和 db2_db2sdin1_0-rs 不同,并不会 failback。所以在 pureScale 中,primary CF 发生故障,则 peer CF 进行接管,但是原 primary CF 恢复后,并不会发生回切,而是成为 peer CF。

接下来我们看下 GPFS 文件系统的 resource,db2mnt-db2sd_20140402163958-rs,它代表实例文件系统的 resource,同样的,db2mnt-db2data-rs 的输出读者可以自行查看:

清单 15. db2mnt-db2sd_20140402163958-rs 的 lsrsrc IBM.Application 输出:

resource 21:
    Name                  = "db2mnt-db2sd_20140402163958-rs"
    ResourceType          = 0
    StartCommand          =
"/usr/sbin/rsct/sapolicies/db2/mountV105_start.ksh /db2sd_20140402163958"
    StopCommand           =
"/usr/sbin/rsct/sapolicies/db2/mountV105_stop.ksh /db2sd_20140402163958"
    MonitorCommand        =
"/usr/sbin/rsct/sapolicies/db2/mountV105_monitor.ksh /db2sd_20140402163958"
    MonitorCommandPeriod  = 10
    MonitorCommandTimeout = 120
    StartCommandTimeout   = 900
    StopCommandTimeout    = 600
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST01"}
    OpState               = 1
resource 22:
    Name                  = "db2mnt-db2sd_20140402163958-rs"
    ResourceType          = 0
    StartCommand          =
"/usr/sbin/rsct/sapolicies/db2/mountV105_start.ksh /db2sd_20140402163958"
    StopCommand           =
"/usr/sbin/rsct/sapolicies/db2/mountV105_stop.ksh /db2sd_20140402163958"
    MonitorCommand        =
"/usr/sbin/rsct/sapolicies/db2/mountV105_monitor.ksh /db2sd_20140402163958"
    MonitorCommandPeriod  = 10
    MonitorCommandTimeout = 120
    StartCommandTimeout   = 900
    StopCommandTimeout    = 600
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01"}
    OpState               = 1
resource 20:
    Name                  = "db2mnt-db2sd_20140402163958-rs"
    ResourceType          = 0
    StartCommand          =
"/usr/sbin/rsct/sapolicies/db2/mountV105_start.ksh /db2sd_20140402163958"
    StopCommand           =
"/usr/sbin/rsct/sapolicies/db2/mountV105_stop.ksh /db2sd_20140402163958"
    MonitorCommand        =
"/usr/sbin/rsct/sapolicies/db2/mountV105_monitor.ksh /db2sd_20140402163958"
    MonitorCommandPeriod  = 10
    MonitorCommandTimeout = 120
    StartCommandTimeout   = 900
    StopCommandTimeout    = 600
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"DBTEST02"}
    OpState               = 1
resource 19:
    Name                  = "db2mnt-db2sd_20140402163958-rs"
    ResourceType          = 0
    StartCommand          =
"/usr/sbin/rsct/sapolicies/db2/mountV105_start.ksh /db2sd_20140402163958"
    StopCommand           =
"/usr/sbin/rsct/sapolicies/db2/mountV105_stop.ksh /db2sd_20140402163958"
    MonitorCommand        =
"/usr/sbin/rsct/sapolicies/db2/mountV105_monitor.ksh /db2sd_20140402163958"
    MonitorCommandPeriod  = 10
    MonitorCommandTimeout = 120
    StartCommandTimeout   = 900
    StopCommandTimeout    = 600
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST02"}
    OpState               = 1
resource 23:
    Name                  = "db2mnt-db2sd_20140402163958-rs"
    ResourceType          = 2
    StartCommand          =
"/usr/sbin/rsct/sapolicies/db2/mountV105_start.ksh /db2sd_20140402163958"
    StopCommand           =
"/usr/sbin/rsct/sapolicies/db2/mountV105_stop.ksh /db2sd_20140402163958"
    MonitorCommand        =
"/usr/sbin/rsct/sapolicies/db2/mountV105_monitor.ksh /db2sd_20140402163958"
    MonitorCommandPeriod  = 10
    MonitorCommandTimeout = 120
    StartCommandTimeout   = 900
    StopCommandTimeout    = 600
    UserName              = "root"
    ProtectionMode        = 0
    ActivePeerDomain      = "db2domain_20140402163709"
    NodeNameList          = {"CFTEST01","DBTEST01","DBTEST02","CFTEST02"}
    OpState               = 1

正如我们所想象的那样,因为 GPFS 文件系统在每个 node 都会被 mount,同时运行在所有的 node 上,所以这是一个 concurrent resource,ResourceType=2 说明了这一点。并且它属于 db2mnt-db2sd_20140402163958-rg 这个 resource group。

清单 16. db2mnt-db2sd_20140402163958-rs 的 lsrg 输出:

Member Resource 6:
    Class:Resource:Node[ManagedResource]=IBM.Application:db2mnt-db2sd_20140402163958-rs
    Mandatory                            = True
    MemberOf                             = db2mnt-db2sd_20140402163958-rg
    SelectFromPolicy                     = ORDERED
    Subscription                         = {}
    Instances                            = 0
    Requests                             = {}
    Ordering                             = 0
    RecoveryPolicy                       = 0
    ActivePeerDomain                     = db2domain_20140402163709
    ConfigValidity                       =

最后是集群中的所有 node 构成了 IBM.PeerNode 类 resource,以及所有的 public 网卡构成了 IBM.NetworkInterface 类的 resource。

清单 17. lsrsrc -A b IBM.PeerNode 输出:

-----> lsrsrc -Ab IBM.PeerNode <-----
Resource Persistent and Dynamic Attributes for IBM.PeerNode
resource 2:
    Name               = "CFTEST02"
    NodeList           = {4}
    RSCTVersion        = "3.1.4.4"
    ClassVersions      = {}
    CritRsrcProtMethod = 0
    IsQuorumNode       = 1
    IsPreferredGSGL    = 1
    NodeUUID           = "00000000-0000-0000-0000-000000000000"
    ActivePeerDomain   = "db2domain_20140402163709"
    NodeNameList       = {"CFTEST02"}
    OpState            = 1
    ConfigChanged      = 0
    CritRsrcActive     = 0
    OpUsabilityState   = 1
resource 3:
    Name               = "DBTEST02"
    NodeList           = {3}
    RSCTVersion        = "3.1.4.4"
    ClassVersions      = {}
    CritRsrcProtMethod = 0
    IsQuorumNode       = 1
    IsPreferredGSGL    = 1
    NodeUUID           = "00000000-0000-0000-0000-000000000000"
    ActivePeerDomain   = "db2domain_20140402163709"
    NodeNameList       = {"DBTEST02"}
    OpState            = 1
    ConfigChanged      = 0
    CritRsrcActive     = 0
    OpUsabilityState   = 1
resource 4:
    Name               = "CFTEST01"
    NodeList           = {2}
    RSCTVersion        = "3.1.4.4"
    ClassVersions      = {}
    CritRsrcProtMethod = 0
    IsQuorumNode       = 1
    IsPreferredGSGL    = 1
    NodeUUID           = "00000000-0000-0000-0000-000000000000"
    ActivePeerDomain   = "db2domain_20140402163709"
    NodeNameList       = {"CFTEST01"}
    OpState            = 1
    ConfigChanged      = 0
    CritRsrcActive     = 0
    OpUsabilityState   = 1
resource 5:
    Name               = "DBTEST01"
    NodeList           = {1}
    RSCTVersion        = "3.1.4.4"
    ClassVersions      = {}
    CritRsrcProtMethod = 0
    IsQuorumNode       = 1
    IsPreferredGSGL    = 1
    NodeUUID           = "00000000-0000-0000-0000-000000000000"
    ActivePeerDomain   = "db2domain_20140402163709"
    NodeNameList       = {"DBTEST01"}
    OpState            = 1
    ConfigChanged      = 0
    CritRsrcActive     = 0
    OpUsabilityState   = 1

清单 18. lsrsrc -A b IBM.NetworkInterface 输出(部分):

resource 23:
    Name             = "en0"
    DeviceName       = "ent0"
    IPAddress        = "10.24.8.90"
    SubnetMask       = "255.255.255.0"
    Subnet           = "10.24.8.0"
    CommGroup        = "CG1"
    HeartbeatActive  = 1
    Aliases          = {}
    DeviceSubType    = 6
    LogicalID        = 0
    NetworkID        = 0
    NetworkID64      = 0
    PortID           = 0
    HardwareAddress  = "34:40:b5:f4:7d:e9"
    DevicePathName   = ""
    IPVersion        = 4
    Role             = 0
    ActivePeerDomain = "db2domain_20140402163709"
    NodeNameList     = {"DBTEST01"}
    OpState          = 1
    ConfigChanged    = 0
resource 15:
    Name             = "en0"
    DeviceName       = "ent0"
    IPAddress        = "10.24.8.94"
    SubnetMask       = "255.255.255.0"
    Subnet           = "10.24.8.0"
    CommGroup        = "CG1"
    HeartbeatActive  = 1
    Aliases          = {}
    DeviceSubType    = 6
    LogicalID        = 0
    NetworkID        = 0
    NetworkID64      = 0
    PortID           = 0
    HardwareAddress  = "34:40:b5:f4:53:ed"
    DevicePathName   = ""
    IPVersion        = 4
    Role             = 0
    ActivePeerDomain = "db2domain_20140402163709"
    NodeNameList     = {"DBTEST02"}
    OpState          = 1
    ConfigChanged    = 0

pureScale 中的 Managed Relationship

前面介绍了 pureScale 中所有的 resource 及其所属 resource group 或 equivalency。接下来介绍 pureScale 中的 managed relationship,managed relationship 刻画了 pureScale 中所有 resource 之间的联系。接下来我们按照四个大类来分析这些 managed relationship。

第一类是 db2_db2sdin1_0-rs 作为 source resource 的 managed relationship,db2_db2sdin1_1-rs 也是相仿的。

清单 19. db2_db2sdin1_0-rs 相关的 lsrel 输出

Managed Relationship 1:
    Class:Resource:Node[Source] = IBM.Application:db2_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Equivalency:db2_public_network_db2sdin1_0}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
db2_db2sdin1_0-rs_DependsOn_db2_public_network_db2sdin1_0-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =  
 
Managed Relationship 16:
    Class:Resource:Node[Source] = IBM.Application:db2_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Application:db2mnt-db2data-rs}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        = db2_db2sdin1_0-rs_DependsOn_db2mnt-db2data-rs-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =  
 
Managed Relationship 29:
    Class:Resource:Node[Source] = IBM.Application:db2_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Application:db2mnt-db2sd_20140402163958-rs}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
db2_db2sdin1_0-rs_DependsOn_db2mnt-db2sd_20140402163958-rs-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =  
 
Managed Relationship 17:
    Class:Resource:Node[Source] = IBM.Application:db2_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Equivalency:instancehost_db2sdin1-equ}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
db2_db2sdin1_0-rs_DependsOn_instancehost_db2sdin1-equ-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =

Relationship= DependsOn 表示 source resource 是依赖于 target source 的,即 source resource 启动必须先有 target source 的启动。

第一个是 managed relationship 是 db2_db2sdin1_0-rs_DependsOn_db2_public_network_db2sdin1_0-rel,它的 target resource 是 db2_public_network_db2sdin1_0,用 lsequ 查看 db2_public_network_db2sdin1_0 的具体信息:

Equivalency 12:
    Name                                = db2_public_network_db2sdin1_0
    MemberClass                         = IBM.NetworkInterface
    Resource:Node[Membership]           = {en0:DBTEST01,en0:DBTEST02}
    SelectString                        = ""
    SelectFromPolicy                    = ANY
    MinimumNecessary                    = 1
    Subscription                        = {}
    Color                               = 0
    ActivePeerDomain                    = db2domain_20140402163709
    Resource:Node[ValidSelectResources] = {en0:DBTEST01,en0:DBTEST02}
    Resource:Node[InvalidResources]     = {}
    ConfigValidity                      =  
    AutomationDetails[CompoundState]    = Automation

这是一个所有 member 网卡的 equivalency。因此 db2_db2sdin1_0-rs_DependsOn_db2_public_network_db2sdin1_0-rel 的含义是 db2_db2sdin1_0-rs 必须依赖于 member 的网卡,如果某个 node 的网卡故障,那么这个 node 就无法运行 db2_db2sdin1_0-rs。

类似的,第二个 managed relationship 是 db2_db2sdin1_0-rs_DependsOn_db2mnt-db2data-rs-rel,含义是 db2_db2sdin1_0-rs 必须依赖于 member 的 db2mnt-db2data-rs 文件系统,如果某个 node GPFS 文件系统不能 mount,那么这个 node 就无法运行 db2_db2sdin1_0-rs。

第三个 managed relationship 的含义是 db2_db2sdin1_0-rs 必须依赖于 db2mnt-db2sd_20140402163958-rs 文件系统。

第四个 managed relationship 的含义是 db2_db2sdin1_0-rs 必须依赖于 instancehost_db2sdin1-equ。

综合上述四个,就可以解释,在 pureScale 中,某个 member 如果网卡不可用、GPFS 文件系统不能 mount 或者做了 db2stop instance on host,那么这个 member 的 db2sysc 就不会启动,而会被转移到其他 member。

第二类是 idle_db2sdin1_997_DBTEST01-rs 作为 source resource 的 managed relationship,idle_db2sdin1_998_DBTEST01-rs,idle_db2sdin1_999_DBTEST01-rs,idle_db2sdin1_997_DBTEST02-rs,idle_db2sdin1_998_DBTEST02-rs,idle_db2sdin1_999_DBTEST02-rs 也是相仿的。

清单 20. idle_db2sdin1_997_DBTEST01-rs 相关的 lsrel 输出

Managed Relationship 9:
    Class:Resource:Node[Source] = IBM.Application:idle_db2sdin1_997_DBTEST01-rs
    Class:Resource:Node[Target] = {IBM.Application:db2mnt-db2sd_20140402163958-rs}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
idle_db2sdin1_997_DBTEST01-rs_DependsOn_db2mnt-db2sd_20140402163958-rs-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =  
 
Managed Relationship 27:
    Class:Resource:Node[Source] = IBM.Application:idle_db2sdin1_997_DBTEST01-rs
    Class:Resource:Node[Target] = {IBM.Equivalency:instancehost_db2sdin1-equ}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
idle_db2sdin1_997_DBTEST01-rs_DependsOn_instancehost_db2sdin1-equ-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =

不难看出,idle_db2sdin1_997_DBTEST01-rs 能否在某个 member 上运行,依赖于这个 member 的 db2mnt-db2sd_20140402163958-rs 和 instancehost_db2sdin1-equ。也就是说,在 pureScalie 里,如果 GPFS 文件系统无法 mount,或者做了 db2stop instance on host,那么上面的 idle resource 就无法启动。

第三类是 ca_db2sdin1_0-rs 作为 source resource 的 managed relationship,

清单 21. ca_db2sdin1_0-rs 相关的 lsrel 输出

Managed Relationship 18:
    Class:Resource:Node[Source] = IBM.Application:ca_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Application:db2mnt-db2sd_20140402163958-rs}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                   =
ca_db2sdin1_0-rs_DependsOn_db2mnt-db2sd_20140402163958-rs-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =  
 
Managed Relationship 19:
    Class:Resource:Node[Source] = IBM.Application:ca_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Equivalency:cacontrol_db2sdin1_equ}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
ca_db2sdin1_0-rs_DependsOn_cacontrol_db2sdin1_equ-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =  
 
Managed Relationship 31:
    Class:Resource:Node[Source] = IBM.Application:ca_db2sdin1_0-rs
    Class:Resource:Node[Target] = {IBM.Equivalency:instancehost_db2sdin1-equ}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        =
ca_db2sdin1_0-rs_DependsOn_instancehost_db2sdin1-equ-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =

同样的道理,ca_db2sdin1_0-rs 的运行依赖于 db2mnt-db2sd_20140402163958-rs、cacontrol_db2sdin1_equ 和 instancehost_db2sdin1-equ。所以,pureScale 中,要在 primary 和 peer CF 上运行 CF 进程,必须保证 GPFS 文件系统是 Online,以及 db2start instance on host,以及 cacontrol 的运行。

需要指出的是,在基于 AIX RoCE 的 GDPC 的配置中,ca_db2sdin1_0-rs 的运行还会依赖于 CF 的 public 网卡,在普通的 pureScal 中是不需要依赖的。这是因为,普通的 pureScale 如果某个 node 的网卡不可用,那么它的 GPFS 就会 offline,所以 ca_db2sdin1_0-rs 也会跟着 offline;但是在基于 AIX RoCE 的 GDPC 中,我们会把 private network 作为 GPFS 的 subnet,此时 public network 如果不可用,GPFS 是不会 offline 的,所以我们需要这个 managed relationship 来确保 ca_db2sdin1_0-rs 也 offline。

最后是第四类,是 primary_db2sdin1_900-rs 作为 source resource 的 managed relationship,

清单 22. primary_db2sdin1_900-rs 相关的 lsrel 输出

Managed Relationship 24:
    Class:Resource:Node[Source] = IBM.Application:primary_db2sdin1_900-rs
    Class:Resource:Node[Target] = {IBM.Application:ca_db2sdin1_0-rs}
    Relationship                = DependsOn
    Conditional                 = NoCondition
    Name                        = primary_db2sdin1_900-rs_DependsOn_ca_db2sdin1_0-rs-rel
    ActivePeerDomain            = db2domain_20140402163709
    ConfigValidity              =

这表明 primary_db2sdin1_900-rs 的运行必须依赖于 ca_db2sdin1_0-rs 的运行,这是显而易见的。

pureScale 中的 quorum

在创建普通的 pureScale 实例时,-tbdev 选项可以指定集群的磁盘 tiebreaker(注意不是 GPFS 集群的 tiebreaker disk),在 GDPC 环境中,则使用 majority 的 tiebreaker,在 TSAMP 中,我们可以通过 lsrsrc –A b IBM.TieBreaker 和 lsrsrc –c IBM.PeerNode 来进行查看:

清单 23. 普通 pureScale 实例的 lsrsrc –A b IBM.TieBreaker 和 lsrsrc –c IBM.PeerNode

-----> lsrsrc -Ab IBM.TieBreaker <-----
Resource Persistent and Dynamic Attributes for IBM.TieBreaker
resource 1:
    Name                = "Success"
    Type                = "Success"
    DeviceInfo          = ""
    ReprobeData         = ""
    ReleaseRetryPeriod  = 0
    HeartbeatPeriod     = 0
    PreReserveWaitTime  = 0
    PostReserveWaitTime = 0
    NodeInfo            = {}
    ActivePeerDomain    = "db2domain_20140402163709"
    ConfigChanged       = 0
resource 2:
    Name                = "Fail"
    Type                = "Fail"
    DeviceInfo          = ""
    ReprobeData         = ""
    ReleaseRetryPeriod  = 0
    HeartbeatPeriod     = 0
    PreReserveWaitTime  = 0
    PostReserveWaitTime = 0
    NodeInfo            = {}
    ActivePeerDomain    = "db2domain_20140402163709"
    ConfigChanged       = 0
resource 3:
    Name                = "Operator"
    Type                = "Operator"
    DeviceInfo          = ""
    ReprobeData         = ""
    ReleaseRetryPeriod  = 0
    HeartbeatPeriod     = 0
    PreReserveWaitTime  = 0
    PostReserveWaitTime = 0
    NodeInfo            = {}
    ActivePeerDomain    = "db2domain_20140402163709"
    ConfigChanged       = 0
resource 4:
    Name                = "db2_Quorum_Disk:16_37_30"
    Type                = "DISK"
    DeviceInfo          = "PVID=00c579b721485220"
    ReprobeData         = ""
    ReleaseRetryPeriod  = 0
    HeartbeatPeriod     = 5
    PreReserveWaitTime  = 0
    PostReserveWaitTime = 0
    NodeInfo            = {}
    ActivePeerDomain    = "db2domain_20140402163709"
    ConfigChanged       = 0
 
  -----> lsrsrc -c -Ab IBM.PeerNode <-----
Resource Class Persistent and Dynamic Attributes for IBM.PeerNode
resource 1:
    CommittedRSCTVersion       = ""
    ActiveVersionChanging      = 0
    OpQuorumOverride           = 0
    CritRsrcProtMethod         = 1
    OpQuorumTieBreaker         = "db2_Quorum_Disk:16_37_30"
    QuorumType                 = 0
    QuorumGroupName            = ""
    Fanout                     = 32
    OpFenceGroup               = "gpfs_grp"
    NodeCleanupCommand         = "/usr/sbin/rsct/sapolicies/db2/hostCleanupV105.ksh"
    NodeCleanupCriteria        = "Enable,RetryCount=10,RetryInterval=30000,Parms= 1 DB2 0 CLEANUP_ALL"
    QuorumLessStartupTimeout   = 120
    CriticalMode               = 1
    NotifyQuorumChangedCommand = ""
    ConfigValidity              =

OpQuorumTieBreaker=“db2_Quorum_Disk:16_37_30”
Name=“db2_Quorum_Disk:16_37_30”
Type=“DISK”
表明使用的是 disk tie breaker,

DeviceInfo="PVID=00c579b721485220"表明了 tie breaker 磁盘的 PVID

结束语

至此,我们通过 resource,resource group,equivalency,managed relationship 以及 quorum 介绍了 pureScale 是如何实现自动化故障恢复和转移的,了解了这些,自己动手做一个简单的 TSAMP 集群也不是一个难事。当然 TSAMP 的配置非常丰富,更多的功能也等待着我们去使用。

参考资源 (resources)

  • 参考 developerWorks 中国 首页,查看 IBM 软件和开放技术的最新信息。
  • 参考IBM DB2 10.5 for Linux, Unix and Windows 知识中心,学习更多 DB2 的知识。
  • 参考Tivoli System Automation for Multiplatforms Version 3.2.2 Administrator’s and User’s Guide,学习更多 TSAMP 的知识。