简介:Oracle存储双活配置实战指南,为构建跨数据中心高可用架构的DBA和系统架构师提供一套可落地的双活存储解决方案。文档从传统RAC依赖共享存储导致单点故障、ADG仅提供数据级容灾无法实时接管应用的局限性切入,阐明双活存储方案的适用场景。正文按实施顺序详述磁盘规划(至少6块,分AA机房、BB机房、仲裁ZC机房),使用临时OCR盘安装Grid Infrastructure,创建normal冗余OCR与DATA磁盘组并指定两个故障组和一个QUORUM仲裁盘组,以及后续添加磁盘、OCR和votedisk迁移、ASM SPFILE迁移等关键操作,命令注释清晰。同时针对跨机房传输时延问题,用Orion工具在双活RAC节点上进行读写压力测试,列出实测IOPS和延迟数据,为生产环境性能调优提供参照。资源为单个docx文档,体积约104KB,已有149人学习,内容结构完整,适合有一定Oracle基础并计划实施双活改造的团队直接参考。 干数据库运维这行,最怕听到的一句话往往不是“库宕机了”,而是“存储挂了”。Oracle作为核心业务库的占比相当高,存储一旦出问题,轻则业务中断,重则数据损坏无法恢复。早些年我们应对存储故障主要靠备份和恢复,但恢复时间动辄几小时,业务方根本等不起;后来上了Data Guard,数据库层面的容灾有了着落,可存储本身还是单点——万一存储控制器整体瘫痪,Data Guard也只能干瞪眼。真正能把这个单点补上的,就是存储双活。
简单说,存储双活就是让两台存储阵列同时承载业务读写,互为镜像,任何一台故障,另一台无缝接管,数据零丢失,切换时间从“小时级”压缩到“分钟级甚至秒级”。这篇东西的价值就在这:我会把Oracle环境里做存储双活的完整配置思路、关键参数、踩坑点,一次讲清楚。不管你是刚接触存储架构的DBA,还是被领导安排“研究一下双活”的系统工程师,这篇都能给你一条能落地的路线图。
1. 双活存储到底解决什么问题
1.1 单存储架构的致命隐患
先看一个最常见的生产架构:Oracle跑在两台数据库服务器上,做成RAC集群,后端接一台中高端存储阵列,LUN映射给两个节点。看起来有冗余——数据库节点挂了可以漂移,网络做了冗余,甚至数据库实例都有两个。但存储还是那一个。存储控制器故障、微码bug、硬盘批量损坏、机房断电,任何一件事发生,所有节点同时失去数据访问能力,RAC集群瞬间脑死亡。
更麻烦的是恢复流程。传统做法是“存储修复后挂载LUN,利用归档日志做不完全恢复”,前提是数据盘和控制文件、日志盘都完好。如果存储损坏严重,只能从备份恢复,那就要经历“重装系统、安装Oracle、恢复备份、追归档”这条漫漫长路。以我们之前的经验,一套500GB左右的业务库,从备份恢复到追平归档,顺利的话也要三四个小时,不顺利的话跨天都很正常。业务停机三四个小时意味着什么,做过核心生产库的人都懂。
1.2 双活不等于主备,是真正的“同时干活”
很多人一听“双活”,第一反应是“两台存储互相备份,一台坏了另一台上”。这个理解对了一半,但丢了最关键的一半——双活不是冷备,也不是主备自动切换,而是两台存储同时在线,业务IO同时写到两台设备上。用术语说,这叫Active-Active模式。
技术实现上,双活存储通过专用的复制引擎,把每个写IO实时同步到对端阵列,两边的LUN数据完全一致。任何一台阵列故障,主机侧的IO路径自动切换到另一台,数据库几乎感知不到底层存储发生了变化。这里要强调一个数据保护的关键指标:RPO=0。因为所有写IO在返回主机“写成功”之前,必须同时落到两台阵列上,所以任何一台故障,数据一条都不会丢。RTO就看切换机制了,配置得当通常能做到分钟级。
1.3 双活不是银弹,要搞清楚它管不了什么
把双活说得这么好,也得分清楚边界。存储双活只解决“存储设备故障”和“单机房存储链路故障”这两个层面的问题。它不解决逻辑损坏——比如有人误执行了drop tablespace,这个操作会实时同步到两台存储上,两边一起删,想做“后悔药”只能靠备份或者延迟机制。它也不解决数据库层面的逻辑故障和人为误操作,更不解决整个机房级别的灾难(比如火灾、水淹),那是同城灾备或异地容灾的范畴。
所以在做架构设计时要建立正确的预期:存储双活的定位是“消除存储单点故障,保障存储层面的高可用”,它应该和Oracle Data Guard、RMAN备份形成互补,而不是互相替代。常用的组合拳是:同城双活存储解决存储设备故障,Data Guard解决数据库逻辑错误和机房级容灾,RMAN解决最后一道防线也就是误操作和灾难恢复。
2. 配置前的架构设计与选型思路
2.1 先想清楚拓扑:同城双活还是双活数据中心
生产环境最常见的双活方案叫“同城双活”:两个机房相距几十公里,通过光纤或DWDM设备互联,每个机房各放一台存储阵列,数据库服务器也拆成两部分,分别部署在两个机房,组成跨机房的Oracle RAC。这样做的好处是:既能防存储故障,又能防单机房掉电或网络设备故障,数据库实例在两个机房都有活节点。
但距离是双活最大的敌人。同步复制对网络延迟极其敏感,两阵列之间的往返延迟一般要求不超过1毫秒,极限也不要超过2毫秒。光纤在物理介质里每公里大约产生5微秒延迟,加上交换设备处理延迟,50公里距离的往返延迟通常在0.5到1毫秒之间,基本是红线了。所以同城双活不是想拉多远就拉多远,规划时一定要实测两阵列间的延迟和丢包率,最好用存储厂商自带的检测工具或ping加iperf先摸底。
2.2 存储层、主机层、数据库层的分工
双活项目经常失败,往往是因为只盯着存储配置,忽略了三层联动。我习惯把整个架构分成三块看:
- 存储层:双活一致性组的创建、同步策略、仲裁配置,负责把两台阵列“合成”一台逻辑存储。
- 主机层:多路径软件的配置,负责把两条存储路径聚合成一块盘,故障时自动切换。
- 数据库层:Oracle ASM和RAC的配合、参数调整,确保数据库能感知并适应底层双活存储。
三层缺一不可。存储双活做好了但主机多路径没配好,切换时照样IO中断;存储和多路径都好了,ASM参数没调,极端切换场景下照样可能出现ASM磁盘超时。下面逐个环节说。
2.3 存储双活的几种产品形态怎么选
市面上能做双活的方案不少,但形态差异很大,选错了后续很难受:
| 方案形态 | 代表类型 | 优点 | 缺点 | 适合场景 |
|---|---|---|---|---|
| 中高端存储原生双活 | 华为OceanStor Dorado、HPE Primera、DELL PowerMax等 | 性能好、一体化管理、稳定性高 | 贵,且要求两端存储同品牌同系列 | 预算充足的核心生产 |
| 存储网关虚拟化双活 | IBM SVC、HUAWEI VIS等 | 可池化异构存储,不绑定存储品牌 | 网关自身成为新的故障点,需要额外高可用设计 | 存量异构存储利旧 |
| 分布式存储双活 | 基于Ceph或商业分布式存储 | 扩展性好、成本相对低 | Oracle数据库对延迟敏感,分布式存储未必扛得住核心OLTP | 非核心库、开发测试环境 |
个人建议,跑Oracle核心业务库,优先考虑中高端存储原生双活。分布式存储做Oracle生产库,我见过太多延迟超标、小IO性能崩塌的案例,除非你的业务模型以扫描和批量为主,否则慎选。至于存储网关方案,前几年很流行,但现在新项目里已经很少用了,毕竟多一层网关就多一层故障概率。
3. 核心配置步骤与关键参数
这一部分我以主流的中高端存储双活和Linux主机上的Oracle环境为例,把配置路径完整走一遍。不同品牌的界面和命令有差异,但底层的原理和步骤结构是通用的。
3.1 存储侧配置:一致性组是灵魂
先把两台存储阵列的“双活对”建好,这是前提。具体到业务配置,最关键的一步是创建一致性组(Consistency Group)。
为什么一致性组这么重要?Oracle的数据文件、控制文件、在线日志分布在多个LUN上,如果这些LUN各自独立做镜像,极端故障时可能A LUN已经同步到最新、B LUN还停在旧时刻,数据库拿到的是不一致的盘面,结果比存储全坏还可怕——数据文件和控制文件时间点对不上,数据库直接无法启动。一致性组的作用,就是把多个LUN绑定成一个复制单元,保证故障切换时所有LUN停在同一时间点,数据库看到的是一个崩溃一致(crash consistent)的状态,配合Oracle的实例恢复机制就能自动拉起。
创建一致性组时,务必把同一个数据库相关的所有LUN放进同一组。我的经验是按“一个生产库一个一致性组”来规划,不要图省事把多个库塞进一个组,否则回切和故障定位会非常痛苦。
同步策略选择上,Oracle核心库必须选“同步复制模式”,也就是写IO要同时确认写到两端后才返回成功。异步复制模式虽然性能影响小,但RPO不再是零,双活的意义就去了一半。这一步没得商量,核心库坚持同步。
3.2 主机侧多路径配置:故障切换的第一道关卡
存储侧配置完,主机的多路径软件要跟上。Linux环境最常用的是device-mapper-multipath,也就是dm-multipath。配置前先确认主机能看到双活存储映射过来的同一个LUN的多个路径,通常使用lsscsi或lsblk检查。
下面是一个常见的/etc/multipath.conf核心配置:
defaults { user_friendly_names yes find_multipaths yes path_grouping_policy multibus path_selector "round-robin 0" failback immediate no_path_retry 5 polling_interval 5 } blacklist { wwid "SATA_*" } multipaths { multipath { wwid 360060e801527a00001527a0000001a alias oradata01 path_grouping_policy multibus path_checker tur } }这里几个参数需要重点说:
path_checker tur:使用SCSI Test Unit Ready命令检测路径状态,对双活存储比较友好。no_path_retry 5:所有路径中断时,IO重试的次数。这个值别设太小,存储双活切换仲裁期间,IO可能短暂中断,重试次数太少会让数据库直接报错;也别太大,否则故障时IO长时间阻塞,数据库会话堆积。实测下来5到8次比较合适。failback immediate:故障路径恢复后立即回切。对双活存储来说,两个路径本来就是Active-Active,不存在“回切”的负担,设成immediate没问题。
配置完成后用multipath -ll确认路径状态,正常应该能看到同一个LUN有4条路径(比如2个主机端口×2个存储控制器),且所有路径都是active ready状态。这时候你手动拔掉一端存储的线缆,多路径应该能在几秒内把IO切到另一端,数据库无感知。
3.3 Oracle ASM 与 RAC 环境的联动配置
主机多路径好了,接下来是Oracle层面。如果数据库用的是ASM,配置相对简单,ASM直接识别/dev/mapper/oradata01这样的设备即可。但有几个细节要注意:
ASM磁盘组的compatible.asm和compatible.rdbms属性要设置到支持当前Oracle版本的较高值,否则一些新特性用不了,切换时也可能出现兼容性问题。
ASM的_asm_hbeat_wait和_asm_allow_rule_based_affinity这类隐藏参数,在没有充分测试和厂商支持的情况下,尽量不要乱动。存储双活场景下,ASM默认的参数已经足够,强行调优反而可能造成故障切换时ASM误判磁盘离线。
数据库DB_LOST_WRITE_PROTECT参数,我建议在双活环境下设为typical。双活存储虽然保证IO一致,但极端故障切换时理论上仍存在写丢失的可能,开启这个参数能在数据库层面检测到“读到的块比实际更旧”的情况,属于纵深防御。
RAC环境还需要注意,双活存储本身对外呈现为一个逻辑LUN,RAC两个节点看到的是同一块盘,这完全没问题。但如果你做的是跨机房双活RAC,一定要关注两个机房之间的网络延迟和丢包率,因为RAC的Cache Fusion流量对网络同样敏感。很多项目存储同步没问题,结果RAC两节点间的私网延迟太高,性能照样拉胯。
3.4 验证与切换演练:不演练等于没做
配置完成只是开始,真正见真章的是验证和演练。这块我要多说几句,因为太多项目栽在“觉得配好就万事大吉”。
第一步是只读验证:在两个存储端分别确认LUN数据和一致性组状态正常,主机端multipath -ll确认路径聚合正常,数据库正常启动,业务跑起来,检查告警日志无IO错误。
第二步是在线切换演练:找一个业务低谷窗口,手动把存储A的控制器设为维护模式,模拟存储A故障。这时存储B应该自动接管全部IO,主机多路径检测到路径切换,整个过程数据库不应该出现任何会话中断或日志报错。确认稳定后,再把存储A切回正常状态。这个演练建议每季度至少做一次。
第三步是断电级演练:直接关闭存储A的电源,模拟灾难场景。这一步很刺激,但最能暴露问题。我第一次做的时候,发现存储A掉电后,仲裁判断花了将近2分钟,期间数据库虽然没有报错,但业务侧已经出现轻微等待,事后把仲裁超时参数调短才解决。这种问题不做断电演练根本发现不了。
4. 常见问题与踩坑实录
4.1 脑裂:心跳断了,到底听谁的
双活架构中最经典的故障模式就是脑裂。两台存储之间的复制链路和心跳链路同时断了,但两边的主机都还能访问各自的存储,此时两边都认为自己该继续提供服务,如果处理不当,两边同时接收写IO,数据就分叉了。
解决方案是引入仲裁机制,也叫第三方见证。仲裁节点可以是第三台存储(通常放在第三个机房或同城另一个安全点),也可以是专门的仲裁服务器。当两台阵列无法互相通信时,由仲裁决定哪一方继续提供服务,另一方自动降级为只读或直接下线,绝不允许两边同时写。
这里有个我见过很多次的错误:把仲裁放在其中一台存储所在的机房。真出事时,如果那个机房整个断电或网络瘫痪,仲裁跟着一起失联,等于没设仲裁。仲裁节点一定要放在和两端存储物理隔离的第三位置,这个位置不需要太强的性能,但网络必须稳定可靠。
4.2 同步复制的性能放大效应
同步复制对性能的影响经常在配置前被低估。它在原本的写IO路径上多加了一次跨阵列的网络往返,延迟至少增加一倍以上。对顺序写的大批量操作可能还能接受,但对Oracle这种大量随机小IO(尤其是redo log写入)的业务,影响会被明显放大。
我踩过的坑是:存储双活配置完成后,没做性能回归测试就直接上了生产,结果发现批量任务跑批时间从40分钟拉长到55分钟,应用侧投诉“变卡了”。排查到最后,就是redo日志所在的LUN同步复制延迟偏高。
解决方案有几个方向:一是保证两阵列之间的链路带宽和延迟达标,最好用专用的光纤通道或DWDM链路,不要跟业务网络混跑;二是合理规划LUN分布,把redo日志这类高IOPS的LUN放在性能最好的磁盘类型上;三是如果业务能接受极小窗口的数据丢失,可以把redo日志所在的LUN降级为异步复制——但这条我不建议核心库这么做,属于给性能让路、给数据风险开门的妥协方案。
4.3 双活存储叠加Data Guard要注意什么
很多架构师喜欢“双活+Data Guard”双重保险,这个思路没错,但有个容易忽略的坑:Data Guard的日志传输方向要和存储双活的方向匹配。
假设存储A机房是主库所在机房,存储B机房是备库所在机房。正常情况下,主库写日志,通过Data Guard传输到备库应用。但如果存储B发生故障切换,备库所在机房的存储数据其实是从存储A同步过去的,此时备库的数据库文件可能仍然可用,但Data Guard的日志应用状态可能需要重新校准。我在实际项目中遇到过备库切换后日志GAP异常的情况,最后是通过重新ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION重建日志应用解决的。
另外,如果两个机房的数据库实例组成了跨机房RAC,同时又配置了Data Guard到第三个机房,那就更复杂了——Data Guard备库只能有一个主库,跨机房RAC的两个实例本质上属于同一个数据库,备库配置时要用TARGET_SERVICE指向正确的服务名,别指到单个实例上。
4.4 常见问题速查表
| 问题现象 | 可能原因 | 排查与解决方法 |
|---|---|---|
| 存储切换后数据库报ORA-00313/ORA-00314 | 控制文件与数据文件时间点不一致 | 检查一致性组是否包含了所有相关LUN,确认所有LUN在同一组内 |
| 切换期间数据库出现ASM磁盘离线 | 多路径no_path_retry太小,IO重试耗尽 | 调大no_path_retry,或调整存储仲裁超时时间 |
| 双活配置后性能明显下降 | 同步复制链路延迟高或带宽不足 | 用iperf测试两阵列间网络质量,检查是否有丢包;考虑链路升级 |
| 心跳链路中断后两边同时接收写IO | 仲裁节点配置错误或仲裁失效 | 检查仲裁节点状态,确认仲裁部署在第三位置,定期演练断链场景 |
| 备库切换后日志GAP | Data Guard配置与双活切换联动不足 | 重建日志应用,检查Oracler的LOG_ARCHIVE_CONFIG配置 |
4.5 双活存储的日常监控
配置做完了,运维才刚开始。双活存储最容易出问题的地方是链路质量——光纤衰减、交换机端口松动、光模块老化,这些都会导致同步复制链路不稳定,而链路不稳定又不像完全断掉那么显眼,往往是间歇性的延迟抖动,表现为数据库偶尔慢一下,过会儿又好了。
我建议在监控系统里对几项指标设好阈值:两阵列间复制延迟(超过5毫秒就要报警)、心跳链路状态(down了必须立即处理)、仲裁节点的连通性(这个最容易忽视)、一致性组的状态(是否有LUN从同步变成不同步)。存储厂商一般都有自己的监控工具,但很多运维团队装完就不看了,等出问题才打开。我们的做法是把这些指标接入统一的Zabbix或Prometheus监控,故障前能有感知,而不是故障后才知道。
另外,双活存储的固件升级一定要谨慎。不少存储双活的问题都是因为两端阵列固件版本不一致导致的,建议两端阵列固件始终保持同一版本,升级前先读Release Notes,确认对双活功能没有影响再动,而且升级要在业务低谷期做,先升一端,观察稳定后再升另一端。
5. 双活不是终点,只是高可用架构的一块拼图
最后说点个人体会。存储双活配置指南这种东西,网上能搜到很多厂商的官方文档,步骤写得比我这篇详细多了,但大多数文档不会告诉你这些事:双活配置成功并不难,难的是后续的运维体系能不能跟上。你是否有定期的切换演练计划?你是否监控着复制链路的延迟?你是否知道仲裁节点故障时系统会怎么表现?这些问题答案不清楚,双活就只是纸面高可用。
我在实际运维中最大的心得就是四个字:常态演练。双活存储这套东西,如果半年不演练,切换流程必然生疏,配置可能被后续变更改坏,链路质量问题可能早已埋下但没有暴露。只有把“故障切换演练”当成和备份恢复演练一样常规的操作,每月或每季度做一次,这套系统才算真正活在生产环境里。
另外还有个小技巧,双活存储切回时,数据库层最好做一个短时间的只读检查,确认数据一致性和性能指标都正常后再恢复业务写入。这个步骤看似多余,但能防止“切回来才发现问题又得切走”这种来回折腾的尴尬。总之,技术方案选对、配置做细、演练做勤,Oracle跑在双活存储上,才能真正做到高枕无忧。
本文还有配套的精品资源,点击获取