Oracle RAC ASM磁盘组冗余模式如何选择与配置?

来源:APP编程网作者:风铃头衔:草根站长
导读:本期聚焦于风铃创作的《Oracle RAC ASM磁盘组冗余模式如何选择与配置?》,敬请观看详情。规划Oracle RAC存储架构时,ASM磁盘组的冗余级别决定了数据副本数量和故障容忍能力,但外部冗余、常规冗余和高冗余三种模式的适用场景经常被混淆。外部冗余依赖底层存储阵列的RAID保护,常规冗余提供双向镜像,高冗余则实现三向镜像。DBA在规划RAC存储时,往往只关注容量和性能,却忽略了冗余模式与故障恢复能力之间的关联,导致节点或磁盘故障时出现数据不可用。本文从三种冗余模式的工作原理出发,结合RAC环境的故障域特性,详细说明如何通过SQL命令和asmcmd工具创建不同冗余级别的磁盘组,并给出选择建议与配置步骤,帮助DBA在可用性、性能与成本之间找到平衡点。

Oracle RAC集群中的ASM(Automatic Storage Management)磁盘组不仅承载数据文件、控制文件和在线日志文件,还负责集群注册表(OCR)和投票磁盘的存储。磁盘组的冗余模式直接决定了在磁盘或存储节点发生故障时,数据库是否还能保持服务。ASM提供了三种冗余级别:外部冗余(External Redundancy)、常规冗余(Normal Redundancy)和高冗余(High Redundancy)。外部冗余模式下ASM自身不做镜像,磁盘组的数据保护完全交给底层存储阵列的RAID机制;常规冗余模式下ASM为每个数据块维护两份副本,默认分布在两个不同的故障组中;高冗余模式则维护三份副本,分布在三个故障组中。理解这三种模式的工作机制,对于规划RAC的存储架构至关重要。

Oracle RAC ASM磁盘组冗余模式如何选择与配置?

ASM三种冗余模式的核心差别

ASM冗余模式的核心区别在于数据副本的数量以及故障组的分布策略。外部冗余模式下,磁盘组中的每个数据块只存在一份,ASM不做任何镜像操作。这种模式要求底层存储设备已经通过RAID1、RAID5或RAID10等机制提供了数据冗余保护,否则任何一块磁盘的损坏都可能导致数据丢失。对于已经使用高端存储阵列的环境,外部冗余可以避免ASM层面的额外写放大,从而获得更好的写入性能。

常规冗余模式是Oracle RAC部署中最常见的选择。在该模式下,ASM为每个数据块维护两份完全相同的副本,并将它们分布到不同的故障组中。一个故障组通常对应一个独立的故障域,例如一个存储柜、一个磁盘控制器或者一个节点所在的主机。当某个故障组整体失效时,另一份副本仍然可用,数据库不会中断服务。常规冗余要求磁盘组至少包含两个故障组,每个故障组内至少有一块磁盘。

高冗余模式提供最严格的数据保护,每个数据块有三份副本,分布在三个不同的故障组中。即使有两个故障组同时发生故障,数据依然可以访问。高冗余模式适合对可用性要求极高的核心业务系统,但它的存储开销是常规冗余的1.5倍,对写入性能的影响也更明显。下表总结了三种模式的关键差异:

冗余模式数据副本数最少故障组数可容忍故障组丢失数适用场景
外部冗余110(依赖外部RAID)存储阵列已提供冗余
常规冗余221需要ASM镜像,成本适中
高冗余332关键业务,高可用要求严格

RAC环境下冗余模式的选择策略

在Oracle RAC环境中,故障组的划分通常与集群节点的物理位置或存储连接方式相关。如果每个节点都使用本地磁盘,那么常规冗余可以将每个节点视为一个故障组,把数据副本分布到不同节点的本地磁盘上。这样即使某个节点完全宕机,数据库仍然可以通过其他节点的副本继续运行。例如,在一个两节点的RAC中,每个节点配置一块本地SSD作为ASM磁盘,创建常规冗余磁盘组时指定两个故障组,分别对应两个节点。此时任意一个节点故障都不会导致数据丢失。

如果RAC集群使用共享存储,例如通过光纤通道连接的集中式存储阵列,那么故障组的划分需要根据存储阵列的冗余能力来决定。若存储阵列已经配置了RAID10或RAID6,磁盘层面的可靠性已经有保障,此时可以选择外部冗余模式,减少ASM镜像带来的额外I/O开销。若存储阵列只提供了JBOD或简单的RAID0,则应当使用ASM常规冗余来获得数据保护。对于三节点或更多节点的RAC,如果预算允许且业务要求极高可用性,高冗余模式可以提供更强的容灾能力。

选择冗余模式时还需要考虑性能因素。ASM镜像写入会造成写放大:常规冗余的写入量是外部冗余的两倍,高冗余则是三倍。对于写入密集型的OLTP系统,这种开销可能成为性能瓶颈。但镜像读取可以提升读性能,因为ASM可以从距离当前节点最近的副本读取数据。因此,在决策时需要结合实际业务的读写比例和性能基线进行测试。

使用SQL与asmcmd配置冗余模式

创建磁盘组时,通过SQL命令可以明确指定冗余模式和故障组。以下示例展示了在Windows环境下创建常规冗余磁盘组的语法。在Windows服务器上,ASM磁盘通常以逻辑名称或物理路径的形式提供,以下命令中使用了Oracle ASM的逻辑磁盘名,实际环境中可根据磁盘发现结果替换为\\.\ORCLDISK...这样的物理路径。

-- 创建常规冗余磁盘组,包含两个故障组
CREATE DISKGROUP dg_data NORMAL REDUNDANCY
FAILGROUP fg1 DISK 'ORCL:DATA1' NAME data1
FAILGROUP fg2 DISK 'ORCL:DATA2' NAME data2
ATTRIBUTE 'compatible.asm'='19.0','compatible.rdbms'='19.0';

如果选择高冗余模式,则必须指定三个故障组,如下所示:

-- 创建高冗余磁盘组,包含三个故障组
CREATE DISKGROUP dg_high HIGH REDUNDANCY
FAILGROUP fg1 DISK 'ORCL:DISK1' NAME disk1
FAILGROUP fg2 DISK 'ORCL:DISK2' NAME disk2
FAILGROUP fg3 DISK 'ORCL:DISK3' NAME disk3
ATTRIBUTE 'compatible.asm'='19.0','compatible.rdbms'='19.0';

创建完成后,可以使用asmcmd工具查看磁盘组的属性。在Windows环境中,asmcmd位于Grid Infrastructure安装目录的bin子目录下,典型路径为C:\app\grid\product\19.0.0\grid_1\bin\asmcmd。打开命令提示符并执行以下命令,可以列出所有磁盘组及其冗余类型:

C:\app\grid\product\19.0.0\grid_1\bin\asmcmd lsdg

输出结果中,State列会显示磁盘组的状态,Type列显示冗余级别,例如EXTERN、NORMAL或HIGH。如果只需要查看某个特定磁盘组的详细信息,可以使用以下命令:

C:\app\grid\product\19.0.0\grid_1\bin\asmcmd lsdg -G dg_data

通过asmcmd还可以查询磁盘组的空间使用情况和镜像保护状态,帮助DBA确认冗余配置是否生效。

验证冗余模式与故障模拟

要验证磁盘组实际的冗余级别,可以查询数据库中的V$ASM_DISKGROUP视图。该视图的TYPE列会显示EXTERN、NORMAL或HIGH,对应外部冗余、常规冗余和高冗余。同时,REQUIRED_MIRROR_FREE_MB列表示为了满足当前冗余级别所需保留的镜像空间,USABLE_FILE_MB列则是考虑了镜像开销后实际可用的空间。以下SQL语句可以查看所有磁盘组的详细信息:

SELECT name, type, total_mb, free_mb, required_mirror_free_mb, usable_file_mb
FROM v$asm_diskgroup;

在测试环境中,可以通过模拟故障组离线来验证冗余模式是否真正提供了预期的保护。例如,对于常规冗余磁盘组DG_DATA,可以使用ALTER DISKGROUP命令将其中的一个故障组离线,然后检查数据库是否仍然能够正常读写。命令如下:

ALTER DISKGROUP dg_data OFFLINE FAILGROUP fg1;

执行后,使用SELECT语句查询数据文件所在表空间的数据,确认数据库依然可以正常访问。如果数据库能够继续提供服务,说明常规冗余模式成功容忍了一个故障组的丢失。之后应当及时将故障组重新上线,恢复完整冗余。修复命令为:

ALTER DISKGROUP dg_data ONLINE FAILGROUP fg1;

需要注意的是,故障模拟只应在测试或预生产环境中进行,并且务必提前做好完整备份。在实际生产环境中,任何对故障组的操作都可能引发不可预期的风险。通过这样的验证过程,DBA可以更直观地理解ASM冗余模式的行为,并为生产环境的容灾策略提供依据。

Oracle RACASM磁盘组冗余模式修改时间:2026-08-21 02:19:46

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。