Oracle RAC 心跳问题

2024年 1月 2日 63.5k 0

心跳线

物理布线注意事项

  • 不建议直连网线,建议采用交换机连接方式
  • 心跳线与业务网络分开单独接线
    • 若公用一个交换机时,使用VLAN隔离
  • Oracle不支持使用交叉线(cross-cabling)作为Clusterware的内部连接
    • 导致集群不稳定
    • 限制了两个节点RAC扩展
  • 建议心跳交换机使用两个交换机做主备,冗余

RAC中心跳线作用

  • 承担了心跳作用(检测集群节点间的网络健康状态)
  • 缓存同步刷新
  • 全局资源维护
  • 当出现gc(grid control)的时候,用于传输数据块[因内联数据通信量比较大,建议使用千兆或万兆网]

心跳网络高可用实现

  • 操作系统层面使用双网口绑定的技术实现高可用

    • 双网口绑定常见有负载均衡和主备模式
  • ORACLE 通过HAIP特性(11.2.0.2)实现高可用

心跳网络优化建议开启巨帧(Jumbo frame)

巨型帧的影响

  • 在压力较大的系统上使用帧的Jumbo的好处,这样的系统将使用较少的CPU,并减少网络开销。
    • 对于RAC互连流量,正确配置为巨型帧的设备可通过减少将大型邮件拆分为标准以太网的较小帧时发生的TCP,UDP和以太网开销来提高性能。由于可以发送一个较大的数据包,因此消除了各个较小数据包之间的数据包间延迟。在要求高吞吐量和带宽以及系统受CPU约束的情况下,性能的提高最为明显。
    • 使用巨型帧时,需要较少的缓冲区传输,这是减少IP堆栈中的碎片和重组的一部分,因此对减少Oracle块传输的延迟有影响。
  • 任何不正确的设置都可能会阻止实例启动或对性能产生非常不利的影响。

Linux环境

开启

ifconfig eth0 mtu 9000

ifconfig -a eth0

检测验证
ping

# a packet size (-s), prohibiting fragmentation (-M do):禁止零散数据包
ping -c 2 -M do -s 8972 node2-priv

ping -c 2 -M do -s 8973 node2-priv

# For Solaris platform, the similar ping command is:
ping -c 2 -s node2-priv 8972

不是所有的网卡都可以开启到9000,如果上面ping测试不通的话,可以逐渐的减少。直到找到一个稳定的值

traceroute

traceroute -F node2-priv 9000
traceroute -F node2-priv 9001

RAC心跳机制

Oracle集群如何维护集群的一致性,所谓的集群一致性就是指集群中每个成员能够了解其他成员的状态,而且每个成员获得的集群中其他节点的状态和集群中节点成员列表信息是一致的,这也是集群最基本的要求。

集群的一致性实现机制

Oracle通过三种机制来实现集群的一致性:

  • 网络心跳: 确定节点与节点间的连通性,以便节点之间能够了解彼此的状态。
  • 磁盘心跳: 用一个或多个共享的位置来保存节点之间的连通性信息,以便在集群需要进行重新配置时,能够做出正确的决定并记录集群最新的状态
  • 本地心跳: 本地节点自我监控机制,以便当本地节点出现问题时能够"自杀"离开集群,避免不一致的产生

他们都依赖于ocssd.bin进程

OCSSD这个进程是Clusterware最关键的进程,如果这个进程出现异常,会导致系统重启。这个进程提供CSS (Cluster Synchronization Serviee)服务。CSS服务通过多种心跳机制,实时监控集群健康状态,提供脑裂保护等基础集群服务功能。

CSS服务心跳机制

  • 通过私有网络的Network Heartbeat
  • 通过Voting Disk的Disk Heartbeat

ASM环境也有CSSD进程,用于ASM instance和RDBMS instance通信

具体实现

网络心跳(Network HeartBeat,NHB)

对于Oracle集群,ocssd.bin守护进程每秒钟通过集群的私网向集群的其他节点发送网络心跳,用于确定集群节点之间的连通性,以便节点之间能够了解彼此的状态。

磁盘心跳(Disk HeartBeat,DHB)

磁盘心跳的主要目的就是当集群脑裂时帮助制定脑裂的解决方案。

Oracle集群的每一个节点每秒钟都会向集群的所有表决盘注册本地节点的磁盘心跳信息(也就是说,所有VF [Voting File]中的信息是相同的),同时也会将自己能够联系到的集群中其他节点的信息,或者说本节点认为集群中的成员列表信息写入到表决盘中。一旦发生脑裂,CSS的重新配置线程就可以通过表决盘中的信息了解集群中节点之间的连通性,从而决定集群会分裂成几个子集群,以及每个子集群包含的节点情况和每个节点的状态。磁盘心跳是通过ocssd.bin守护进程来实现的。

本地心跳(Local HeartBeat,LHB)

这种心跳的作用是监控ocssd.bin进程以及本地节点的状态。

  • 在10g版本中,Oracle通过oclsomon和oprocd来实现。
    • 守护进程oclsomon.bin监控ocssd.bin进程的状态
    • oprocd.bin进程监控本节点是否出现了性能问题(例如hang住)
  • 从11.2.0.1版本开始,新的集群cssdagent.bin和cssdmonitor.bin进程被引入,它们的功能就是监控本地节点的ocssd.bin进程状态和本地节点的状态。
    • 通过本地心跳对ocssd.bin进程进行监控。本地心跳的作用是监控本地的ocssd.bin进程是否正常运行。同时,也监控自己到ocssd.bin之间的连接。
    • Oracle会在每一秒钟,在发送网络心跳的同时向cssdagent和cssdmonitor发送本地ocssd.bin进程的状态(本地心跳)。如果本地心跳没有问题,cssdagent就认为ocssd.bin进程正常。如果ocssd.bin进程持续丢失本地心跳(到达misscount的时间)ocssdagent就会认为本地节点的ocssd.bin进程出现了问题,并重启该节点。
  • 在11.2.0.2中,引入rebootless restart新特性。
    • 当集群中的某个节点被驱逐(例如丢失网络心跳)或者该节点的ocssd.bin出现问题时,集群将不会直接重新启动该节点,而是首先尝试重新启动GI stack来解决问题,如果GI stack不能够在指定的时间内(short disk I/O timeout)完成graceful shutdown,才会重新启动节点,之后,存活的节点对集群进行重新配置。

心跳延迟

对于Disk Heartbeat心跳最大时延叫作IOT (I/O Timeout)

对于Network Heartbeat心跳最大时延叫作MC (Miscount)

网络心跳misscount和磁盘心跳disktimeout查询及设置

  • misscount:用来定义集群网络心跳的超时时间(10.2.0.4以后网络心跳超时misscount为60s;11.2以后网络心跳超时misscount为30s)。当集群中的一个或多个节点连续丢失网络心跳超过misscount时间后,集群需要进行重新配置,某一个或多个节点需要离开集群。在11gR2版本的集群,这个值也是节点本地心跳超时时间,因为本地心跳和网络心跳是由相同的线程发送的。

  • disktimeout:用来定义集群磁盘心跳的超时时间(10.2.0.4以后 磁盘心跳超时DiskTimeout为200s)

## 查询网络心跳NHB misscount
[root@node1 ~]# crsctl get css misscount
CRS-4678: Successful get misscount 30 for Cluster Synchronization Services.

## 查询磁盘心跳DHB disktimeout
[root@node1 ~]# crsctl get css disktimeout
CRS-4678: Successful get disktimeout 200 for Cluster Synchronization Services.

## 修改网络心跳NHB misscount
[root@node1 ~]# crsctl set css misscount 30
CRS-4684: Successful set of parameter misscount to 30 for Cluster Synchronization Services.

## 修改磁盘心跳disktimeout
[root@node1 ~]# crsctl set css disktimeout 300

故障问题

脑裂:网络心跳misscount(私网不通)会导致的问题

由于网络心跳misscount会导致,每个节点都认为其他节点不存在了,这时候表决盘被引入,通过投票机制,获得最高票数或者最早到达的获得投票的,幸存,其他节点被踢出。在Oracle RAC中Voting Disk用来记录节点间成员的状态,出现脑裂时,仲裁哪个partition获得控制权,其他的partition被剔除,之后ORACLE RAC就会很不友善的给踢出去的机子重启,这就是为什么有时候机子会不断重启的原因。

集群的网络心跳丢失,但是磁盘心跳正常。当脑裂出现后,集群会分裂成为若干个子集群。对于这种情况的出现,集群需要进行重新配置。

重新配置的基本原则:节点数多的子集群存活,如果子集群包含的节点数相同,那么包含最小编号节点的子集群存活。

健忘

每个节点都有配置信息的拷贝,修改节点的配置信息出现不同步引起时,节点间配置不一致导致健忘的问题。

Oracle采用的方法就是把这个配置文件放在共享存储上(即是OCR Disk),整个集群只有一份配置,各节点共用这份配置,无论在哪个节点修改配置,都是修改相同的配置文件,这样就保证修改不会丢失。

ocrconfig -showbackup #来查看备份所在的文件和目录

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论