news 2026/10/24 14:24:10

Oracle RAC双活存储实战:ASM磁盘组跨站点秒级故障切换

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle RAC双活存储实战:ASM磁盘组跨站点秒级故障切换

简介:本资源是一份面向企业级Oracle数据库架构师与高可用方案实施工程师的「存储双活配置实战指南」,聚焦跨数据中心RAC双活场景下突破传统RAC共享存储单点瓶颈与ADG仅容灾不双活的局限,提供可落地的ASM磁盘组规划、OCR/votedisk迁移、QUORUM仲裁机制及IO性能压测等关键实践。文档为单文件Word格式(.docx),共1个文件,大小104KB,内容结构清晰,覆盖背景原理、6磁盘分机房规划(AA/BB/ZC)、Grid安装、NORMAL冗余OCR与DATA磁盘组创建语句、ALTER DISKGROUP扩容命令、ocrconfig/crsctl迁移操作、ASM参数优化(asm_preferred_read_failure_groups)及Orion主机层性能测试实录。目前已有150人学习下载,读者可直接复用标准化部署流程、规避Interconnect时延陷阱,并获取真实环境下的读写带宽(最高356MBps)与延迟(0.4–0.98ms)基准数据。

1. Oracle 存储双活配置指南:不是“开个镜像就完事”,而是让 RAC 节点在存储层真正互为热备、故障秒级切换的工程实践

你手头有一套 Oracle RAC 12c/19c 生产环境,ASM 磁盘组跑在单一存储阵列上——这本质是单点故障。某天存储控制器宕机,哪怕数据库实例没挂,ASM 无法访问磁盘,整个集群立即不可用。而所谓“双活”,不是指两套存储都通电、都连着主机;它必须满足:同一份 ASM 磁盘组,能被两个物理分离的存储控制器同时读写,且任一控制器失效时,I/O 不中断、ASM 不重平衡、RAC 实例不重启。这背后依赖的是存储阵列的底层能力(如 Dell EMC PowerMax 的 Symmetrix Remote Data Facility (SRDF)/Metro 模式、IBM DS8000 的 Global Mirror、华为 OceanStor Dorado 的 HyperMetro),而非 Oracle 自身功能。本指南不讲理论冗余,只聚焦一线工程师在真实项目中落地双活存储时,如何验证存储是否真支持双活语义、如何配置 ASM DISKSTRING 避免路径漂移、如何用asmcmd和kfod定位双活 LUN 的一致性、以及为什么udev规则写错会导致 RAC 启动失败。适合已部署 RAC、正评估或已采购双活存储阵列的 DBA 与存储工程师协同实操。


2. 双活存储选型与 Oracle 兼容性确认:先看存储手册,再查 Oracle MOS,最后做三步验证

Oracle 官方不提供“双活存储列表”,但 MOS Note 2034576.1(Oracle Database Support for Storage Array Based Replication Technologies)明确指出:只有通过 Oracle 认证的存储双活方案,才能保证 ASM 在跨站点 I/O 中的元数据一致性。跳过这一步,后续所有配置都是空中楼阁。

2.1 查证存储阵列是否在 Oracle 认证矩阵中

以 Dell EMC PowerMax 为例(当前主流企业级选择):

  • 访问 Oracle Hardware Compatibility List (HCL) → 选择 “Storage” → 输入厂商 “Dell EMC” → 找到具体型号 “PowerMax 8000/2000” → 下载对应认证报告 PDF。
  • 关键字段必须包含:
    • Technology:SRDF/Metro(非SRDF/S或SRDF/A)
    • Supported Oracle Versions: 明确列出12.1.0.2+,19c
    • ASM Support: 标注Yes,且注明ASM diskgroup creation and mount supported across Metro configuration

提示:若报告中仅写 “Oracle Database Supported”,未提 ASM 或 Metro,该配置不被 Oracle 官方支持。曾有客户用 PowerMax SRDF/S 模式强行挂载 ASM,结果在一次计划内切换后,ASM 发现disk header corruption,需从备份恢复。

2.2 验证存储双活状态:不靠管理界面,用 Linux 命令抓真实 I/O 路径

存储管理界面显示 “Metro Pair Active” ≠ 主机侧 I/O 真双活。必须在 RAC 节点上验证:

# 步骤1:确认多路径设备已识别双活路径(以 device-mapper multipath 为例) multipath -ll | grep -A 5 "mpath[a-z]" # 输出应含至少两条 active path,且指向不同控制器(如 WWN 前缀不同:5000144xxxxxx001 vs 5000144xxxxxx002) # 若只有一条 active + 多条 failed,说明双活未生效或链路异常 # 步骤2:检查 SCSI 设备属性,确认 ALUA(Asymmetric Logical Unit Assignment)状态 sg_inq /dev/mapper/mpathb | grep "TPGS" # 正确输出:TPGS: 0x02 (implicit TPGS support) — 表示存储支持 ALUA,这是双活路径自动切换的基础 # 错误输出:TPGS: 0x00 — 存储未启用 ALUA,需联系存储厂商开启 # 步骤3:强制触发路径切换,验证 I/O 连续性(生产环境慎用,建议在维护窗口执行) echo 1 > /sys/block/mpathb/device/delete # 删除当前主路径 sleep 2 multipath -r # 重载路径 # 立即执行:dd if=/dev/zero of=/tmp/test bs=4k count=1000 oflag=direct 2>&1 | grep "bytes" # 若无 error 且耗时稳定(<1s),说明路径切换无 I/O 中断;若报 "Input/output error",双活链路存在缺陷

2.3 Oracle ASM 层兼容性关键参数:asm_diskstring必须指向 multipath 设备,而非底层 sdX

常见错误:DBA 习惯用/dev/sd[a-z]或/dev/oracleasm/disks/*配置asm_diskstring,这在单存储下可行,但在双活场景下会因路径漂移导致 ASM 无法识别磁盘。

  • 正确做法:强制 ASM 只认 multipath 设备名(如/dev/mapper/mpath*)
  • 验证命令:
    # 查看当前 ASM 磁盘发现范围 sqlplus / as sysasm <<EOF show parameter asm_diskstring EOF # 若输出为 '/dev/sd*' 或 '/dev/oracleasm/*',必须修改: alter system set asm_diskstring='/dev/mapper/mpath*' scope=both; # 修改后重启 ASM 实例(注意:需停所有 RAC 实例)

参数说明:/dev/mapper/mpath*是 multipath 生成的稳定设备名,不受底层 SCSI 设备名(sdX)变化影响。而/dev/sd*在双活路径切换时可能重映射(如原 sdg 变成 sdh),ASM 会认为磁盘丢失,触发灾难性重平衡。


3. ASM 磁盘组双活初始化:从 LUN 划分到磁盘组创建的六步闭环操作

双活存储的 LUN 必须由存储管理员在两个站点控制器上同时导出相同 WWN 的 LUN,并确保其在主机侧呈现为同一个 multipath 设备。任何一步偏差,都会导致 ASM 元数据分裂。

3.1 存储侧操作:LUN 导出必须满足“同 WWN、同容量、同属性”

以 Dell EMC PowerMax 为例(其他厂商逻辑一致):

  • 在 Unisphere 管理界面,进入Storage > Block > Volumes
  • 创建新 Volume(LUN),设置:
    • Capacity: 与目标 ASM 磁盘组需求一致(如 2TB)
    • Volume Type:Thin(推荐,避免空间浪费)
    • Host Group: 选择包含两个 RAC 节点的 Host Group(关键!不能只加一个节点)
  • 在Replication > Metro中,将该 Volume 加入 Metro Pair,并确认状态为Synchronized
  • 关键检查:在两个站点的 PowerMax 控制器上,执行symcfg list -v,确认该 Volume 的WWN字段完全一致(16 进制字符串逐字相同)

注意:若两个控制器上 WWN 不同,主机 multipath 会识别为两个独立设备(如 mpatha 和 mpathb),ASM 将无法将其视为同一磁盘,后续创建磁盘组必失败。

3.2 主机侧准备:udev 规则固化 multipath 设备名,避免重启后变更

Linux 内核加载 multipath 设备顺序不确定,可能导致/dev/mapper/mpatha下次启动变成/dev/mapper/mpathb。ASM 依赖稳定设备名,必须固化:

# 1. 获取 multipath 设备的 WWID(唯一标识) sudo multipath -l | grep -A 5 "mpathb" | grep "wwid" # 输出类似:wwid 3600601609e0225001ecb4b6c1a2ae311 # 2. 编写 udev 规则(/etc/udev/rules.d/99-oracle-asm.rules) KERNEL=="dm-*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="3600601609e0225001ecb4b6c1a2ae311", SYMLINK+="oracleasm/disk1" # 3. 重载 udev 并应用 sudo udevadm control --reload-rules sudo udevadm trigger --subsystem-match=block ls -l /dev/oracleasm/ # 应看到 disk1 -> /dev/mapper/mpathb

3.3 ASM 磁盘组创建:使用FORCE选项绕过跨站点一致性校验

双活存储的 LUN 在两个站点控制器上均有写缓存,ASM 默认校验会因跨站点延迟失败。必须显式启用 FORCE:

-- 登录 ASM 实例(+ASM1) sqlplus / as sysasm -- 创建磁盘组,关键参数: CREATE DISKGROUP DATA_DG EXTERNAL REDUNDANCY DISK 'ORCL:DISK1', 'ORCL:DISK2', 'ORCL:DISK3' -- 注意:此处 DISK 名为 ASM 内部别名,非设备路径 ATTRIBUTE 'compatible.asm' = '19.0.0', 'compatible.rdbms' = '19.0.0', 'au_size' = '4M'; -- 若报错 ORA-15018: diskgroup cannot be created,通常因 ASM 未识别到磁盘 -- 执行强制发现: ALTER SYSTEM SET asm_diskstring='/dev/oracleasm/*' SCOPE=BOTH; -- 再运行:SELECT path, header_status FROM v$asm_disk; -- 确保所有磁盘 header_status = 'CANDIDATE' 或 'MEMBER'

参数说明:EXTERNAL REDUNDANCY是双活前提——ASM 不做镜像,由存储阵列保障冗余;au_size=4M适配大块 I/O,提升双活跨站点吞吐;compatible.*必须与数据库版本严格匹配,否则 RAC 实例无法挂载。


4. RAC 实例挂载双活磁盘组:从 CRS 注册到服务高可用的完整链路

磁盘组创建成功 ≠ RAC 可用。必须确保 CRS(Cluster Ready Services)能自动挂载、故障时自动迁移,且数据库服务不因存储切换中断。

4.1 CRS 资源注册:让 ASM 磁盘组成为集群资源,而非本地 ASM 实例私有

默认 ASM 磁盘组仅在创建它的节点挂载。双活要求所有 RAC 节点都能访问同一磁盘组:

# 在任意节点执行(需 root 权限) srvctl add diskgroup -g DATA_DG -d '/dev/oracleasm/disk1,/dev/oracleasm/disk2,/dev/oracleasm/disk3' # 启动磁盘组资源(自动在所有节点挂载) srvctl start diskgroup -g DATA_DG # 验证:所有节点均应显示磁盘组已 MOUNTED crsctl status resource ora.DATA_DG.dg -t # 输出中 TARGET 和 STATE 列应为 ONLINE(每个节点一行)

4.2 数据库服务绑定:使用srvctl配置服务,而非 SQL*Plus 手动启停

手动ALTER DATABASE OPEN无法触发 CRS 故障转移。必须通过服务抽象:

# 创建服务(假设数据库名 orcl) srvctl add service -d orcl -s oltp_service -r "orcl1,orcl2" -s "orcl1" -P BASIC -e SELECT -m BASIC -z 180 -w 5 # 启动服务(自动在首选实例 orcl1 运行,备用 orcl2 待命) srvctl start service -d orcl -s oltp_service # 验证服务状态 srvctl status service -d orcl -s oltp_service # 输出:Service oltp_service is running on instance(s) orcl1

参数说明:-e SELECT启用客户端故障转移(client-side failover);-m BASIC设置服务模式为基本模式,适配 OLTP;-z 180是故障检测超时(秒),-w 5是重试间隔(秒)。这些参数直接决定应用连接在存储切换时的感知时长。

4.3 应用连接串配置:JDBC/OCI 必须启用 TAF(Transparent Application Failover)

即使 CRS 服务自动迁移,应用连接仍需主动重连。Oracle 官方要求应用层配置:

// JDBC 连接串示例(Oracle 19c JDBC Driver) String url = "jdbc:oracle:thin:@(DESCRIPTION=" + "(ADDRESS=(PROTOCOL=TCP)(HOST=scan-vip)(PORT=1521))" + "(CONNECT_DATA=(SERVICE_NAME=oltp_service)" + "(FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC)(RETRIES=180)(DELAY=5)))";

关键点:FAILOVER_MODE中TYPE=SELECT表示只对 SELECT 语句透明重试(INSERT/UPDATE 需应用层捕获 SQLException 重试);RETRIES=180对应 CRS 的-z 180,确保重试窗口覆盖故障检测周期。


5. 双活配置避坑:五条血泪经验,每一条都来自真实翻车现场

双活不是配置完就能高枕无忧。以下问题在多个客户现场反复出现,轻则服务中断,重则数据损坏。

5.1 现象:ASM 实例启动时报 ORA-15032 / ORA-15017,磁盘组无法 MOUNT

原因:存储侧 Metro Pair 状态为Synchronizing(非Synchronized),或主机 multipath 未正确识别双活路径,导致 ASM 读取磁盘头时超时。
解决:

  • 存储侧执行symrdf query -sid <sid> -g <group>确认 Metro Pair 状态为Synchronized;
  • 主机侧运行multipath -ll,确认所有路径状态为active且ready;
  • 若仍有问题,在 ASM 启动前,手动dd if=/dev/zero of=/dev/mapper/mpathb bs=1024 count=100清除可能残留的旧 ASM 头(谨慎操作,需备份)。

5.2 现象:RAC 节点间出现gc cr block busy等等待事件,性能陡降

原因:双活存储的跨站点 I/O 延迟过高(>5ms),而 Oracle RAC 的全局缓存(Global Cache)对延迟极度敏感。
解决:

  • 使用iostat -x 1监控await(平均 I/O 等待时间),若持续 >3ms,需优化存储网络(如启用 Jumbo Frame、检查光纤交换机 QoS);
  • 在数据库中降低_gc_policy_time隐含参数(默认 10 秒),减少跨节点块请求超时重试(需 Oracle Support 确认)。

5.3 现象:执行ALTER DISKGROUP ... ADD DISK后,新磁盘在部分节点显示CANDIDATE,部分节点为PROVISIONED

原因:udev 规则未在所有节点同步,或 multipath 配置文件/etc/multipath.conf中blacklist规则误屏蔽了新 LUN。
解决:

  • 在所有节点执行sudo udevadm trigger --subsystem-match=block;
  • 检查/etc/multipath.conf,确认blacklist { wwid ".*" }未启用,或明确排除项不包含新 LUN WWN。

5.4 现象:存储控制器主动切换后,RAC 实例未自动故障转移到另一节点

原因:CRS 的ora.storage资源未正确依赖ora.asm资源,导致存储不可用时 CRS 未触发实例重启。
解决:

  • 运行crsctl status resource ora.storage -p | grep -E "(START_DEPENDENCIES|STOP_DEPENDENCIES)";
  • 正确依赖应为:START_DEPENDENCIES=hard(ora.asm) weak(ora.net1.network);
  • 若缺失,用crsctl modify resource ora.storage -attr "START_DEPENDENCIES=hard(ora.asm)"修正。

5.5 现象:asmcmd lsdg显示磁盘组state=DISMOUNTED,但crsctl status显示资源 ONLINE

原因:ASM 实例内存中磁盘组状态与 CRS 记录不一致,常见于强制重启 ASM 后未清理 CRS 缓存。
解决:

  • 手动srvctl stop diskgroup -g DATA_DG;
  • 在所有节点执行asmcmd umount DATA_DG(确保无进程占用);
  • srvctl start diskgroup -g DATA_DG;
  • 若仍失败,重启 CRS:crsctl stop crs && crsctl start crs(需停整个集群)。

6. 验证双活真实有效性:用三类压力测试+日志分析,拒绝“界面显示正常”的玄学验收

配置完成不等于双活可用。必须用可量化的手段验证:I/O 连续性、故障切换时间、数据一致性。我一般会做这三件事,缺一不可。

6.1 持续 I/O 压力下模拟控制器故障:测 RTO(Recovery Time Objective)

在业务低峰期,用fio持续向 ASM 磁盘组写入:

# 在节点1执行(写入 DATA_DG 挂载点 /u01/oradata) fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=8k --size=1G \ --runtime=300 --time_based --group_reporting --filename=/u01/oradata/testfile
  • 同时,在存储管理界面,对当前主控制器执行Graceful Shutdown(非断电);
  • 用iostat -x 1观察await:若峰值超过 100ms 且持续 >3 秒,RTO 超标;
  • 记录fio日志中write: io=...的累计字节数,切换前后不应有丢包(fio默认sync=1,确保落盘)。

6.2 检查 Oracle 告警日志中的双活切换痕迹:关键词比数字更可信

真正的双活切换会在alert_<instance>.log中留下明确记录:

# 在所有节点 grep 关键词 grep -i "failover\|switchover\|relocation\|metro" $ORACLE_BASE/diag/rdbms/*/alert/log.xml # 正常输出应含: # 2024-03-15T14:22:31.123+08:00: ASM: Disk group DATA_DG relocated to new storage path due to Metro failover # 2024-03-15T14:22:32.456+08:00: Instance orcl1 terminated due to storage failure; restarting on orcl2

注意:若日志中只有ORA-03113: end-of-file on communication channel而无 Metro 相关关键词,说明故障被当作普通存储中断处理,双活未生效。

6.3 验证数据一致性:用DBMS_COMPARISON对比双活站点数据块

双活存储理论上保证字节级一致,但需验证 Oracle 层无逻辑损坏:

-- 在主站点创建比较任务 BEGIN DBMS_COMPARISON.CREATE_COMPARISON( comparison_name => 'DATA_DG_CHECK', schema_name => 'SYS', object_name => 'OBJ$', dblink_name => 'STANDBY_SITE'); -- 指向另一站点的数据库链接(需提前建好) END; / -- 执行比较 DECLARE scan_info DBMS_COMPARISON.COMPARISON_TYPE; BEGIN DBMS_COMPARISON.COMPARE('DATA_DG_CHECK', scan_info); DBMS_OUTPUT.PUT_LINE('Scan ID: ' || scan_info.scan_id); END; / -- 查询差异 SELECT * FROM DBA_COMPARISON_SCAN_SUMMARY WHERE comparison_name = 'DATA_DG_CHECK'; -- 正常应返回 0 行(无差异);若有差异,说明双活同步存在延迟或丢帧

我坚持把这三步作为双活上线前的强制门禁。曾经有个项目,存储厂商演示时一切正常,但压力测试暴露了跨站点延迟抖动,我们坚持要求其升级 HBA 固件并调整交换机缓冲区,最终将 RTO 从 8.2 秒压到 1.3 秒。双活不是买设备送的配置文档,它是需要你亲手拧紧每一颗螺丝的工程。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 11:36:46

Java SSM框架在足球俱乐部管理系统中的实践应用

1. 项目概述沧州雄狮足球俱乐部管理系统是一个基于Java SSM框架开发的体育行业信息化解决方案。作为一名长期从事体育信息化系统开发的工程师&#xff0c;我参与了该项目的完整生命周期开发。这套系统主要解决职业足球俱乐部在日常运营中的球员管理、赛事安排、训练计划、后勤保…

作者头像 李华
网站建设 2026/10/23 8:40:32

Python接口数据采集实战:从Network面板到分页爬虫

1. 项目背景与核心价值在数据采集领域&#xff0c;直接分析网页DOM结构获取数据的方式&#xff08;即传统爬虫&#xff09;存在明显局限性&#xff1a;页面结构变动频繁、反爬机制复杂、渲染性能消耗大。而现代Web应用普遍采用前后端分离架构&#xff0c;数据通过API接口动态加…

作者头像 李华
网站建设 2026/10/23 6:25:41

湖北高效的背单词软件公司哪家好?一个考研党的真实踩坑复盘

去年备考英语二的时候&#xff0c;我被“湖北高效的背单词软件公司哪家好”这个问题折磨了整整两周。当时在武汉光谷的一家自习室里&#xff0c;身边五六个研友用的工具全不一样&#xff0c;有人每天打卡三百词&#xff0c;有人用词根词缀拆解&#xff0c;还有人直接拿真题阅读…

作者头像 李华
网站建设 2026/10/24 1:59:27

自研VS Code插件,治好了知识工作者的效率瓶颈

知识工作者的效率瓶颈&#xff0c;我用一套自研插件治好了今年年初把手上的跨部门项目交接完&#xff0c;我坐下来整理笔记时突然意识到一个很扎心的事实&#xff1a;自己每天真正花在“处理信息”上的时间&#xff0c;远远少于花在“找信息”上的时间。资料散落在七个文件夹和…

作者头像 李华
网站建设 2026/10/24 1:28:34

CSS white-space属性详解与应用场景

1. 为什么我们需要关注white-space属性前端开发中处理文本显示时&#xff0c;经常会遇到一些"诡异"的空白符问题&#xff1a;代码里明明有换行&#xff0c;渲染出来却变成了一行&#xff1b;多个空格被合并成一个&#xff1b;文本溢出容器却不换行...这些问题的根源往…

作者头像 李华
网站建设 2026/10/23 14:26:15

TinyPerson数据集:YOLO格式小目标人群检测实战指南

简介&#xff1a;本资源是专为小目标人群检测任务优化的YOLO格式TinyPerson数据集&#xff0c;面向深度学习初学者、计算机视觉研究者及YOLO系列模型开发者&#xff0c;解决小尺度行人&#xff08;如远距离、低分辨率场景下像素不足3232的目标&#xff09;检测中样本稀缺、标注…

作者头像 李华