Skip to content

Oracle RAC节点故障处理最佳实践

生产场景案例

金融核心系统RAC节点故障

背景:某银行核心交易系统采用Oracle RAC 19c架构,在业务高峰期,其中一个节点突然崩溃,导致大量交易请求失败。

诊断过程

  1. 查看集群状态:crsctl status cluster 显示节点2状态为不可用
  2. 检查节点2的操作系统日志,发现"Kernel panic"错误
  3. 检查节点2的硬件监控,确认CPU温度过高导致自动关机
  4. 查看集群告警日志,发现CSS和CRS进程异常终止
  5. 检查其他节点状态,确认节点1正常运行,但负载明显增加

解决方案

  1. 立即通知硬件团队检查节点2的散热系统
  2. 手动将节点2从集群中隔离:crsctl stop crs -f -n node2
  3. 调整节点1的资源配置,增加SGA/PGA大小以处理额外负载
  4. 监控节点1的性能指标,确保交易处理正常
  5. 硬件团队修复散热问题后,重启节点2并重新加入集群:crsctl start crs

结果:业务在15分钟内恢复正常,节点2在2小时后重新加入集群,整个过程未造成数据丢失

电商平台RAC节点网络故障

背景:某电商平台使用Oracle RAC 21c架构,在大促期间,节点间私有网络突然中断,导致集群分裂。

诊断过程

  1. 查看集群状态:发现两个节点都认为自己是主节点
  2. 检查节点间通信:ping node1-priv 从node2失败
  3. 查看CSS日志:发现"Network communication failure"错误
  4. 使用cluvfy验证网络:cluvfy comp nodecon -n node1,node2 -verbose 显示私有网络连接失败
  5. 检查网络设备:发现私有网络交换机端口故障

解决方案

  1. 隔离故障交换机,切换到冗余私有网络
  2. 停止其中一个节点的Clusterware,避免脑裂:crsctl stop crs -f -n node2
  3. 重启健康节点的集群资源:crsctl start resource -all -n node1
  4. 修复交换机端口后,重启node2并重新加入集群
  5. 验证集群完整性:cluvfy comp cluster -verbose

结果:集群在30分钟内恢复正常,大促活动未受明显影响

RAC节点故障概述

Oracle Real Application Clusters (RAC) 是Oracle数据库的高可用性解决方案,允许多个数据库实例在不同的服务器节点上运行,共享同一套数据库文件。RAC节点故障是指其中一个或多个节点意外终止的情况,导致该节点上的数据库实例无法正常提供服务。RAC的设计目标是在节点故障时,其他节点能够接管故障节点的工作,确保数据库的高可用性。

常见症状

  • 节点上的Oracle实例突然终止
  • 集群中节点状态变为不可用
  • 应用程序连接到故障节点失败
  • 出现集群相关的错误,如ORA-29701: unable to connect to Cluster Synchronization Service
  • 集群告警日志中出现大量错误信息
  • 故障节点上的集群进程消失
  • 其他节点上的实例负载增加

常见故障原因

硬件故障

  • 服务器硬件故障,如CPU、内存、主板等
  • 磁盘故障,如本地磁盘损坏、磁盘控制器故障等
  • 电源故障,导致服务器意外关机
  • 网络故障,导致节点间通信中断
  • 存储故障,导致节点无法访问共享存储

软件故障

  • Oracle数据库软件bug
  • Oracle Clusterware软件bug
  • 操作系统故障或bug
  • 节点上的进程崩溃
  • 内存泄漏或内存损坏
  • 节点间通信故障

人为错误

  • 误操作,如误终止Oracle进程或集群进程
  • 错误的节点配置更改
  • 错误的数据库配置更改
  • 未经授权的节点访问

外部因素

  • 病毒或恶意攻击
  • 自然灾害,如火灾、水灾等
  • 数据中心故障
  • 网络分区,导致集群分裂

诊断方法

查看集群状态

使用CRSCTL工具查看集群的整体状态和各个节点的状态。

bash
# 查看集群整体状态
crsctl status cluster

# 查看特定节点的状态
crsctl status nodeapps -n <node_name>

# 查看集群资源状态
crsctl status resource -t

# 查看特定资源的状态
crsctl status resource <resource_name> -v

查看集群告警日志

集群告警日志包含了集群的运行状态和错误信息,是诊断RAC节点故障的重要依据。

bash
# 查看集群告警日志位置
crsctl get log home

# 查看集群告警日志内容
# Linux: tail -n 200 <cluster_alert_log_path>
# Windows: Get-Content -Path <cluster_alert_log_path> -Tail 200

查看节点本地日志

每个节点都有自己的本地日志,包括Oracle实例告警日志、Clusterware日志等。

bash
# 查看Oracle实例告警日志
# Linux: tail -n 200 <instance_alert_log_path>
# Windows: Get-Content -Path <instance_alert_log_path> -Tail 200

# 查看Clusterware日志
# Linux: tail -n 200 <crs_log_path>
# Windows: Get-Content -Path <crs_log_path> -Tail 200

# 查看CSS日志
# Linux: tail -n 200 <css_log_path>
# Windows: Get-Content -Path <css_log_path> -Tail 200

# 查看EVM日志
# Linux: tail -n 200 <evm_log_path>
# Windows: Get-Content -Path <evm_log_path> -Tail 200

检查节点间通信

RAC节点之间需要通过私有网络进行通信,节点间通信故障是导致RAC节点故障的常见原因之一。

bash
# 测试节点间的网络连通性
ping <remote_node_private_ip>

# 测试节点间的集群通信端口
# 测试CSS端口(默认1521, 1522)
telnet <remote_node_private_ip> 1521
telnet <remote_node_private_ip> 1522

# 测试GCS/GES端口
telnet <remote_node_private_ip> 49896
telnet <remote_node_private_ip> 49897

# 使用cluvfy工具验证节点间通信
cluvfy comp nodecon -n <node_list> -verbose

检查共享存储访问

RAC节点需要能够访问共享存储,共享存储故障可能导致节点故障。

bash
# 检查共享存储的可访问性
# Linux: ls -la <shared_storage_path>
# Windows: Get-ChildItem -Path <shared_storage_path>

# 使用asmcmd检查ASM磁盘组
asmcmd lsdg

# 检查ASM实例状态
sqlplus / as sysasm
SELECT instance_name, status FROM v$instance;
SELECT name, state FROM v$asm_diskgroup;

恢复解决方案

节点自动恢复

Oracle RAC设计了自动故障恢复机制,当节点故障时,Clusterware会自动尝试恢复故障节点上的资源。

bash
# 查看故障节点的资源状态
crsctl status resource -t

# 查看资源的自动恢复设置
crsctl status resource <resource_name> -p | grep AUTO_START

手动重启故障节点

如果节点无法自动恢复,可以尝试手动重启故障节点。

bash
# 重启故障节点的Clusterware
crsctl stop crs -f
crsctl start crs

# 或重启整个节点
# Linux: reboot
# Windows: Restart-Computer

手动启动节点上的资源

如果节点已启动,但资源未自动启动,可以手动启动资源。

bash
# 启动节点上的所有资源
crsctl start resource -all -n <node_name>

# 启动特定资源
crsctl start resource <resource_name> -n <node_name>

# 启动Oracle实例
srvctl start instance -d <db_name> -i <instance_name>

# 启动ASM实例
srvctl start asm -n <node_name>

处理节点脑裂

节点脑裂是指集群中的节点无法相互通信,导致集群分裂成多个子集群的情况。

bash
# 查看集群的投票盘状态
crsctl query css votedisk

# 查看集群的仲裁机制
crsctl get css votedisk

# 处理脑裂情况
# 1. 确定主集群和分裂集群
# 2. 停止分裂集群中的节点
# 3. 修复节点间通信问题
# 4. 重启分裂集群中的节点

故障节点的彻底恢复

如果节点故障无法通过简单的重启解决,需要进行彻底的恢复。

bash
# 1. 备份故障节点的重要数据和配置

# 2. 重新安装操作系统(如果需要)

# 3. 重新安装Oracle Grid Infrastructure
./runInstaller -silent -responseFile <response_file> -ignorePrereq

# 4. 加入现有集群
./addNode.sh -silent -responseFile <response_file>

# 5. 重新安装Oracle数据库软件
./runInstaller -silent -responseFile <response_file>

# 6. 添加数据库实例到节点
srvctl add instance -d <db_name> -i <instance_name> -n <node_name>

# 7. 启动实例和服务
srvctl start instance -d <db_name> -i <instance_name>
srvctl start service -d <db_name> -s <service_name> -i <instance_name>

预防措施

实施可靠的硬件和网络

  • 使用高质量的服务器硬件,确保硬件的可靠性
  • 配置冗余电源和风扇,提高硬件的可用性
  • 配置冗余网络,包括公共网络和私有网络
  • 使用高质量的网络设备,如交换机、路由器等
  • 配置网络冗余,如NIC bonding或team

优化Clusterware配置

  • 根据系统资源和业务需求,合理配置Clusterware参数
  • 配置适当的资源启动和关闭顺序
  • 配置适当的资源依赖关系
  • 配置适当的资源故障转移策略
  • 定期更新Clusterware软件,应用最新的补丁

监控RAC集群状态

  • 定期监控集群状态,包括节点状态、资源状态等
  • 监控节点间通信,确保节点间通信正常
  • 监控共享存储的访问情况,确保所有节点都能正常访问共享存储
  • 监控集群告警日志,及时发现和处理集群错误
  • 使用Oracle Enterprise Manager或其他监控工具,实时监控RAC集群状态

定期维护RAC集群

  • 定期更新数据库和Clusterware的统计信息
  • 定期重建索引,优化索引性能
  • 定期检查和修复数据库的块损坏
  • 定期进行数据库健康检查
  • 定期应用Oracle补丁,包括数据库补丁和Clusterware补丁

实施高可用架构

  • 使用Oracle Data Guard,实现数据库的灾难恢复
  • 配置自动故障切换,减少数据库 downtime
  • 实施异地灾备,确保数据的安全性和可用性
  • 配置适当的服务级别协议(SLA),确保数据库的可用性

培训和文档

  • 培训DBA和系统管理员,提高他们的RAC管理和故障处理能力
  • 建立完善的RAC运维文档,包括集群架构、配置、备份策略等
  • 制定详细的RAC节点故障恢复计划,并定期演练
  • 建立清晰的故障响应流程,确保在RAC节点故障时能够快速响应

Oracle 19c vs 21c RAC节点故障处理差异

特性Oracle 19cOracle 21c
集群恢复速度支持快速恢复优化了集群恢复算法,提高了恢复速度
节点故障检测支持增强了节点故障检测机制,提高了检测的准确性和速度
资源故障转移支持优化了资源故障转移策略,提高了故障转移的效率
集群诊断工具支持新增了更多的集群诊断工具和视图
集群监控支持增强了集群监控功能,提供了更详细的监控信息
自动恢复支持增强了自动恢复功能,提高了恢复的可靠性
节点添加和删除支持优化了节点添加和删除的流程,减少了操作时间
网络故障处理支持增强了网络故障检测和恢复机制
投票盘管理支持优化了投票盘的管理和使用
集群配置管理支持新增了集群配置自动备份和恢复功能

常见问题(FAQ)

如何快速定位RAC节点故障的原因?

快速定位RAC节点故障原因的步骤:

  1. 查看集群告警日志,查找故障节点的错误信息
  2. 查看节点本地的Oracle实例告警日志和Clusterware日志
  3. 检查节点间通信,确保网络正常
  4. 检查共享存储访问,确保所有节点都能正常访问共享存储
  5. 检查节点的硬件状态,如CPU、内存、磁盘等
  6. 检查节点的操作系统日志,查找操作系统相关的错误

RAC节点故障后,如何确保业务连续性?

确保RAC节点故障后业务连续性的方法:

  1. 配置适当的服务故障转移策略,确保服务能够自动转移到健康节点
  2. 配置客户端连接字符串,支持故障转移
  3. 实施负载均衡,确保健康节点能够处理额外的负载
  4. 定期测试故障转移功能,确保故障转移正常工作
  5. 监控健康节点的负载,及时调整资源配置

如何处理RAC节点无法加入集群的问题?

处理RAC节点无法加入集群的步骤:

  1. 检查节点间通信,确保网络正常
  2. 检查节点的Clusterware配置,确保配置正确
  3. 检查节点的操作系统版本和补丁级别,确保与其他节点一致
  4. 检查节点的Oracle软件版本和补丁级别,确保与其他节点一致
  5. 查看节点的Clusterware日志,查找详细的错误信息
  6. 根据错误信息,采取相应的解决措施,如修复网络、重新安装Clusterware等

如何监控RAC节点的状态?

监控RAC节点状态的方法:

  1. 使用crsctl命令定期检查节点和资源状态:crsctl status resource -t
  2. 使用srvctl命令检查Oracle实例和服务状态:srvctl status database -d <db_name>
  3. 使用Oracle Enterprise Manager或其他监控工具,实时监控RAC集群状态
  4. 设置集群告警,当节点状态变化时触发告警
  5. 定期生成和分析AWR报告,查找集群性能问题

如何优化RAC节点的故障恢复时间?

优化RAC节点故障恢复时间的方法:

  1. 配置适当的资源自动启动和故障转移策略
  2. 优化Clusterware配置,减少资源启动时间
  3. 确保节点间通信和共享存储访问的性能良好
  4. 定期维护节点,确保节点的健康状态
  5. 制定详细的故障恢复计划,并定期演练
  6. 培训相关人员,提高他们的故障处理能力

如何防止RAC节点故障?

防止RAC节点故障的方法:

  1. 使用高质量的硬件和网络设备
  2. 优化Clusterware和数据库配置
  3. 定期监控和维护RAC集群
  4. 定期应用Oracle补丁,包括数据库补丁和Clusterware补丁
  5. 实施高可用架构,如Oracle Data Guard
  6. 培训相关人员,提高他们的RAC管理和故障处理能力

Oracle 21c中新增了哪些RAC节点故障处理功能?

Oracle 21c中新增的RAC节点故障处理功能:

  1. 增强的自动诊断功能,能够自动分析节点故障原因
  2. 优化的集群恢复算法,提高了恢复速度
  3. 新增的集群配置自动备份和恢复功能
  4. 增强的网络故障检测和恢复机制
  5. 优化的投票盘管理,提高了集群的可靠性
  6. 新增的集群诊断视图,提供了更详细的故障信息

如何在RAC环境中配置服务故障转移?

在RAC环境中配置服务故障转移的步骤:

  1. 创建服务时指定故障转移策略:srvctl add service -d <db_name> -s <service_name> -r <preferred_instances> -a <available_instances> -P BASIC
  2. 配置故障转移类型:srvctl modify service -d <db_name> -s <service_name> -e SELECT -f
  3. 配置故障转移重试次数和间隔:srvctl modify service -d <db_name> -s <service_name> -z 180 -w 5
  4. 验证服务配置:srvctl config service -d <db_name> -s <service_name>
  5. 测试故障转移功能:手动停止一个实例,检查服务是否转移到其他实例

最佳实践

  • 实施可靠的硬件和网络:确保服务器、网络和存储设备的可靠性
  • 优化Clusterware配置:根据系统资源和业务需求,合理配置Clusterware参数
  • 监控RAC集群状态:实时监控集群的节点状态、资源状态和性能指标
  • 定期维护RAC集群:定期更新统计信息、重建索引、检查块损坏等
  • 实施高可用架构:使用Oracle Data Guard,实现数据库的灾难恢复
  • 配置适当的服务故障转移策略:确保服务能够自动转移到健康节点
  • 制定详细的故障恢复计划:包括节点故障、资源故障和集群分裂等情况
  • 培训相关人员:提高DBA和系统管理员的RAC管理和故障处理能力
  • 定期演练故障恢复计划:验证故障恢复计划的有效性,提高恢复的效率和可靠性
  • 定期更新Oracle软件:应用最新的补丁,修复已知的bug和安全漏洞

总结

RAC节点故障是Oracle RAC环境中常见的故障之一,对数据库的可用性造成影响。通过掌握RAC节点故障的常见原因、诊断方法和恢复解决方案,DBA可以快速定位和解决RAC节点故障,确保数据库尽快恢复正常运行。同时,通过实施预防措施,如可靠的硬件和网络、优化的Clusterware配置、定期的监控和维护等,可以降低RAC节点故障的发生率,提高RAC集群的可用性和可靠性。在实际生产环境中,DBA需要定期监控RAC集群状态,优化集群配置,制定详细的故障恢复计划,并定期演练,确保在RAC节点故障时能够快速响应和恢复,最大限度地减少数据库 downtime,保障业务的连续性。