1.4.5 CSS租约
获得租约的机制是通过获得该节点的节点号。租约表示一个节点拥有由租约期限定义的周期关联的节点号。一个租借期限在GPNP参数文件里硬编码为一个星期。一个节点拥有从上次续租的时间租约的租期。租赁期是每次磁盘心跳中更新。因此,租赁期满被定义
如下 - lease expiry time = last DHB time + lease duration(租约到期时间=最后一次DHB时间+租约期限)。
有两种类型的租约
- 固定租约
节点使用硬编码的静态节点号。固定租约是指涉及到使用静态节点号旧版本集群的升级方案中使用。
- 不固定租约
一个节点动态获取节点号使用租约获得算法。租约获得算法旨在解决其试图在同一时间获得相同的插槽节点之间的冲突。
对于一个成功的租约操作会记录在Grid_home/log//alert.log,
[cssd(8433)]CRS-1707:Lease acquisition for node staiv10 number 5 completed
对于租约失败的,会有一些信息记录在hostname.log和ocssd.log。在当前版本中调整租约的租赁期。
1.4.6 解决脑裂
下面的章节将描述主要的组件和技术用来解决脑裂。
Heartbeats心跳
CSS的使用集群成员的两个主要的心跳机制,网络心跳(NHB)和磁盘心跳(DHB)。心跳机制是故意冗余的,它们用于不同的目的。在NHB用于检测群集连接丢失的,而DHB主要用于脑裂解决。每个群集节点必须参加心跳协议为了被认为是健康的集群成员。
Network Heartbeat (NHB)
NHB是在集群安装过程中配置为私有互连专用网络接口。CSS每秒钟从一个节点发送NHB到集群中的所有其他节点,并从远程节点每秒接收一个NHB。该NHB也发送给cssdmonitor和cssdagent。
NHB包含从本地节点时间戳信息,用于远程节点找出NHB是何时发送的。这表明一个节点可以参与集群的活动,例如组成员的变化,消息发送等。如果NHB丢失秒(在Linux11.2数据库中30秒),集群成员资格更改(群集重新配置)是必需的。如果网络连接在小于秒恢复连接到该网络,那么就不一定是致命的。
要调试NHB问题,增加OCSSD日志级别为3对于看每个心跳消息有时是有帮助的。在每个节点上的root用户运行CRSCTL设置日志命令:
# crsctl set log css ocssd:3
监测misstime最大值,看看是否misscount正在增加,这将定位网络问题。
# tail -f ocssd.log | grep -i misstime
2009-10-22 06:06:07.275: [ ocssd][2840566672]clssnmPollingThread: node 2,
stnsp006, ninfmisstime 270, misstime 270, skgxnbit 4, vcwmisstime 0, syncstage 0
2009-10-22 06:06:08.220: [ ocssd][2830076816]clssnmHBInfo: css timestmp
1256205968 220 slgtime 246596654 DTO 28030 (index=1) biggest misstime 220 NTO
28280
2009-10-22 06:06:08.277: [ ocssd][2840566672]clssnmPollingThread: node 2,
stnsp006, ninfmisstime 280, misstime 280, skgxnbit 4, vcwmisstime 0, syncstage 0
2009-10-22 06:06:09.223: [ ocssd][2830076816]clssnmHBInfo: css timestmp
1256205969 223 slgtime 246597654 DTO 28030 (index=1) biggest misstime 1230 NTO
28290
2009-10-22 06:06:09.279: [ ocssd][2840566672]clssnmPollingThread: node 2,
stnsp006, ninfmisstime 270, misstime 270, skgxnbit 4, vcwmisstime 0, syncstage 0
2009-10-22 06:06:10.226: [ ocssd][2830076816]clssnmHBInfo: css timestmp
1256205970 226 slgtime 246598654 DTO 28030 (index=1) biggest misstime 2785 NTO
28290
要显示当前misscount设置的值,使用命令crsctl get css misscount。我们不支持misscount设置默认值以外的值。
[grid@rac2 ~]$ crsctl get css misscount CRS-4678: Successful get misscount 30 for Cluster Synchronization Services. |
Disk Heartbeat (DHB)
除了NHB,我们需要使用DHB来解决脑裂。它包含UNIX本地时间的时间戳。
DHB明确的机制,决定有关节点是否还活着。当DHB心跳丢失时间过长,则该节点被假定为死亡。当连接到磁盘丢失时间'过长',盘会考虑脱机。
关于“太长”的定义取决于对DHB下列情形。首先,长期磁盘I / O超时(LIOT),其中有一个默认的200秒设定。如果我们不能在时间内完成一个表决文件内的I / O,我们将此表决文件脱机。其次,短期磁盘I / O超时(SIOT),其中CSS集群重新配置过程中使用。SIOT是有关misscount(misscount(30) - reboottime(3)=27秒)。默认重启时间为3秒。要显示CSS 的disktimeout参数的值,使用命令crsctl get css disktimeout。
[grid@rac2 ~]$ crsctl get css disktimeout CRS-4678: Successful get disktimeout 200 for Cluster Synchronization Services. |
网络分离检测
最后NHB的时间戳和最近DHB的时间戳进行比较,以确定一个节点是否仍然活着。
当最近DHB和最后NHB的时间戳之间的差是大于SIOT (misscount – reboottime),一个节点被认为仍然活跃。
当时间戳之间的差小于重启时间,节点被认为是还活着。
如果最后DHB读取的时间大于SIOT,该节点被认为是死的。
如果时间戳之间的差比SIOT小比重启时间大,节点的状态不明确,我们必须等待做出决定,直到我们陷入上述三个类别之一。
当网络发生故障,并且仍有活动的节点无法和其他节点通信,网络被认为是分裂。为了保持分裂发生时数据完整性,节点中的一个必须失败,尚存节点应该是最优子群集。节点通过三种可能的方式逐出:
- 通过网络发送驱逐消息。在大多数情况下,这将失败,因为现有的网络故障。
- 通过表决的文件
- 通过IPMI,如果支持和配置
在我们用下面的例子与节点A,B,C和D集群更为详细的解释:
Nodes A and B receive each other's heartbeats
Nodes C and D receive each other's heartbeats
Nodes A and B cannot see heartbeats of C or D
Nodes C and D cannot see heartbeats of A or B
Nodes A and B are one cohort, C and D are another cohort
Split begins when 2 cohorts stop receiving NHB’s from each other
CSS假设是一个对称的失败,也就是,A+B组停止接收C+D组发送的NHB,C+D组停止接收A+B组发送的NHB。
在这种情况下,CSS使用表决文件和DHB解决脑裂。杀块,是表决文件结构的一个组成部分,将更新和用于通知已被驱逐的节点。每个节点每一秒读取它的杀块,当另一个节点已经更新他的杀块后节点就会自杀。
在像上面,有相似大小的子群集的情况下,子群中含有低节点编号的子群的节点将生存下来,而其他子群集节点将重新启动。
在一个更大的群集分裂的情况下,更大的子群将生存。在两个节点的群集的情况下,节点号小的节点在网络分离下将存活下来,独立于网络发生错误的位置。
连接到一个节点所需的多数表决文件保持活跃。
1.4.7 Member Kill Architectur
在11.2.0.1中kill守护程序是一个没有杀死CSS组的成员的权利。它是由在I/ O客户端加入组OCSSD库代码催生,并在需要时重生。每个用户有一个杀守护进程(oclskd)(例如crsowner,oracle)。
杀死成员说明
下面这些OCSSD线程参与杀死成员:
client_listener – 接收加入组和杀成员的请求
peer_listener – 接收远程节点的杀请求
death_check – 提供终止确认
member_kill – 生成管理一个成员的杀请求
local_kill – 在本地节点生成执行成员杀
node termination – 生成执行升级
客户端执行成员杀,谁执行IO剔除组成员,例如:
ASM实例的LMON
数据库实例的LMON
在PE主节点上的crsd (11.2新的)
成员杀死总是涉及远程目标;无论是远程ASM或数据库实例,非PE主节点。成员杀死请求被移交到本地OCSSD,再把请求发送到OCSSD目标节点上。在11.2.0.2及更高版本,杀守护进程在cssdagent和cssdmonitor上运行一个线程,不再运行oclskd.bin进程。CSS的杀守护进程/线程分别注册在KILLD组上。
在某些情况下,可能在11.2.0.1及更早版本,如极端的CPU和内存资源缺乏,远程节点的杀死守护进程或远程OCSSD不能服务当地OCSSD的成员杀死时间请求(misscount秒),因此成员杀死请求超时。如果LMON(ASM和/或RDBMS)要求成员杀死,那么请求将由当地OCSSD升级到远程节点杀。通过CRSD成员终止请求将永远不会被升级为节点杀,相反,我们依靠orarootagent的检查动作检测功能失调CRSD并重新启动。目标节点的OCSSD将收到成员杀死升级的要求,并会自杀,从而迫使节点重新启动。
与杀守护进程运行实时线程cssdagent / cssdmonitor(11.2.0.2),有更高的机会杀死请求成功,尽管高系统负载。
如果IPMI配置和功能的OCSSD节点监视器将使用IPMI产生一个节点终止线程关闭远程节点。节点终止线程通过管理LAN远程BMC通信;它将建立一个认证会话(只有特权用户可以关闭一个节点),并检查电源状态。下一步骤是请求被断电并反复检查状态直至节点状态为OFF。接到OFF状态后,我们将再次开启远程节点,节点终止线程将退出。
成员杀死的例子:
由于CPU紧缺,数据库实例3的LMON发起成员杀死比如在节点2:
2009-10-21 12:22:03.613810 : kjxgrKillEM: schedule kill of inst 2 inc 20
in 20 sec
2009-10-21 12:22:03.613854 : kjxgrKillEM: total 1 kill(s) scheduled kgxgnmkill: Memberkill called - group: DBPOMMI, bitmap:1
2009-10-21 12:22:22.151: [ CSSCLNT]clssgsmbrkill: Member kill request: Members map 0x00000002
2009-10-21 12:22:22.152: [ CSSCLNT]clssgsmbrkill: Success from kill call rc 0
本地的ocssd(第三节点,内部节点2号)收到的成员杀死请求:
2009-10-21 12:22:22.151: [ ocssd][2996095904]clssgmExecuteClientRequest: Member kill request from client (0x8b054a8)
2009-10-21 12:22:22.151: [ ocssd][2996095904]clssgmReqMemberKill: Kill requested map 0x00000002 flags 0x2 escalate 0xffffffff
2009-10-21 12:22:22.152: [ ocssd][2712714144]clssgmMbrKillThread: Kill requested map 0x00000002 id 1 Group name DBPOMMI flags 0x00000001 start time 0x91794756 end time 0x91797442 time out 11500 req node 2
DBPOMMI is the database group where LMON registers as primary member time out = misscount (in milliseconds) + 500ms
map = 0x2 = 0010 = second member = member 1 (other example: map = 0x7 = 0111 = members 0,1,2)
远程的ocssd(第二节点,内部节点1号)收到的PID的杀死守护进程的请求和提交:
2009-10-21 12:22:22.201: [ ocssd][3799477152]clssgmmkLocalKillThread: Local kill requested: id 1 mbr map 0x00000002 Group name DBPOMMI flags 0x00000000 st time 1088320132 end time 1088331632 time out 11500 req node 2
2009-10-21 12:22:22.201: [ ocssd][3799477152]clssgmmkLocalKillThread: Kill requested for member 1 group (0xe88ceda0/DBPOMMI)
2009-10-21 12:22:22.201: [ ocssd][3799477152]clssgmUnreferenceMember: global grock DBPOMMI member 1 refcount is 7
2009-10-21 12:22:22.201: [ ocssd][3799477152]GM Diagnostics started for mbrnum/grockname: 1/DBPOMMI
2009-10-21 12:22:22.201: [ ocssd][3799477152]group DBPOMMI, member 1 (client
0xe330d5b0, pid 23929)
2009-10-21 12:22:22.201: [ ocssd][3799477152]group DBPOMMI, member 1 (client 0xe331fd68, pid 23973) sharing group DBPOMMI, member 1, share type normal
2009-10-21 12:22:22.201: [ ocssd][3799477152]group DG_LOCAL_POMMIDG, member 0
(client 0x89f7858, pid 23957) sharing group DBPOMMI, member 1, share type xmbr
2009-10-21 12:22:22.201: [ ocssd][3799477152]group DBPOMMI, member 1 (client 0x8a1e648, pid 23949) sharing group DBPOMMI, member 1, share type normal
2009-10-21 12:22:22.201: [ ocssd][3799477152]group DBPOMMI, member 1 (client 0x89e7ef0, pid 23951) sharing group DBPOMMI, member 1, share type normal
2009-10-21 12:22:22.202: [ ocssd][3799477152]group DBPOMMI, member 1 (client 0xe8aabbb8, pid 23947) sharing group DBPOMMI, member 1, share type normal
2009-10-21 12:22:22.202: [ ocssd][3799477152]group DG_LOCAL_POMMIDG, member 0
(client 0x8a23df0, pid 23949) sharing group DG_LOCAL_POMMIDG, member 0, share type normal
2009-10-21 12:22:22.202: [ ocssd][3799477152]group DG_LOCAL_POMMIDG, member 0
(client 0x8a25268, pid 23929) sharing group DG_LOCAL_POMMIDG, member 0, share type normal
2009-10-21 12:22:22.202: [ ocssd][3799477152]group DG_LOCAL_POMMIDG, member 0
(client 0x89e9f78, pid 23951) sharing group DG_LOCAL_POMMIDG, member 0, share type normal
在这一点上,oclskd.log将表明成功杀死这些进程,并完成此杀死请求。在11.2.0.2及更高版本,杀死守护线程将执行杀死:
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsnkillagent_main:killreq received:
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23929
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23973
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23957
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23949
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23951
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23947
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23949
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23929
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23951
2009-10-21 12:22:22.295: [ USRTHRD][3980221344] clsskdKillMembers: kill status 0
pid 23947
但是,如果在(misscount+1/2秒)的请求没完成,本地节点上的OCSSD升级节点杀死请求:
2009-10-21 12:22:33.655: [ ocssd][2712714144]clssgmMbrKillThread: Time up:
Start time -1854322858 End time -1854311358 Current time -1854311358 timeout 11500
2009-10-21 12:22:33.655: [ ocssd][2712714144]clssgmMbrKillThread: Member kill request complete.
2009-10-21 12:22:33.655: [ ocssd][2712714144]clssgmMbrKillSendEvent: Missing answers or immediate escalation: Req member 2 Req node 2 Number of answers expected 0 Number of answers outstanding 1
2009-10-21 12:22:33.656: [ ocssd][2712714144]clssgmQueueGrockEvent: groupName(DBPOMMI) count(4) master(0) event(11), incarn 0, mbrc 0, to member 2, events 0x68, state 0x0
2009-10-21 12:22:33.656: [ ocssd][2712714144]clssgmMbrKillEsc: Escalating node
1 Member request 0x00000002 Member success 0x00000000 Member failure 0x00000000 Number left to kill 1
2009-10-21 12:22:33.656: [ ocssd][2712714144]clssnmKillNode: node 1 (staiu02) kill initiated
2009-10-21 12:22:33.656: [ ocssd][2712714144]clssgmMbrKillThread: Exiting
ocssd目标节点将中止,迫使一个节点重启:
2009-10-21 12:22:33.705: [ ocssd][3799477152]clssgmmkLocalKillThread: Time up.
Timeout 11500 Start time 1088320132 End time 1088331632 Current time 1088331632
2009-10-21 12:22:33.705: [ ocssd][3799477152]clssgmmkLocalKillResults: Replying to kill request from remote node 2 kill id 1 Success map 0x00000000 Fail map 0x00000000
2009-10-21 12:22:33.705: [ ocssd][3799477152]clssgmmkLocalKillThread: Exiting
...
2009-10-21 12:22:34.679: [
ocssd][3948735392](:CSSNM00005:)clssnmvDiskKillCheck: Aborting, evicted by node 2, sync 151438398, stamp 2440656688
2009-10-21 12:22:34.679: [ ocssd][3948735392]###################################
2009-10-21 12:22:34.679: [ ocssd][3948735392]clssscExit: ocssd aborting from thread clssnmvKillBlockThread
2009-10-21 12:22:34.679: [ ocssd][3948735392]###################################
如何识别客户端是谁最初发出成员杀死请求?
在ocssd.log里,请求者可以被找到:
2009-10-21 12:22:22.151: [ocssd][2996095904]clssgmExecuteClientRequest: Member kill request from client (0x8b054a8)
2009-10-21 12:13:24.913: [ocssd][2996095904]clssgmRegisterClient:
proc(22/0x8a5d5e0), client(1/0x8b054a8)
2009-10-21 12:13:24.897: [ocssd][2996095904]clssgmClientConnectMsg: Connect from con(0x677b23) proc(0x8a5d5e0) pid(20485/20485) version 11:2:1:4, properties: 1,2,3,4,5
用’ps’,或从其他历史(如trace文件,IPD/OS,OSWatcher),这个进程可以通过进程id识别:
$ ps -ef|grep ora_lmon
spommere 20485 1 0 01:46 ? 00:01:15 ora_lmon_pommi_3
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30935525/viewspace-2084280/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/30935525/viewspace-2084280/