Oracle 11gR2 CSS集群同步服务

本文永久地址:https://www.askmac.cn/archives/oracle-11gr2-css集群同步服务.html

11gR2中css集群同步服务没有改变的部分

哪些没有发生改变

 

  • 网络心跳
  • 磁盘心跳
  • Miscount
  • 大多数线程
  • OCR 和Voting disks
  • 节点被驱逐和脑裂解决
  • 使用NM和GM的CSS架构

 

11.2CSS 守护进程成员组成

 

集群成员节点的改变(重新配置)

 

  • 需要一个协议来完成成员的改变
  • 在重新配置管理器节点(RMN)运行重新配置
    不是一个固定的节点,任何节点都可以成为RMN的重新配置
    所有节点都必须与RMN通讯来完成重新配置
  • 一个节点发生故障后的第二个节点故障小于misscount是最昂贵的,因为RMN必须等待第二个节点的响应,直到达到第二个节点misscount。
  • 保持与供应商集群的一致性。

 

 

心跳机制

 

心跳

  • 心跳机制
  • 群集成员有两个心跳机制
  • 网络心跳(NHB)
  • 磁盘心跳(DHB)
  • 本地心跳(DHB)
  • 用于不同目的的心跳机制,他们不是冗余机制
  • NHB检测群集丧失生存能力
  • DHB解决网络分裂

 

网络心跳

包含本地节点时间戳信息和毫秒计时器
指示该节点可以参与群的活动,例如组成员身份更改
当NHB丢失太久,集群成员资格更改(集群配置)是必需的
定义“太久”:恒定的时间(misscount)
丢失到网络的连接不一定致命的

 

磁盘心跳

包含分裂决议信息

包含本地节点时间戳信息和毫秒计时器
其他节点仍在连接

一个节点是否是活着的最后一句话
当DHB丢失太久,节点被假定为死亡
当连接到磁盘丢失时间’太长’,盘被考虑离线

“太长”视情况而定
长磁盘I / O时间(LIOT),默认200秒的有效的大部分时间
短磁盘I / O时间(SIOT),集群重新配置过程中有关misscount(misscount – 重启时间)(重启时间默认为3秒)

 

网络分裂

当两组成员无法看到另一组成员

例如一个集群有A、B、C、D四个节点
节点A和B收到对方的心跳
节点C和D获得对方的心跳
节点A和B不能看到C或D的心跳
节点C和D无法看到A或B的心跳
节点A和B是一组,C和D是另组
2组人停止相互接收网络心跳时开始分裂

CSS认为是一个对称的失败,也就是,A+B组停止接收C+D组发送的NHB,C+D组停止接收A+B组发送的NHB。

 

 

表决文件(VF)

结构

内容表(TOC)

VF中多种块组的开始偏移量
格式版本

连续的块组(类似于磁盘阵列)

  •         磁盘心跳
  •         kill块
  •         租约块

用途

  • 磁盘心跳用于脑裂的决议
  • kill 块用于通知已被驱逐的节点
  • 一个节点保持活跃要求能够连接到多数表决文件。

 

集群成员线程结构

 

集群成员线程结构-主要的

集群监听器 – 处理传入的网络活动

发送 – 用来发送网络心跳和磁盘心跳

Polling —监控网络心跳和启动重新配置

重新配置 – 管理进行重新配置

发现线程 – 发现表决文件

EXADATA隔离 – 和EXADATA隔离 的diskmon进程通信

 

 

集群成员线程结构-VF线程

磁盘Ping-(每个表决文件有1个)写磁盘心跳

Kill块-(每个表决文件有1个)监控表决文件的可用性,以确保有足够的表决文件可用

Worker-(每个表决文件有1个)磁盘文件上的多方面I/O

Disk Ping Monitor- 监控表决文件的I/O状态和如果没有足够的可用的表决文件时终止节点。

 

 

 

集群成员线程结构-临时的

SKGXN – (vendor clusterware) monitors VC events

Node Kill – (transient) used for killing nodes via IPMI

 

初始化顺序

 

初始化序顺序-一

  • 设置优先级和更改用户ID 为ORACLE_USER
  • 打开本地监听endpt
  • 允许代理/监控立即连接
  • 只有11.2本地endpt是开启的
  • 打开NM监听endpt
    必需的,这样的租赁区块可以更改endpt信息
  • 没有传入所连接的进程
  • 发现表决的文件
  • 找到最新的CIN
  • 在提交CIN里选择VFs

 

初始化顺序-二

 

  • 获取租约
  • 短期的,可能已经拥有租约
    比较长期的,第一次或节点已经关闭了很长一段时间
  • 通知代理获取租约完成
    启动表决文件线程
    磁盘ping线程写磁盘心跳
    杀块线程读取杀块信息用来驱逐
    工作线程来执行表决文件上特定的I / O操作
  • (新线程)clsnmvWorkerThread
    打开剩余的本地endpts
    要求Endpts能兼容旧版本
    其中一个endpts需要节点号

 

初始化顺序-三

  • 启动GM PeerListener 线程
  • 打开GM节点间监听endpt
    可以通过endpt信息连接NM
  • 启动NM集群监听线程
    尝试连接到其他节点
    接受传入的连接请求
    重试尝试连接节点,如果他们看上去像开启了
    比较磁盘心跳和租约的唯一值
    如果唯一值相同和磁盘心跳活跃,节点时启动的
    第一次进行重新配置完成后不要重试连接
  • 启动其他线程

 

 

CSS/Diskmon Bootstrap Sequence

NM第一次重配置完成后启动EXADATA初始化阶段1

已经完成EXADATA隔离初始化节点优先成为NM RMN
避免当RMN需要隔离一个节点,但尚未完成初始化
如果没有节点已完成初始化,一个节点被隔离起来,所有的节点队列隔离请求,执行diskmon要在初始化完成后

Diskmon允许提前使用组服务
一旦在GM的初始化重新配置完成后,diskmon允许使用服务组
其他客户端等待初始化阶段2完成

Diskmon崩溃和没有重启会引起CSSD失败!见bug 10037073获取更多信息。

 

网络分裂检测与解决

 

检测网络分裂

 

最后的网络心跳时间戳和大多数当前磁盘心跳时间戳进行对比来确定一个节点是否还是活动的。

当最近DHB和最后NHB的时间戳之间的差大于磁盘超时(DTO)时,一个节点被认为仍然有效

当时间戳之间的差小于重启时间时,节点被认为还活着
如果最后DHB读取的时间大于DTO,节点是死的(见bug 5949311)

如果时间戳之间的差大于重启时间且小于DTO,节点的状态是不明确,我们必须等待作出决定,直到成为上述3类中的一个。

解决网络分裂

当网络发生故障,并且仍有活动的节点无法相互通信,网络被认为是分裂的
要在分裂时保持数据的完整性,其中一个节点必然失败
存活的节点应该是原来集群中的一个最佳子群
节点被驱逐
通过网络通讯,如果可能的话
通过磁盘
通过IPMI,如果支持的话

 

 

 

分裂解决方法

基于连接信息决定
DHB包含它可以与之通信的节点的信息;感知状态字节地图(连接/成员)
NHB包含成员和连接位图

RMN使用该信息来计算最佳群子
位图连接和成员资格

位和位图构建最大传递群

存活的群

节点数最多的群

最少节点数的群不能在其他群里

 

术语

 

术语1

分派单元(DU) – 可以独立地调度执行的实体。在某些架构的单一操作系统进程可以(可能)有多个DU,通常被称为线程,可独立发出I/ O。
隔离 – 在计算机集群隔离意味着阻塞一个或多个节点(或进程),执行或完成I / O。
组 – 组是共享一个或多个共同的目标和资源部件的集合。通常在Oracle数据库中的哪个访问同一数据库的进程的集合属于同一组。

 

术语2

主要成员 – 在一个组一些成员被列为主要成员。这些成员有监督小组组成的责任,只要它有变化采取相应的行动。
共享成员 – 共享成员是与主成员相关。它们是主要成员的延伸组成的
成员资格 – 一个主要成员加上这个主要成员的共享实体

 

 

组类型

全局组

成员可能会在不同节点上

通过GM主节点加入被系列化

本地组
大家都在同一节点上,可以做交叉组共享
加入组完全在本地节点上处理

节点组
特殊组用于监控群集成员变动
不具有与正常组的相同特性

本地和全局组命名空间是不同的

 

组成员资格

 

成员资格由主要成员加上分享实体组成

分享实体可能包括

分派单元执行一个“同组”的共享,使用clssgsshreg
另一组的主要成员,使用clssgsXgrpSharedMbrReg

整组,使用clssgsXgrpSharedGrpReg

所有实体的成员必须在同一节点作为主要成员共享

本地组的主要成员可能成为全局组的成员资格

 

 

 

一个成员被认为是活动的,只要在成员的任何实体是活动的

一个成员被认为是中止的,只要在成员的所有实体是中止的
一旦终止会员,通知被发送到其他主要注册会员
组可能有相关的隔离机制
进程死亡隔离
EXADATA隔离
实现隔离是组成员变化和集群重新配置不可分割的一部分。

 

 

 

隔离

 

Fencing

 

目前支持两种类型的隔离

实体死亡 – 当一个DU失败

EXADATA隔离- 当一个DU失败或成员注销

客户端决定隔离生效,使用CSS API调用,classSetFencing()

默认情况下,所有成员都有实体死亡隔离

支持一个单一实体上有多种隔离类型

 

实体死亡隔离

 

声明实体死亡之前会等待直到系统层面的实体死亡。

确保所有文件描述符被关闭,无法生成I/O

没有真正隔离, I/O可能是在到磁盘的途中停止了。

 

 

EXADATA Fencing

 

与EXADATA设备进行交互,以保证真正的隔离

块的I / O可以是在飞行中通过网络
一旦从EXADATA设备接收响应,进程不再构成威胁,即使I / O之后产生

如果实例还是能工作的,隔在RDBMS上成员间的正常共享

注销/失败的主要成员上CSSD的所有共享实体隔离
整个组可能被隔离,如果组共享的一个主要成员离去

 

 

EXADATA Entities That Can Be Fenced

 

节点由节点号和唯一因素确定是单调递增

组由第一个成员加入的数字标识和它的实例数确定

成员由其成员号和在它加入时分配一个唯一的因素确定

Oracle进程由RDBMS隔离,没有CSSD

隔离IDs是分层的,例如隔离一个成员隐式隔离所有共享成员;一次隔离一个组隔离所有成员(只有本地组可以隔离整个组)

 

 

组和隔离的关系

 

主要成员故障可能会离开活动的组,如果共享成员是活动的。

隔离是在组成员级别完成,不需要隔离正常共享成员
跨组成员共享是根据其主要组成员隔离
跨组组共享根据他们的组进行隔离

只有在完成成员隔离之后,主要成员离开的组成员更改事件才会交付,以确保在事件交付之前停止I / O

 

 

ASM Fencing Relationships

 

ASM隔离关系通过4个组的成员确定

Disk Group Group Global (DGGG)‏

Disk Group Group Local (DGGL)‏

Umbillicus Foreground Group (UFGG)‏

DataBase Group Global (DBGG)‏

 

组注册和隔离操作包含ASM进程:

GMON

RBAL

ASMB

LMON (一个RDBMS进程) 也包含

 

 

ASM Related Groups

Database Group Global (DBGG)‏

这个组是10g之前版本唯一使用的原始组。

用来标识其他数据库实例,这个实例已经死了

Umbillicus FG Group (UFGG)‏

本地组,每个节点上

每一个数据库实例挂载磁盘组,在ASM上会有一个UFG进程

UFG(在ASM上)和RBAL基础是主要成员。

 

 

Disk Group Group Global (DGGG)‏

全局组,在每一个asm磁盘组上

GMON进程注册是主要的

Disk Group Group Local (DGGL)‏

本地组,在每一个asm磁盘组上

每个挂载磁盘组上RBAL注册在DGGL上

交叉组组共享GMON,相同磁盘组的DGGG主要成员

RBAL在这个组的主要成员交叉组成员共享:

他自身的UFG 主要成员

LMON DBGG主要成员

 

 

ASM Events That Drive Fencing – I

ASM实例死亡(本地/全局RBAL/ GMON组)
DGGG的GMON成员失败
隔离驱动所有DGG共享成员(GMON是主要的)
在DGGL所有RBAL进程会被隔离
DGG相关w/ RBAL主要所有共享成员将被隔离。
ASM实例故障通知将不会传递,直到所有成员都隔离和终止组成员资格。

 

 

 

磁盘组卸载
GMON进程从磁盘组的DGGG注销
类似于ASM实例死亡的隔离

UFG进程失败
UFG进程失败不会关闭ASM实例
DBG组RBAL DGGL成员资格必须隔离

每个磁盘组挂载的RBAL进程必须隔离

数据库实例失败
LMON进程失败
DBG组RBAL DGGL成员资格必须隔离

 

 

GM Thread Architecture

 

peer监听器 – 处理来自其他节点的所有传入的网络活动

客户端侦听 – 处理来自客户端的所有传入的网络活动。Lmon,诊断进程,数据库服务是要通过

客户端监听器线程于CSS交谈。

群集事件监视器 – 集群成员更改监视器

重新配置 – (瞬态)与其他节点组成员的同步

隔离检查 – 显监控隔离操作

成员杀 – (瞬态)只针对成员杀
一个线程与节点请求杀互动
一个线程来启动进程杀死并监督完成

 

 

Fence Lifecycle

 

隔离可以作为发起的结果:
丢失CSSD连接,由客户端监听器检测
所有主要和共享成员连接到CSSD
连接的丢失被解释为DU失败

主要会员注册
此时只发起EXADATA隔离
预防客户端注销错误在I/ O完成之前

隔离检查线程监控完成隔离

实体的死亡和Exadata隔离监控
不生成组成员身份更改事件,直到隔离完成

 

 

Functionality in the Processes

 

代理相关功能
监视’资源’的活跃度
对于代理资源CSSD
对于监视资源cssdmonitor进程本身
报告OHASD
执行资源启动/停止

CSSD相关功能
OPROCD
VMON – 可在任一,但不是在两个
OMON

CSSD健康和节点夯住的双重监控,以确保在需要时能正确的重启

 

2. 新特性

概述

 

11.2新特性(1)

 

配置文件

本地存储信息要求是启动的
OCSSD不需要OCR启动

OLR(Oracle本地注册表)
更改表决文件
租约块
自动备份表决文件
表决文件和OCR在ASM上

日志记录更改

默认的日志记录级别现在2

 

11.2新特性(2)

 

节点号是不固定

在CRS启动时分配节点号
降低配置要求
自动添加和删除节点
新的通信层
GPIC
集群维护/安装模式
配置的动态变化

 

11.2新特性(3)

cssd 代理/监控

没有单独的oprocd, oclsomon, 和oclsvmon进程

节点重启由于升级到节点杀

11.1中可用

11.2中可用使用新的IPMI

 

新特性详情

 

 

添加配置文件

 

配置数据的新级别

  • 启动集群堆栈的最少配置要求
    • 集群GUID
    • 网络信息
    • 表决文件发现字符串
    • 其他的一些信息(少量)

 

Oracle Local Registry (OLR)

 

类似OCR,但数据不能跨节点共享
通过OHASD管理,类似于CRSD管理OCR

 

 

VF changes

 

形成的关键数据(FCD)存储在VF
数据所有节点都必须同意形成集群,例如Misscount
表决文件列表
以前存储在OCR

增加新的块
VF标识块
集群GUID
文件UID
提交和等待Configuration Incarnation Number(CIN)块,含FCD

 

VF数据自动备份在OCR里

 

 

Configuration Hierarchy

 

配置文件

要求启动CSSD和CSSD守护进程

变化是罕见
OLR
CSS表决文件
要求CSSD是启动的
只用CSSD
OCR
适用于集群范围内所有节点的数据
需要CRSD是启动的

 

 

Lease Block

 

租约块在表决文件中连续的块(如磁盘阵列)

租约块索引为插槽/节点号

主机级别的配置数据

主机名

对CSS所需的所有节点的具体信息,形成一个集群

固定NM连接11.2.0.1每个节点

动态NM连接11.2.0.1节点

 

 

Reduced Configuration Requirements

 

节点没有被明确地添加或删除

节点启动后自动添加

删除节点,如果他们关闭太久

支持在ASM存放表决文件和OCR

存储由ASM管理

表决文件可能会被自动删除和增加,如果现存的表决文件坏了

对CSS/ NM无固定端口分配

与其他应用没有端口争用

固定端口分配仍用于滚动升级

 

 

New Communications Layer – GIPC

支持11.2.0.1之前的 CLSC通信层之间的相互作用。

将支持用多个NIC的单个通信链路,例如使的CSS / NM间通信(11.2.0.2)

 

 

Logging Changes

 

更多警报日志条目,以便更快的定位问题的相关条目。

更好的关联告警日志条目和守护进程日志条目

标识符将在与问题相关的告警日志和守护进程日志条目中输出

标识符是组件中唯一的,例如CSSD,CRS等。

 

 

动态修改CSS配置-基础

在11.1,可以在线更改VF,但无法在集群开启时更改其他参数

实现其他配置更改需要新的协议

协议是重新配置序列的一部分

如果节点加入或离开集群,变化将被延迟

每一个变化会增加CIN

 

 

动态修改CSS配置-细节

 

RMN发送配置更改消息(CCM)

所有节点都必须ACK CCM

该ACK可以是正面的或负面的

如果包含添加VF,在启动重新配置之前发出发现请求

发现所有节点ACK

在发现是无法识别VF的变化,但能发现新的VFS

当收到CCM,VFs在配置里已经进行了验证

在等待的和提交的修改CIN块需要作为协议的一部分

等待的更改允许恢复在更改中失败的时间

提交的用来确保所有节点使用相同的配置

 

 

 

集群件维护/安装模式(独占)

 

启动堆栈几乎没有什么要求

不需要表决文件

不需要网络

安装配置表决文件时使用

配置损坏过于严重的启动时使用

表决文件损坏或网络无效

问题可以被纠正和集群重启

用户发出命令在此模式下启动堆栈:

CRSCTL start CRS-excl
只有1个节点可在此模式下启动集群件堆栈
CSSD试图确保只有1个节点活跃在这一模式
如果没有网络和没有表决文件,CSS可能无法检测到另一个节点在此模式下

 

 

Node Data Location Changed

在11.1和之前版本,节点数据存储在OCR
节点节点号
节点固定的端口号(实际上是整个网络连接字符串,其中包含端口号)

在11.2.0.1,几乎所有的节点数据从CSSD获得
大多数数据存储在表决文件
有一些数据在当地OCR

CSSD必须始终开启的用来获取节点数据

CSSD依赖OCR消除

 

 

Node Number Not Fixed

 

节点在启动时得到节点号

使用表决文件,以保证只有1个节点是这个号

在多数表决文件必须包含相同的节点号

节点号是租用的
租约概念类似于IP地址的DHCP租约
与DHCP不同,每个节点分配其自己的节点号,在DHCP没有节点号分配权利

当租约到期,节点号可能被另一个节点使用

 

 

获得租约

 

使用的表决文件是在线的

表决文件中的新租约块

每一个节点号

块的所有权决定了主机节点号

在考虑分配节点号之前租约块必须包含在多数表决文件中。

租约块必须检查看是否有其他节点拥有或试图拥有租约块

尝试通过节点拥有的最后一块,即最后分配到节点的节点号,先看看租约是否还有效

如果租约还有效,减少I / O和获得租约时间

使用的最后一个号存储在OLR中

 

 

Reconfig Processing Changes

 

淘汰表决阶段
只传输了GM终端到所有节点

GM终端信息现已通过在初始连接上

配置改变阶段
在11.1表决文件更改阶段
这一阶段重做支持其他配置值的变化,例如Misscount
较少的阶段,降低潜在节点故障延迟重新配置

 

 

Pinned Nodes

 

需要滚动升级到11.2.0.1

11.2.0.1之前的版本节点需要一个固定配置

节点升级过程中自动固定

要求11.2之前版本的 DB实例能够连接到集群

11.2之前版本的RDBMS实例使用节点信息来连接CSSD

在OCR的信息也需要其他类型的查询

为固定节点获取租约是非常快的

当前节点号可以由用户分配给一个节点

节点必须有一个有效的租约

命令是:CRSCTL pin CSS –n <主机名>

 

 

CSS Startup for Configuration

 

总是以独占模式启动

检查是否配置表决

如果没有配置表决文件,必须进行初始配置

如果集群中另一个节点已经启动,独占模式启动将失败

CSSD检查启动的节点

失败消息4402

不是错误,预期是另一节点是启动的

 

 

节点重启和驱逐

 

  • 节点驱逐由于丢失网络心跳
  • 节点驱逐由于丢失磁盘心跳
  • 节点重启由于无法访问多数表决磁盘
  • 节点重启由于该节点挂起或认为节点挂起
  • 节点重新启动由于CSSD挂起
  • 节点重启由于组成员杀升级到节点杀
  • 通过IPMI重启节点

 

丢失网络心跳

 

 

丢失网络心跳(1)

 

节点1 cssd.log:

 

===>发送网络心跳到其他节点。通常情况下,该消息是每次输出5条消息

 

2010-08-13 17:00:20.023: [    CSSD][4096109472]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:20.023: [    CSSD][4096109472]clssnmSendingThread: sent 5 status msgs to all nodes

 

===>连续15秒没有从节点2上接收到网络心跳。

===>这意味着丢失十五个网络心跳信息,第一次告警(50%阈值)。

 

2010-08-13 17:00:22.818: [    CSSD][4106599328]clssnmPollingThread: node drrac2 (2) at 50% heartbeat fatal, removal in 14.520 seconds

2010-08-13 17:00:22.818: [    CSSD][4106599328]clssnmPollingThread: node drrac2 (2) is impending reconfig, flag 132108, misstime 15480

 

===>继续发送网络心跳,每次5条日志信息

 

2010-08-13 17:00:25.023: [    CSSD][4096109472]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:25.023: [    CSSD][4096109472]clssnmSendingThread: sent 5 status msgs to all nodes

 

 

===>达到75%阈值,第二次告警

 

2010-08-13 17:00:29.833: [    CSSD][4106599328]clssnmPollingThread: node drrac2 (2) at 75% heartbeat fatal, removal in 7.500 seconds

 

===>继续发送网络心跳,每次5条日志信息

 

2010-08-13 17:00:30.023: [    CSSD][4096109472]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:30.023: [    CSSD][4096109472]clssnmSendingThread: sent 5 status msgs to all nodes

 

===>继续发送网络心跳,但是4条日志信息

 

2010-08-13 17:00:34.021: [    CSSD][4096109472]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:34.021: [    CSSD][4096109472]clssnmSendingThread: sent 4 status msgs to all nodes

 

===>达到90%阈值时,最后一次告警

 

===>驱逐将发生在2.49秒后

2010-08-13 17:00:34.841: [    CSSD][4106599328]clssnmPollingThread: node drrac2 (2) at 90% heartbeat fatal, removal in 2.490 seconds, seedhbimpd 1

 

 

 

===>开始驱逐节点2

2010-08-13 17:00:37.337: [    CSSD][4106599328]clssnmPollingThread: Removal started for node drrac2 (2), flags 0x2040c, state 3, wt4c 0

 

===>这表明节点2主动更新的表决磁盘

2010-08-13 17:00:37.340: [    CSSD][4085619616]clssnmCheckSplit: Node 2, drrac2, is alive, DHB (1281744040, 1396854) more than disk timeout of 27000 after the last NHB (1281744011, 1367154)

 

 

 

丢失网络心跳(3)

 

===>驱逐节点2

2010-08-13 17:00:37.340: [    CSSD][4085619616](:CSSNM00007:)clssnmrEvict: Evicting node 2, drrac2, from the cluster in incarnation 169934272, node birth incarnation 169934271, death incarnation 169934272, stateflags 0x24000

 

===>重新配置集群不包括节点2

2010-08-13 17:01:07.705: [    CSSD][4043389856]clssgmCMReconfig: reconfiguration successful, incarnation 169934272 with 1 nodes, local node number 1, master node number 1

 

 

 

丢失网络心跳(4)

 

节点2 cssd.log:

 

===>日志信息表明发送5个网络心跳给每个节点

 

2010-08-13 17:00:26.009: [    CSSD][4062550944]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:26.009: [    CSSD][4062550944]clssnmSendingThread: sent 5 status msgs to all nodes

 

===>丢失网络心跳,达到50%阈值,第一次告警

2010-08-13 17:00:26.213: [    CSSD][4073040800]clssnmPollingThread: node drrac1 (1) at 50% heartbeat fatal, removal in 14.540 seconds

2010-08-13 17:00:26.213: [    CSSD][4073040800]clssnmPollingThread: node drrac1 (1) is impending reconfig, flag 394254, misstime 15460

 

===>日志信息表明发送5个网络心跳给每个节点

2010-08-13 17:00:31.009: [    CSSD][4062550944]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:31.009: [    CSSD][4062550944]clssnmSendingThread: sent 5 status msgs to all nodes

 

===>丢失网络心跳,达到75%阈值,第二次告警

 

2010-08-13 17:00:33.227: [    CSSD][4073040800]clssnmPollingThread: node drrac1 (1) at 75% heartbeat fatal, removal in 7.470 seconds

 

===>日志信息表明发送4个网络心跳给每个节点

2010-08-13 17:00:35.009: [    CSSD][4062550944]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:35.009: [    CSSD][4062550944]clssnmSendingThread: sent 4 status msgs to all nodes

 

 

===>丢失网络心跳,达到90%阈值,第三次告警

2010-08-13 17:00:38.236: [    CSSD][4073040800]clssnmPollingThread: node drrac1 (1) at 90% heartbeat fatal, removal in 2.460 seconds, seedhbimpd 1

 

===>日志信息表明发送5个网络心跳给每个节点

2010-08-13 17:00:40.008: [    CSSD][4062550944]clssnmSendingThread: sending status msg to all nodes

2010-08-13 17:00:40.009: [    CSSD][4062550944]clssnmSendingThread: sent 5 status msgs to all nodes

 

===>开始驱逐节点1

2010-08-13 17:00:40.702: [    CSSD][4073040800]clssnmPollingThread: Removal started for node drrac1 (1), flags 0x6040e, state 3, wt4c 0

 

===>节点1主动更新的表决磁盘

2010-08-13 17:00:40.706: [    CSSD][4052061088]clssnmCheckSplit: Node 1, drrac1, is alive, DHB (1281744036, 1243744) more than disk timeout of 27000 after the last NHB (1281744007, 1214144)

2010-08-13 17:00:40.706: [    CSSD][4052061088]clssnmCheckDskInfo: My cohort: 2

2010-08-13 17:00:40.707: [    CSSD][4052061088]clssnmCheckDskInfo: Surviving cohort: 1

 

===>节点2中止自己来解决脑裂,确保集群的完整性

2010-08-13 17:00:40.707: [    CSSD][4052061088](:CSSNM00008:)clssnmCheckDskInfo: Aborting local node to avoid splitbrain. Cohort of 1 nodes with leader 2, drrac2, is smaller than cohort of 1 nodes led by node 1, drrac1, based on map type 2

2010-08-13 17:00:40.707: [    CSSD][4052061088]###################################

2010-08-13 17:00:40.707: [    CSSD][4052061088]clssscExit: CSSD aborting from thread clssnmRcfgMgrThread

2010-08-13 17:00:40.707: [    CSSD][4052061088]###################################

 

 

 

丢失网络心跳(7)

 

观察报告

在同一时间两个节点报告丢失心跳信号

所有时间这两个节点发送心跳到其他节点

节点2中止自己来解决脑裂
结论

这可能是网络问题

检查OSWatcher输出(netstat的和traceroute)

 

 

仲裁盘访问问题

 

 

仲裁盘访问问题(1)

 

ocssd.log

 

===>第一个错误表名无法读取仲裁盘

 

2010-08-13 18:31:19.787: [   SKGFD][4131736480]ERROR: -9(Error 27072, OS Error (Linux Error: 5: Input/output error

Additional information: 4

Additional information: 721425

Additional information: -1)

)

2010-08-13 18:31:19.787: [    CSSD][4131736480](:CSSNM00060:)clssnmvReadBlocks: read failed at offset 529 of /dev/sdb8

2010-08-13 18:31:19.802: [    CSSD][4131736480]clssnmvDiskAvailabilityChange: voting file /dev/sdb8 now offline

 

===>错误信息显示是访问仲裁盘有问题,每四秒重复一次

 

2010-08-13 18:31:23.782: [    CSSD][150477728]clssnmvDiskOpen: Opening /dev/sdb8

2010-08-13 18:31:23.782: [   SKGFD][150477728]Handle 0xf43fc6c8 from lib :UFS:: for disk :/dev/sdb8:

2010-08-13 18:31:23.782: [    CLSF][150477728]Opened hdl:0xf4365708 for dev:/dev/sdb8:

2010-08-13 18:31:23.787: [   SKGFD][150477728]ERROR: -9(Error 27072, OS Error (Linux Error: 5: Input/output error

Additional information: 4

Additional information: 720913

Additional information: -1)

)

2010-08-13 18:31:23.787: [    CSSD][150477728](:CSSNM00060:)clssnmvReadBlocks: read failed at offset 17 of /dev/sdb8

 

 

===>最后的错误显示是访问仲裁盘的问题

===>最后的信息是在第一次信息之后的200秒

===>因为磁盘超时时间是200秒

 

2010-08-13 18:34:37.423: [    CSSD][150477728]clssnmvDiskOpen: Opening /dev/sdb8

2010-08-13 18:34:37.423: [    CLSF][150477728]Opened hdl:0xf4336530 for dev:/dev/sdb8:

2010-08-13 18:34:37.429: [   SKGFD][150477728]ERROR: -9(Error 27072, OS Error (Linux Error: 5: Input/output error

Additional information: 4

Additional information: 720913

Additional information: -1)

)

2010-08-13 18:34:37.429: [    CSSD][150477728](:CSSNM00060:)clssnmvReadBlocks: read failed at offset 17 of /dev/sdb8

 

===>这个信息显示ocssd.bin线程访问仲裁盘200秒

2010-08-13 18:34:38.205: [    CSSD][4110736288](:CSSNM00058:)clssnmvDiskCheck: No I/O completions for 200880 ms for voting file /dev/sdb8)

 

===>ocssd.bin线程中止自己,因为无法访问多少仲裁盘。在这里,只有一个仲裁盘,如果有3个仲裁盘的话,能够访问其中两个,ocssd.bin线程就不会中止。

2010-08-13 18:34:38.206: [    CSSD][4110736288](:CSSNM00018:)clssnmvDiskCheck: Aborting, 0 of 1 configured voting disks available, need 1

2010-08-13 18:34:38.206: [    CSSD][4110736288]###################################

2010-08-13 18:34:38.206: [    CSSD][4110736288]clssscExit: CSSD aborting from thread clssnmvDiskPingMonitorThread

2010-08-13 18:34:38.206: [    CSSD][4110736288]###################################

 

结论

仲裁盘无效

 

 

杀死成员

 

CSS 11g Member Kill

 

CSS 11g Member Kill (Review)

 

在以前版本的问题:

当在RAC数据库一个实例失败或挂起
LMON必须收回由失败实例持有的锁
防止损坏,回收锁之前,LMON必须确保实例已经真的失败了,永久消失,可以做到没有更多的I / O – I / O隔离

在驱逐LMON写一个驱逐通知CF
受害人LMON关闭实例和所有I / O
不幸
“失败”LMON可能不回应
“失败”LMON可能挂起

 

 

11g解决方法:
LMON和所有的I/ O处理能力是CSS数据库组的成员
基于CSS的机制来剔除组成员
将处理所有的I / O处理能力
将独立LMON失败
如果需要的话CSS本地的实例可以终止故障节点
没有CSS的合作或本地操作系统也是可以终止节点的。

 

 

解决方案概念:
成员杀 – 一个CSS组的成员请求该组的一个或多个成员的终止
Killable组 – CSS组,其成员可以相互终止
升级 – 如果成员杀失败,本地节点处于停机状态
主要成员 – 可以杀死主要和共享成员
多用户组 – 成员进程有不同的用户ID
 

架构:
杀守护进程 – 无特权的杀死成员进程(每个用户一个)
CSS库 – 包含的代码链接w/客户端
在组加入产生杀守护进程

将成员杀死来自客户机的请求转发到css守护进程
新(老)CSSD线程参与杀死成员
客户端侦听器 – 接收组的加入和杀死请求
peer_listener – 接收杀来自远程节点的请求
死亡检查 – 提供终止确认
member_kill – 产生管理成员终止请求
local_kill – 产生在本地节点杀死成员

 

 

杀守护进程:
当客户端注册在一个killable组时,杀守护进程由CSS库代码产生。

连接到CSSD并注册为KD的产生用户
等待来自CSSD的PID的列表的请求
尝试终止每个PID(kill -9在Linux上)
CSSD请求的客户端(重新)产生KD连接失败时或者没有KD来处理终止请求
由CSSD指示终止时不再需要

 

 

加入一个killable组:

客户端代码:
发送带“killable”标志加入到CSSD
复制一个新的进程来运行其杀守护进程
杀守护进程:
唤醒和连接到CSSD,为用户注册作为KD用户
如果KD存在该用户ID,告知要退出,否则等待
CSS守护程序:
如果组存在,它必须已经是“killable”O / W创建组并将其标记为“killable”(否则拒绝)
如果组是新的,标记为“killable”
做正常组登记簿记
从KD接受连接并注册或拒绝它

 

成员终止请求与升级:
客户端调用casperkill()与组名和坏的节点面具
CSS客户端库
核实组是killable
检查进程之前的kill
坏的节点面具转发给客户端监听线程
CSS客户端监听线程
验证成员的ID掩码是不是最新的,如果不是就拒绝
坏节点的分区列表作为子请求
生成成员杀死线程管理/跟踪此终止请求
响应客户端请求

 

 

成员终止请求与升级:
成员杀死线程
检查升级的标志,并注意超时期限
当地坏节点(本地节点上),产生当地杀死线程
对于坏的每个远程节点发送子请求
申报成功就远程坏节点
等待杀状态报告或直到超时
如果超时和升级请求->启动节点驱逐
客户端生成成功或失败的事件

(远程)对等监听线程
产生当地杀死线程处理本地终端

 

 

当地杀死线程 – 每个本地受害者
验证受害者出生化身是当前成员
生成的PID的主列表
查找会员的负责杀守护进程
如果没有,客户端请求(重新)产生KD
CSS将未完成击杀请求,如果KD重新生成

PID的杀守护进程转发列表
从死亡检查线程记录通知
报告结果(成功或超时)给成员杀死线程

杀守护进程
每个受害者PID尝试使用OSD进程杀机制杀死进程

 

 

 

CSS死亡检查线程
确认组成员终止状态
由成员终止请求的目标成员,通知
如果成员是本地,通知当地杀死线程
如果该成员是远程的,通知远程杀死线程
CSS节点监视器 – 处理驱逐升级
发送消息驱逐到远程CSS
写驱逐到表决文件

 

 

参数

_imr_evicted_member_kill = true

_imr_evicted_member_kill_wait = 20

 

跟踪和诊断

29718事件,级别2到4

检查LMON跟踪文件里的杀请求原因。很多情况下,当一个杀发出,目标实例的DBRM进程是第一次。(至少在LINUX)

在11.1.0.7,当发出一个杀请求会产生告警信息。.  [[ ex: Remote instance kill … ]]

 

 

 

分析:实例1被夯住和没有响应,那么实例2驱逐实例1,等待实例1中止。等待20秒后,实例2要求CRS杀实例1(成员杀死)

 

 

日志信息

 

===>节点2上的CRS报告,它接收到来自客户端成员杀请求(在此情况下,实例2)。成员杀请求被发送到CRS节点1上。

2010-07-24 10:38:45.112: [    CSSD][1091119424]clssgmExecuteClientRequest: Member kill request from client (0x2aaab4178470)

2010-07-24 10:38:45.113: [    CSSD][1091119424]clssgmReqMemberKill: Kill requested map 0x00000001 flags 0x2 escalate 0xffffffff

2010-07-24 10:38:45.113: [    CSSD][1281349952]clssgmMbrKillThread: Kill requested map 0x00000001 id 2 Group name DBOR08P flags 0x00000001 start time 0x98117058 end time 0x9811e77c time out 30500 req node 2

 

===>在节点1发送成员杀请求给CRS30秒后,节点2上的CRS的成员杀请求时间超时,因为节点1CRS没有相应,实例1被中止。

2010-07-24 10:39:15.619: [    CSSD][1281349952]clssgmMbrKillThread: Time up: Start time -1743687592 End time -1743657092 Current time -1743657092 timeout 30500

2010-07-24 10:39:15.619: [    CSSD][1281349952]clssgmMbrKillThread: Member kill request complete.

2010-07-24 10:39:15.619: [    CSSD][1281349952]clssgmMbrKillSendEvent: Missing answers or immediate escalation: Req member 1 Req node 2 Number of answers expected 0 Number of answers outstanding 1

 

===>节点2 CRS升级成员终止请求,节点终止请求告诉节点1 CRS中止。

2010-07-24 10:39:15.620: [    CSSD][1281349952]clssgmMbrKillEsc: Escalating node 1 Member request 0x00000001 Member success 0x00000000 Member failure 0x00000000 Number left to kill 1

2010-07-24 10:39:15.620: [    CSSD][1281349952]clssnmKillNode: node 1 (ghlx062ptlge) kill initiated

2010-07-24 10:39:15.620: [    CSSD][1281349952]clssgmMbrKillThread: Exiting

2010-07-24 10:39:15.620: [    CSSD][1207920960]clssgmRPCDone: rpc 0x2aaaaaffaec8 (RPC#315) state 6, flags 0x202

2010-07-24 10:39:15.620: [    CSSD][1207920960]clssgmMbrKillCmpl: Response to invalid member kill request. id 2 Grock DBOR08P requesting node 2

 

结论
节点1没有响应成员终止请求杀死实例1
在节点1 CRS被夯住或CRS不能杀死实例1
检查OSWatcher输出

 

 

额外的跟踪

crsctl set log css CSSD:N(N是日志级别)

级别2=默认的

级别3=详细的,例如显示美国心跳信息,包括misstime,有助于调试NHB相关问题。

级别4=超级详细

注意:大多数问题都可以用2级来解决,一些需要3级,少数需要4级.使用3级或4,跟踪信息只被保留了几个小时(甚至是几分钟),因为跟踪文件可以填满,并信息可以被覆盖。请注意,较高的日志记录级别由于跟踪的数量会影响OCSSD性能。如果您需要保存的数据的时间周期较长,创建一个cron作业来备份和压缩CSS日志

可以通过crsctl增强cssdagent和cssdmonitor的跟踪日志。

# crsctl set log res ora.cssd=2 -init

# crsctl set log res ora.cssdmonitor=2 –init

 

GIPC跟踪可以增加跟踪通讯

在Oracle集群件11g第2版(11.2),CSS打印堆栈转储到cssdOUT.log。这有助于重启发生之前刷新诊断数据到磁盘。因此,在11.2,我们认为没有必要改变diagwait(默认为0),除非支持或开发建议。
在极少数情况下,仅调试期间,可能也许必要禁用OCSSD重新启动。这可以通过以下CRSCTL命令来完成。禁用重启应该在开发或支持人员的指导下进行。

 

欲了解更多信息,请参阅集群WP

 

 

Comment

*

沪ICP备14014813号-2

沪公网安备 31010802001379号