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

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 attributeCondition attribute
Start or Stop dependenciesLocation dependenciesIfOnline
StartAfterCollocatedIfNotOnline
StopAfterAntiCollocatedIfOffline
DependsOnAffinityIfNotOffline
DependsOnAnyAntiAffinityIfPossible
ForcedDownByIsStartableNone

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支持的操作系统描述
OperatorAIX, Linux, Windows,Solaris由管理员决定是否 operational quorum
FailAIX, Linux, Windows,Solaris所有子集群都没有 operational quorum
SCSILinux使用 SCSI 共享磁盘进行 tie breaker
DISKAIX使用类 SCSI 的物理磁盘共享磁盘进行 tie breaker
EXECAIX, 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含义
1Hard reset and reboot.​
2Halt system.​
3Sync, hard reset and reboot.​
4Sync, Halt system.​
5None.​
6Exit 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 的知识。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱峥嵘(朱髯)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值