理解 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 的知识。