Oracle数据库存储双活配置实战:从概念到落地 简介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路径自动切换到另一台数据库几乎感知不到底层存储发生了变化。这里要强调一个数据保护的关键指标RPO0。因为所有写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环境还需要注意双活存储本身对外呈现为一个逻辑LUNRAC两个节点看到的是同一块盘这完全没问题。但如果你做的是跨机房双活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仲裁节点配置错误或仲裁失效检查仲裁节点状态确认仲裁部署在第三位置定期演练断链场景备库切换后日志GAPData Guard配置与双活切换联动不足重建日志应用检查Oracler的LOG_ARCHIVE_CONFIG配置4.5 双活存储的日常监控配置做完了运维才刚开始。双活存储最容易出问题的地方是链路质量——光纤衰减、交换机端口松动、光模块老化这些都会导致同步复制链路不稳定而链路不稳定又不像完全断掉那么显眼往往是间歇性的延迟抖动表现为数据库偶尔慢一下过会儿又好了。我建议在监控系统里对几项指标设好阈值两阵列间复制延迟超过5毫秒就要报警、心跳链路状态down了必须立即处理、仲裁节点的连通性这个最容易忽视、一致性组的状态是否有LUN从同步变成不同步。存储厂商一般都有自己的监控工具但很多运维团队装完就不看了等出问题才打开。我们的做法是把这些指标接入统一的Zabbix或Prometheus监控故障前能有感知而不是故障后才知道。另外双活存储的固件升级一定要谨慎。不少存储双活的问题都是因为两端阵列固件版本不一致导致的建议两端阵列固件始终保持同一版本升级前先读Release Notes确认对双活功能没有影响再动而且升级要在业务低谷期做先升一端观察稳定后再升另一端。5. 双活不是终点只是高可用架构的一块拼图最后说点个人体会。存储双活配置指南这种东西网上能搜到很多厂商的官方文档步骤写得比我这篇详细多了但大多数文档不会告诉你这些事双活配置成功并不难难的是后续的运维体系能不能跟上。你是否有定期的切换演练计划你是否监控着复制链路的延迟你是否知道仲裁节点故障时系统会怎么表现这些问题答案不清楚双活就只是纸面高可用。我在实际运维中最大的心得就是四个字常态演练。双活存储这套东西如果半年不演练切换流程必然生疏配置可能被后续变更改坏链路质量问题可能早已埋下但没有暴露。只有把“故障切换演练”当成和备份恢复演练一样常规的操作每月或每季度做一次这套系统才算真正活在生产环境里。另外还有个小技巧双活存储切回时数据库层最好做一个短时间的只读检查确认数据一致性和性能指标都正常后再恢复业务写入。这个步骤看似多余但能防止“切回来才发现问题又得切走”这种来回折腾的尴尬。总之技术方案选对、配置做细、演练做勤Oracle跑在双活存储上才能真正做到高枕无忧。本文还有配套的精品资源点击获取