一、开篇RAC架构的核心挑战某金融核心系统部署了4节点Oracle RAC集群。某天凌晨节点3与内网交换机之间的网线松动导致节点3与其他节点的心跳通信中断。font color#D32F2F节点3认为自己仍然存活试图继续访问共享存储。其他3个节点通过Voting Disk投票将节点3驱逐出集群并强制重启避免了数据损坏。这就是RAC的脑裂处理机制。/fontfont color#1976D2RAC是Oracle最高级别的高可用架构允许多个实例同时访问同一套数据文件。但多节点共享数据的架构带来了复杂的协调问题——节点间的Cache Fusion、全局资源管理、脑裂处理、节点驱逐——这些都是RAC DBA必须深入理解的核心机制。/font本篇文章聚焦RAC的三大核心挑战脑裂处理、节点驱逐和实例恢复帮助你深入理解RAC的故障处理机制。二、RAC心跳机制全景图驱逐处理故障检测RAC集群心跳体系是否是否集群心跳 Cluster Heartbeat网络心跳 Network Heartbeat磁盘心跳 Disk Heartbeat私有网络-Private InterconnectCSSD进程监控每秒发送心跳包Voting Disk表决磁盘CSSD进程定期写入每秒更新磁盘心跳网络心跳丢失?检查磁盘心跳集群正常磁盘心跳正常?网络故障-不驱逐节点无响应-触发驱逐Voting Disk投票多数节点胜出少数节点重启存活节点接管关键机制解读font color#D32F2F红色节点驱逐触发/font 网络心跳和磁盘心跳都丢失时触发节点驱逐。font color#F57C00橘色节点Voting Disk投票/font 通过表决磁盘进行多数仲裁解决脑裂。font color#D32F2F红色节点少数节点重启/font 被驱逐的节点强制重启防止数据损坏。三、脑裂Split Brain深度解析1. font color#D32F2F脑裂的本质定义/font精确描述脑裂是指RAC集群中的节点间通信中断导致集群分裂为两个或多个子集群。font color#D32F2F每个子集群都认为自己是唯一的幸存者试图接管共享存储的访问权。如果不加控制多个节点同时写入同一数据块会导致数据损坏。/font脑裂的典型场景4节点RAC集群Node1, Node2, Node3, Node4 内网交换机故障Node1Node2 与 Node3Node4 通信中断 子集群ANode1 Node22票 子集群BNode3 Node42票 如果没有Voting Disk仲裁两个子集群都会尝试接管数据库2. font color#F57C00Voting Disk表决磁盘/font精确描述Voting Disk是解决脑裂的核心机制。font color#1976D2Voting Disk存储在共享存储上每个节点定期写入心跳信息。当网络心跳丢失时节点通过Voting Disk进行“投票”——获得多数Voting Disk访问权的子集群胜出。/fontVoting Disk配置要求| 要求 | 说明 ||------|------|| 数量 | 必须为奇数1、3、5... || 存储位置 | 共享存储ASM磁盘组或NFS || 最少数量 | font color#D32F2F至少3个单点故障容忍/font |查看Voting Disk信息crsctl query css votedisk输出示例## STATE File Universal Id File Name Disk group -- ----- ----------------- --------- --------- 1. ONLINE 1234567890abcdef... (DATA) [DATA] 2. ONLINE 2345678901abcdef... (DATA) [DATA] 3. ONLINE 3456789012abcdef... (FRA) [FRA]3. font color#1976D2脑裂处理的完整流程/fontVoting DiskNode4-子集群BNode3-子集群BNode2-子集群ANode1-子集群AVoting DiskNode4-子集群BNode3-子集群BNode2-子集群ANode1-子集群A内网交换机故障集群分裂子集群A继续服务实例恢复Node3/Node4的事务检测到Node3/Node4心跳丢失检测到Node1/Node2心跳丢失尝试获取Voting Disk锁尝试获取Voting Disk锁子集群A获得2个Voting Disk锁子集群B获得1个Voting Disk锁子集群A获胜-继续运行子集群B失败-触发自重启CSSD执行rebootCSSD执行reboot关键原则font color#D32F2F必须保证只有一个子集群能访问共享存储。/font获得多数Voting Disk票数的子集群胜出。失败的子集群被强制重启STONITH - Shoot The Other Node In The Head。重启后的节点需要重新加入集群。四、节点驱逐Node Eviction深度解析1. font color#D32F2F节点驱逐的触发条件/font精确描述节点驱逐是CSSDCluster Synchronization Services Daemon进程检测到节点无响应后将其强制移出集群的机制。font color#1976D2驱逐的目的是防止故障节点继续访问共享存储导致数据损坏。/font触发节点驱逐的情况| 情况 | 说明 | 典型原因 ||------|------|----------|| 网络心跳丢失磁盘心跳丢失 | 双重心跳都丢失 | 服务器hang住 || CSSD进程hang住 | CSSD无法响应 | OS调度问题 || 磁盘I/O超时 | Voting Disk无法访问 | 存储故障 || ORA-29740 | 节点被驱逐的标准错误 | 各种原因 |2. font color#F57C00节点驱逐的时间参数/font关键参数| 参数 | 含义 | 默认值 | 建议值 ||------|------|--------|--------|| CSS_MISSCOUNT | 网络心跳丢失超时 | 30秒 | 30-60秒 || DISKTIMEOUT | 磁盘心跳超时 | 200秒 | 200-300秒 || REBOOTTIME | 驱逐后重启等待时间 | 3秒 | 3秒 |-- 查看CSS参数 crsctl get css misscount crsctl get css disktimeout crsctl get css reboottimefont color#D32F2F注意不要随意调整这些参数过小的值会导致误驱逐过大的值会延长故障恢复时间。/font3. font color#1976D2被驱逐节点的状态变化/font是否是否节点正常运行心跳开始丢失CSSD检测到异常心跳超时?触发Voting Disk投票获得多数票?继续运行-驱逐其他节点被驱逐CSSD执行reboot节点重启OHASD启动尝试重新加入集群集群服务恢复4. font color#388E3C节点驱逐后的实例恢复/font精确描述节点被驱逐后其上的Oracle实例也会崩溃。幸存节点上的SMON进程自动执行实例恢复font color#1976D2读取被驱逐节点的联机重做日志前滚已提交事务回滚未提交事务。/font-- 查看实例恢复进度 SELECT inst_id, recovery_estimate_seconds FROM gv$instance_recovery; -- 查看恢复相关等待事件 SELECT event, total_waits, time_waited_micro/1000000 AS seconds_waited FROM v$system_event WHERE event LIKE %recovery% ORDER BY time_waited_micro DESC;五、RAC故障诊断实战1. font color#1976D2查看集群状态/font# 查看集群整体状态 crsctl check cluster -all # 查看集群资源状态 crsctl status resource -t # 查看CSSD进程状态 crsctl check css # 查看节点状态 olsnodes -n -i -s2. font color#F57C00分析节点驱逐日志/font关键日志文件| 日志文件 | 路径 | 内容 ||----------|------|------|| CSSD日志 | $GI_HOME/log/hostname/cssd/cssd.log | CSSD进程日志 || alert日志 | $DIAG_DEST/diag/rdbms/db/inst/trace/alert_inst.log | 实例日志 || CRSD日志 | $GI_HOME/log/hostname/crsd/crsd.log | CRSD进程日志 || OPROCD日志 | $GI_HOME/log/hostname/cssd/oproc/ | 进程监控日志 |查找驱逐原因# 在CSSD日志中搜索驱逐关键字 grep -i evict\|remove\|kill\|reboot cssd.log | tail -20 # 在alert日志中搜索实例崩溃原因 grep -i ORA-29740\|terminating\|instance alert_ORCL1.log | tail -203. font color#388E3C常见节点驱逐原因/font| 原因 | 日志关键字 | 解决方案 ||------|-----------|----------|| 网络心跳丢失 |missing disk ping| 检查内网交换机 || 磁盘I/O超时 |disk timeout| 检查存储性能 || CSSD进程hung |cssd hang| 检查OS调度 || OPROCD检测失败 |oprocd| 检查CPU负载 || 内存耗尽 |Out of Memory| 增大物理内存 |六、RAC最佳实践1. font color#1976D2Voting Disk配置最佳实践/font至少配置3个Voting Disk。分布在不同的磁盘组或存储设备上。定期验证Voting Disk的可访问性。crsctl query css votedisk # 确保所有Voting Disk状态为ONLINE2. font color#F57C00心跳网络最佳实践/font使用专用私有网络Private Interconnect。配置冗余网络Bonding/Teaming。使用高速网络10GbE或InfiniBand。使用Jumbo FrameMTU9000。# 查看私有网络配置 oifcfg getif # 测试私有网络延迟 ping -c 100 private_ip3. font color#388E3C定期健康检查/font# 检查集群健康状态 cluvfy comp healthcheck -collect cluster # 检查OCR和Voting Disk ocrcheck crsctl query css votedisk # 检查所有资源状态 crsctl status resource -t七、总结记住这个“投票”类比就够了font color#1976D2【RAC脑裂处理是少数服从多数的投票机制】/font网络心跳font color#1976D2人与人之间的语言交流。/font磁盘心跳font color#F57C00每个人在投票箱Voting Disk中的签到记录。/font脑裂font color#D32F2F一群人被关在不同的房间彼此无法交流但都认为自己才是唯一的决策者。/fontVoting Disk投票font color#1976D2打开投票箱数票多数人支持的一方获胜。/font节点驱逐font color#D32F2F少数派被强行请出会议室强制重启防止他们干扰决策。/font实例恢复font color#388E3C被请出去的人留下的工作由会议室里的人继续完成。/fontfont color#1976D2理解RAC的脑裂处理和节点驱逐机制是管理RAC集群的核心能力。合理的Voting Disk配置、稳定的私有网络、及时的日志分析是预防和处理RAC故障的关键。/font你的生产环境遇到过节点驱逐的情况吗是如何分析和解决的欢迎评论区分享你的经验。