虚拟机部署Oracle RAC完全可行,但真正的挑战不在Oracle自身,而在于虚拟化层的资源分配、共享存储I/O路径和网络延迟控制这三项做到位,虚拟机RAC跑得稳;做不到位,集群宕机只是时间问题。
虚拟机部署Oracle RAC,这些底层配置最容易踩坑
虚拟化带来的灵活性是物理机给不了的,但虚拟化也引入了一层”中间商”,CPU、内存、时钟、中断,每个环节都要重新审视,不能拿物理机的老经验直接套。
CPU与内存的分配策略
在VMware或KVM环境里,给RAC节点分配资源时,常见误区是”多给点vCPU总没坏处”,vCPU数量一旦超过物理核数(或超线程后的逻辑核数),CPU调度成本会直线上升,Oracle的并行进程反而变慢,行业共识认为,vCPU与底层物理核的比例控制在1:1到2:1之间,业务高峰期才不容易出现CPU等待。
内存方面,务必开启虚拟化平台的内存预留(Reserve all guest memory),Oracle的SGA依赖于内存锁页操作,如果虚拟机内存被Balloon驱动回收或Swapping,数据库瞬间就可能触发ORA-4031或者节点驱逐事件,具体操作上,在vSphere中需要勾选”Reserve all guest memory”,在KVM里则对应<memory tune>配置中的hard_limit与min_guest。
NUMA架构对Oracle RAC的影响
现代物理机基本都是NUMA架构,当虚拟机跨NUMA节点分配内存时,内存访问延迟会升高,Oracle的性能抖动很难排查,建议把每个RAC节点的vCPU和内存钉在同一个NUMA节点上,存储层面用numactl --hardware验证,数据库层面看v$active_session_history里有没有大量wait_event='gc buffer busy'配合内存延迟升高的记录。
时钟同步的虚拟化陷阱
RAC依赖集群时钟一致性,在虚拟机里,CPU计时指令(TSC)默认可能是虚拟化的,频繁切换时时钟跳变,导致集群心跳异常,解决办法是统一使用NTP或chrony,
- 在VMware虚拟机配置中,关闭”Time Synchronization”(由VMware Tools自动校时),只保留外部NTP源
- 在KVM宿主机的
/etc/libvirt/qemu.conf中启用tsc-frequency=host的透传特性 - 各节点使用同一个
chrony.conf配置,启动后执行chronyc makestep强制校准
时钟问题通常不显山漏水,一旦出现CSSD报错或crsctl stat res -t显示某个节点被驱逐,先检查/var/log/messages里有没有time went backwards的记录。
Oracle RAC虚拟机性能瓶颈,关键在存储与网络
存储和网络是虚拟机RAC的两个命门,相对CPU和内存,这两个环节更容易因为虚拟化层的过度设计而性能腰斩。
共享存储I/O的“不可妥协”原则
RAC的所有数据文件、控制文件、SPFILE,都必须放在共享存储上,在虚拟机环境里,常见的选择有:
| 存储方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| vSphere虚拟磁盘(VMDK)挂在共享数据存储 | 配置简单,支持快照 | I/O路径长,延迟高,有锁竞争风险 | 开发测试环境 |
| RDM(裸设备映射) | 直接透传到物理LUN,延迟低 | 运维稍复杂,部分虚拟化功能受限 | 生产环境小规模 |
| 物理机iSCSI/NFS直连 | 延迟最低,路径最短 | 虚拟机高可用特性受影响 | 对延迟极敏感的系统 |
实际生产环境,多数DBA倾向RDM方式,市场占有率比较高,但无论选哪种,禁用虚拟磁盘的Write-back缓存,同时开启SCSI控制器层深的Virtual SCSI Passthrough或PVSCSI驱动,避免默认的LSI Logic控制器带来的额外CPU开销。
网络心跳与延迟的极端敏感性
RAC的私有网络(集群心跳)对延迟极敏感,物理环境走交换机1微秒到5微秒的延迟,虚拟化环境一旦走了vSwitch的软件转发路径,延迟就可能飙升到100微秒以上。
几个硬性要求:
- 心跳网络必须独占一个虚拟交换机,不要和业务网卡复用同一块物理网卡
- 在虚拟交换机层面启用巨型帧(MTU 9000),减小报文的转发次数
- 不要开启vSwitch的安全策略里的”Forged Transmits”或”MAC Address Changes”限制,否则Oracle的RAC私网通信会被直接丢弃
- 不要把两个RAC节点放在同一个ESXi宿主上(单点故障),如果非要放在一起,务必额外配置独立的物理网卡直通(PCI Passthrough)
对应的排查工具是ping -s 8972测大包延迟,如果超过1ms,要立即检查网络配置。
oracle rac 虚拟机 asm 磁盘配置的实操细节
ASM是RAC的存储灵魂,虚拟化环境下,ASM磁盘的配置比物理机更敏感,因为AU(分配单元)和虚拟磁盘的格式化粒度一旦不匹配,性能损失明显。
磁盘格式与AU大小的选择
ASM的AU大小默认是1MB,在虚拟机环境下建议调整为4MB,原因是虚拟磁盘的底层格式(如VMDK的extent大小)通常较大,1MB的AU会导致频繁的I/O拆分,放大延迟,具体操作:
CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/asm-data01' NAME data01, DISK '/dev/asm-data02' NAME data02 ATTRIBUTE 'AU_SIZE'='4M';
如果没有提前规划,也可以后续通过ALTER DISKGROUP调整,但需要重新平衡(Rebalance),期间I/O压力较大,尽量避免业务高峰。
udev绑定与多路径的坑
在Linux虚拟机上配置ASM磁盘时,大部分人用udev按/dev/sd绑定,但虚拟机重启后,磁盘盘符经常漂移,正确做法是使用WWID(SCSI标识)绑定,生成udev规则时,先执行:
/usr/lib/udev/scsi_id -g -u -d /dev/sd[b-c]
把返回的WWID写进规则,再重启udev服务,多路径场景下,需要在/etc/multipath.conf里给每个LUN设置唯一的alias,并且使用user_friendly_names选项,避免ASM磁盘被识别成多个名字导致的ORA-15032错误。
小配置决定大成败
ASM磁盘组的FAILGROUP划分也不能忽视,虚拟机RAC最常见的错误是把同一物理存储上的磁盘划分成多个FAILGROUP,以为做了冗余,其实底层物理盘就一块,故障时全部丢失,确定FAILGROUP前,用asmcmd lsdsk -p查看每个磁盘的路径,确认底层确实是不同的物理设备。
虚拟机搭建RAC,部署方案的选择与成本考量
除了技术细节,RAC虚拟机部署方案还得结合成本和运维能力,不是所有场景都适合上虚拟机RAC,尤其要分清”高可用”和”高性能”之间的取舍。
部署方式对比:物理机、虚拟机、云平台
据工信部近年发布的算力发展数据,企业对高可用数据库的需求逐年攀升,部署形态也越来越多样化,三种方式各有适用区间:
- 物理机部署:性能最好,延迟最低,适合IO密集型的核心交易系统,但资源利用率和运维灵活性差
- 虚拟机部署:资源利用率高,快速扩展、快照备份方便,适合中小规模业务,性能损失大多在5%-15%之间,取决于虚拟化平台调优水平
- 公有云RAC:免运维、底层高可用,但专有云上架RAC的场景较少,大部分云厂商不承诺支持Oracle RAC的
rac_on_public_cloud配置,云主机间网络延迟和存储IOPS是不可控因素
部署成本与硬性不可控项
虚拟化环境省的是物理机采购成本,但许可成本其实没变Oracle的License按CPU核心数计算,虚拟化核数过大会直接推高授权费用,云平台基于CPU积分(如AWS的T系列)的突发性能机型,在RAC场景下几乎不可用,因为一旦CPU积分耗尽,节点会瞬间卡顿,触发CSSD驱逐。
在方案选型阶段,多做一次IO基准测试就好:用Oracle自带的orion工具压测虚拟磁盘,对比随机读、随机写的IOPS和延迟曲线,快速筛选适合的存储方案。
虚拟机RAC运维避坑指南
搭建完成只是第一步,RAC在虚拟机里跑的时间越久,暴露问题越多,尤其是在迁移、扩容、快照这类日常操作上。
快照与虚拟机迁移的“高危动作”
最致命操作是活着给RAC节点打快照,RAC依赖共享存储状态,打快照等于把虚拟机磁盘回退到某个时间点,ASM元数据与OCR内容不一致,集群基本立即崩溃,如果一定要打快照,必须:停止集群服务(crsctl stop crs),打完快照再启动。
虚拟机迁移(vMotion/热迁移)同理,虽然不会损坏ASM,但迁移过程中网络会中断几毫秒到几秒,可能触发CSSD心跳超时,业界建议迁移时先迁移到另一台ESXi,确保目标宿主机上配置了同样的CPU特性集(EVC模式)。
日常巡检的几条硬标准
- 每季度检查一次
dmesg里的watchdog timeout和hung_task记录 - 使用
orachk套件,它对虚拟化环境会额外检查CPU steal time和内存膨胀率 - 定期执行
crsctl check cluster -all并核对v$instance的各节点启动时间 - 在ESXi侧关注CPU Ready值如果单个vCPU的Ready时间占比超过10%,说明宿主机超分严重,需要迁移或增加物理资源
虚拟机部署Oracle RAC常见问题解答
虚拟机部署的Oracle RAC,性能比物理机差多少?
在共享存储和网络配置到位的前提下,大多数业务场景下性能差距在5%-10%左右(主要来自虚拟化层调度开销),但实际损耗高度依赖底层平台:如果宿主机NUMA配置不当或超分严重,差距可能拉大到30%以上,任何时候,CPU Ready值和gc buffer busy等待事件是判断虚拟化性能损耗的核心指标。
在KVM和VMware上部署RAC,哪个更稳?
两者的稳定度都足够,但运维视角差异很大,VMware的vSphere HA、EVC和DRS功能更丰富,适合对高可用要求苛刻的环境;KVM的架构更精简,没有额外的调度层,性能损耗理论上更低,但需要Linux系统管理经验来补位,国内企业近年较多采用KVM+oVirt或Proxmox的组合,性价比更高。
虚拟机RAC能否在公有云上稳定运行?
可以,但有条件,主流公有云的裸金属实例(非虚拟共享实例)加上专有VPC网络,能够满足RAC的存储和网络要求,常见的失败案例几乎都源于使用了共享型云主机和默认虚拟网络,购买前查阅云厂商针对Oracle RAC的部署文档,没有明确支持说明时不建议贸然生产落地,可以先用一个月按需付费实例做完整测试。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/772684.html


