在Oracle RAC存储双活配置中,要实现真正的高可用和数据零丢失,故障组规划、多路径冗余、以及OCR/Voting Disk的跨阵列部署是三个不可妥协的关键点。它们共同构成了从物理层到集群管理层的完整保护链。下面将结合具体案例和操作代码,逐一深入剖析。
关键点一:基于物理隔离的ASM故障组规划
这是实现存储双活数据冗余的核心逻辑 。其原则是:将可能同时故障的物理单元(如一台独立存储阵列)定义为一个故障组(Failure Group),并确保ASM的镜像副本跨故障组存放。
-
目标:确保单个存储阵列的完全故障不会导致数据丢失或数据库不可用。
-
配置实践 :
假设有两套存储阵列(Array_A和Array_B),计划创建NORMAL冗余的
DATA磁盘组。sql-- 创建磁盘组时,显式指定故障组 CREATE DISKGROUP DATA NORMAL REDUNDANCY FAILGROUP ARRAY_A DISK -- 故障组1:存储阵列A '/dev/mapper/disk_A1', '/dev/mapper/disk_A2' FAILGROUP ARRAY_B DISK -- 故障组2:存储阵列B '/dev/mapper/disk_B1', '/dev/mapper/disk_B2' ATTRIBUTE 'compatible.asm' = '19.0', 'compatible.rdbms' = '19.0';代码注释 :此命令强制ASM将
disk_A1和disk_A2(来自Array_A)视为一个故障单元,将disk_B1和disk_B2(来自Array_B)视为另一个。ASM会确保每个数据区(Extent)的主副本和镜像副本分别存储在这两个不同的故障组中。 -
验证与监控 :
创建后必须验证磁盘与故障组的映射关系。
sql-- 查询磁盘组中每个磁盘所属的故障组 SELECT name, path, failgroup, state FROM v$asm_disk WHERE group_number = (SELECT group_number FROM v$asm_diskgroup WHERE name = 'DATA') ORDER BY failgroup;预期结果 :应清晰显示
disk_A1和disk_A2的FAILGROUP为ARRAY_A,disk_B1和disk_B2的为ARRAY_B。
关键点二:多路径软件与UDEV规则的冗余配置
故障组保护的是"存储阵列级"故障,而多路径解决的是"路径级"故障。两者必须配合使用,缺一不可。
- 目标:确保服务器到单一存储阵列的每条物理路径都可用,避免因HBA卡、交换机或单条链路故障导致存储访问中断。
- 配置实践 :
-
多路径配置 :使用
multipath配置,确保每个LUN通过至少两条独立路径可见。bash# 查看多路径聚合后的磁盘,确认来自不同存储的LUN [root@racnode1 ~]# multipath -ll # 输出示例:同一个LUN通过两条路径访问(如active/ready状态) 3600a098038314c6a744b4a6d412b714d dm-0 NETAPP,LUN size=500G features='3 queue_if_no_path' hwhandler='0' wp=rw |-+- policy='service-time 0' prio=50 status=active | `- 2:0:0:0 sdb 8:16 active ready running # 路径1 `-+- policy='service-time 0' prio=10 status=enabled `- 3:0:0:0 sdc 8:32 active ready running # 路径2 -
UDEV规则 :为ASM磁盘配置持久化、一致的设备名和正确的权限,这是Oracle官方推荐的做法。
bash# /etc/udev/rules.d/99-oracle-asm.rules # 规则:使用WWID或DM_NAME绑定设备,并设置grid用户和asmadmin组权限 ENV{DM_NAME}=="3600a098038314c6a744b4a6d412b714d", OWNER:="grid", GROUP:="asmadmin", MODE:="660" ENV{DM_NAME}=="3600a098038314c6a744b4a6d412b714e", OWNER:="grid", GROUP:="asmadmin", MODE:="660" # 重新加载规则 udevadm control --reload-rules && udevadm trigger代码注释 :通过
DM_NAME(多路径设备名)而非易变的sdX来绑定,确保ASM磁盘名称在重启后保持不变,这对RAC集群的稳定性至关重要。
-
关键点三:OCR与Voting Disk的跨阵列高可用部署
集群管理文件(OCR/Voting Disk)的高可用级别必须不低于甚至高于数据文件 。在双活存储中,最佳实践是将其部署在三个独立的故障组中。
-
目标:防止因存储阵列故障导致集群脑裂或管理功能丧失。
-
配置方案 :
通常采用 HIGH冗余 级别,并利用三个独立的存储位置:
- 存储阵列A
- 存储阵列B
- 一个独立的第三站点(如一套NFS服务器或另一套小存储)
sql-- 创建用于OCR/Voting的高冗余磁盘组 CREATE DISKGROUP OCR_VOTE HIGH REDUNDANCY FAILGROUP ARRAY_A DISK '/dev/mapper/ocr_vote_a1' -- 存储阵列A FAILGROUP ARRAY_B DISK '/dev/mapper/ocr_vote_b1' -- 存储阵列B FAILGROUP NFS_SITE DISK '/nfs_volume/ocr_vote_nfs' -- NFS第三站点 ATTRIBUTE 'compatible.asm' = '19.0', 'compatible.rdbms' = '19.0', 'compatible.advm' = '19.0';代码注释 :
HIGH REDUNDANCY要求至少三个故障组。这样,即使任意两个故障组(如两个存储阵列)同时失效,仍有一个副本可用,集群可以继续运行。NFS站点的配置需遵循Oracle特定参数(如hard, intr, noac, vers=3等)以确保稳定性和性能。 -
迁移现有OCR/Voting Disk(如适用):
bash# 1. 备份OCR ocrconfig -manualbackup # 2. 将Voting Disk添加到新磁盘组 crsctl replace votedisk +OCR_VOTE # 3. 将OCR迁移到新磁盘组 ocrconfig -add +OCR_VOTE ocrconfig -delete +原磁盘组名
总结:三大关键点的协同作用
为了更直观地理解这三个关键点如何协同工作,构建一个完整的双活存储保护体系,可以参考下表:
| 关键点 | 防护层级 | 主要作用 | 配置冗余要求 | 故障影响缓解 |
|---|---|---|---|---|
| ASM故障组 | 数据逻辑层 | 实现数据跨存储阵列镜像,防止阵列级故障导致数据丢失。 | NORMAL需2个故障组,HIGH需3个。 | 一个存储阵列宕机,数据访问不中断。 |
| 多路径+UDEV | 物理路径层 | 实现到单一存储的路径冗余和设备名持久化,防止链路或控制器单点故障。 | 每个LUN至少2条活跃路径。 | 单条HBA卡、光纤线或交换机端口故障,存储访问不中断。 |
| OCR/Voting Disk高可用 | 集群管理层 | 确保集群管理功能在存储故障时仍可用,防止脑裂。 | 推荐HIGH冗余,部署在3个独立故障组。 | 两个存储位置失效,集群仍能维持法定票数并运行。 |
协同工作流示例:
- 正常运行时 :应用数据通过多路径写入
DATA磁盘组,ASM自动将数据镜像写入ARRAY_A和ARRAY_B两个故障组。集群心跳通过OCR_VOTE磁盘组在三个位置同步。 - 存储阵列A故障 :
- 多路径层:到阵列A的所有路径失效,但到阵列B的路径正常。
- ASM层 :故障组
ARRAY_A状态变为OFFLINE。由于数据在ARRAY_B中有完整镜像,DATA磁盘组保持MOUNTED,数据库实例无感知,持续提供服务。 - 集群层 :
OCR_VOTE磁盘组中位于阵列A的副本失效,但凭借HIGH冗余,位于阵列B和NFS站点的副本仍能维持集群法定票数,集群软件(CRS)继续运行。
- 恢复 :阵列A修复后,重新上线。ASM自动将
ARRAY_A故障组中的磁盘重新加入并同步数据,恢复完整的NORMAL冗余状态。
综上所述,一个健壮的Oracle RAC存储双活环境,必须像搭积木一样,将这三大关键点层层落实、环环相扣。任何一层的缺失或配置不当,都可能在高压力故障场景下成为整个系统可用性的短板。