虚拟机搭建RAC,最大的挑战不在Oracle本身,而在虚拟化层的共享存储、网络心跳和时钟同步这三道坎,把这三块理顺,RAC跑在虚拟机上和物理机没有本质差别。
行业共识认为,RAC(Real Application Clusters)上云的难点从来不是Oracle Grid Infrastructure的安装脚本,而是底层虚拟化资源是否满足Oracle集群的“洁癖”,存储路径漂移、心跳网卡丢包、时间跳变导致CTD(Cluster Time Daemon)误判节点宕机,这些问题在物理机上几十年不遇,在虚拟机上却是家常便饭,30招拆解完,你会发现多数事故都可以在规划阶段提前规避。
虚拟机搭建RAC和物理机有什么区别?先认清这3道坎
物理机装RAC,硬件资源独占,操作系统对设备的识别顺序稳定,虚拟机不一样,虚拟化层引入了三层不确定性:SCSI设备扫描顺序、虚拟网卡的MAC地址绑定、以及CPU调度延迟,这三个变量叠加,直接导致集群节点互相“失联”。
- 设备识别不稳定:VMware默认的pvscsi控制器在重启后,磁盘盘符可能从/dev/sdb变成/dev/sdc,UDEV规则如果没写好,ASM磁盘组直接识别不到。
- 网络延迟升高:虚拟交换机(vSwitch)默认的流量整形策略会引入微秒级延迟,而RAC的私有网络心跳超时阈值是net_message_timeout,如果延迟抖动超过这个值,节点会被踢出集群。
- 时间不可控:宿主机NTP(Network Time Protocol)时间和虚拟机内部NTP互相干扰,导致节点间时钟差超过Misscount参数允许的范围,集群直接脑裂。
业内专家指出,解决以上问题不需要有多么高深的虚拟化知识,核心思路就一条:把虚拟机当物理机管理,所有共享资源必须静态化、独立化、专有化。
共享存储的坑:RAC集群存储规划与虚拟磁盘配置
共享存储是RAC的命根子,虚拟化环境里,ASM(Automatic Storage Management)磁盘的常见问题,大纲如下。
第1招:虚拟磁盘必须开启“独立”模式
在VMware中,默认虚拟磁盘是“与快照一起”的,一旦你给虚拟机拍了快照,ASM磁盘组的I/O会被冻结,OCR(Oracle Cluster Registry)和Voting Disk所在的磁盘组直接进入只读状态。要点:创建共享虚拟磁盘时,磁盘模式务必选择“独立-持久化”,这能让快照操作不会波及集群盘。
- 操作路径:编辑虚拟机设置 → 硬盘 → 高级选项 → 磁盘模式 → 独立持久化。
- 注意:如果使用vSAN或RDM(Raw Device Mapping),确认存储策略允许“独立”标签。
第2招:SCSI控制器必须启用“总线共享”
Oracle通过SCSI-3 Persistent Reservation管理Voting Disk的磁盘仲裁,如果虚拟机的SCSI控制器没有开启“虚拟SCSI总线共享”,两个节点会互相抢占磁盘锁,表现为voting disk丢失,crsctl stat res -t命令出现大量红色ERROR。
- 关键选项:SCSI控制器类型选择VMware Paravirtual,然后将SCSI总线共享设为“物理”或“虚拟”。
- 适合场景:单台ESXi主机内的多台虚拟机共享存储,用“虚拟”即可;跨物理机场景要选RDM直通或vSAN,而不是简单分布式虚拟磁盘。
第3招:ASM磁盘路径必须用UUID绑定,不用设备名
在Linux环境下,/dev/sdb这种设备名在虚拟机重启后极容易变化,使用/etc/udev/rules.d/99-oracle-asm.rules,通过每个磁盘的WWID或UUID生成稳定的设备路径,是必须做到的。
- 获取UUID:
/usr/lib/udev/scsi_id -g -u -d /dev/sdb - 正则规则示例:
KERNEL=="sd", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$name", RESULT=="36000c29...", SYMLINK+="oracleasm/disk1" - 这套配置做完,还要执行udevadm trigger,不然设备节点不会立即生效。

第4招:NFS方式搭建共享存储,只适合测试环境
不少新手图省事,直接拿NFS(Network File System)当共享存储,NFS作为RAC共享盘的缺点是网络协议栈开销大,极易出现I/O路径高延迟,导致ASM磁盘组force dismount,物理环境下机架很稳,但虚拟化环境的NFS走的是vSwitch到vSwitch,经过软件协议栈,延迟更难控。
第5招:vSAN上创建共享盘,必须用独立VMDK
vSAN(VMware Virtual SAN)虽然支持共享虚拟磁盘,但它默认的存储策略是“条带化+镜像”,RAC的OCR盘对数据一致性要求极高,不建议开去重压缩,共享盘独立VMDK是vSAN唯一支持的方式,你需要将存储策略的容错方法设为“RAID-1镜像”,并关闭“混合磁盘”加速。
第6招:多路径管理的配置陷阱
虚拟机上使用LVM(Logical Volume Manager)管理共享磁盘会导致元数据冲突,给RAC用的ASM磁盘,禁止做LVM逻辑卷,禁止在共享盘上做文件系统。
| 存储方式 | 性能 | 管理复杂度 | 生产环境适用性 |
|---|---|---|---|
| 独立VMDK | 高 | 简单 | 适用 |
| RDM | 高 | 中等 | 适用 |
| NFS | 低 | 简单 | 不适用 |
| iSCSI | 中 | 复杂 | 有条件适用 |
网络与心跳:跨节点通信延迟与丢包的解决细节
RAC的私有网络(Private Interconnect)是集群的生命线,虚拟机化环境下,心跳超时是最头疼的就是高可用性问题。
第7招:私网网卡必须走专用虚拟交换机
不建议把心跳网卡和公共业务网卡放在同一个vSwitch上,广播风暴、ARP泛洪等状况会影响心跳延迟,设一个专属vSwitch,仅给心跳网卡使用,是更稳妥的做法,能有效隔离流量干扰。
第8招:关闭vSwitch上的流量整形
VMware vSwitch的默认流量整形策略会引入几十毫秒的额外延迟,需要关闭vSwitch的“流量整形”功能,同时将MTU(Maximum Transmission Unit)设置为9000(Jumbo Frame),降低大包传输的CPU占用。
- 无特殊需求时,不要对心跳网卡启用VMXNET3的“TCP Segmentation Offload”卸载,部分网卡驱动在虚拟化环境下会导致硬件校验和错误。
第9招:调整私网网卡的“中断合并”阈值
网卡中断合并(Interrupt Coalescing)会把多个小包合成一个中断处理,这本来是降低CPU占用的,但RAC的心跳包很小、频率固定,合并后会让节点产生“为什么半天没收到心跳”的误判,这会导致集群上报节点被驱逐。
# ethtool命令调整中断合并,以eth1为例 ethtool -C eth1 rx-usecs 0 tx-usecs 0
第10招:两节点RAC建议配置双心跳网卡做冗余
虚拟化环境的宿主机网卡故障会导致vSwitch链路中断,建议配置两块心跳网卡,Oracle层面的HAIP(Highly Available IP)会自动负载均衡。多块心跳网卡必须确认系统路由表不冲突,否则走错网口反而加剧延迟。
第11招:接在分布式交换机上的心跳流量要开“独立”
自建的VDS(VMware Distributed Switch)如果开启“NIC Team”负载均衡模式为“基于IP哈希”,心跳节点UDP流可能被分配到不同物理网卡,导致乱序,最简单粗暴的方法:设两台虚拟交换机的上行链路均为单物理网卡,不捆绑。
时间同步与系统层配置:虚拟机的隐形炸弹
第12招:禁止宿主机和虚拟机同时跑时间同步
VMware Tools的“时间同步”功能和Linux内核的NTP/Chrony服务会互相抢占系统时间,配置节点间时钟偏差超过阈值,集群直接进入脑裂防护模式。

操作:在.vmx配置文件中添加tools.syncTime = "FALSE",然后统一用外部Chronyd服务器,国内常用简米云NTP服务器;如果你没有外部NTP联通条件,必须指定一个RAC节点做本地NTP源。
第13招:关闭虚拟机的CPU热插拔
VMware允许动态增加CPU,但Oracle RAC对CPU核心数变化非常敏感,若虚拟机的CPU数量发生变化,Oracle的lm_rtm进程会认为拓扑结构变动,轻则性能抖动,重则集群重启,在虚拟机设置里取消“启用CPU热插拔”勾选。
第14招:时钟源必须使用TSC,而不是HPET
高性能事件定时器的精度在虚拟化环境下远不如CPU的TSC(Time Stamp Counter),在/grub.conf的内核启动项加入clocksource=tsc notsc,避免时间漂移引起CTD频繁波动。
第15招:内存大页(HugePages)必须设置
虚拟机内存大户担心的内存分配问题在RAC中也很重要,Oracle SGA要求使用大页内存,如果在Linux上没启用HugePages,DB的SGA会占用几千个小页,CPU Maga Lock竞争直接拖垮数据库。
# 设置vm.nr_hugepages为SGA大小的1.5倍(单位2MB) echo 'vm.nr_hugepages=2048' >> /etc/sysctl.conf sysctl -p
没有大页内存时,RAC实例的CPU使用率会虚高,表现是us%不高但sys CPU满负荷,数据库整体卡顿。
第16招:注意在配置kernel.shmall和kernel.shmmax
虚拟机内存一般大于物理机,但内核参数里共享内存上限,常被搞错,两个节点必须一致,设置kernel.shmmax=物理内存的一半,kernel.shmall=物理页数的一半,并确保lock bits设置正确。
第17招:sysctl.conf参数在虚拟机快照恢复后会丢
快照回滚后,/etc/sysctl.conf文件回退到旧版本,但运行中的内核内存参数仍是新值,RAC重启后才会加载旧参数,这时没法保证集群配置一致。所以快照回滚后,必须立即重新执行一遍sysctl -p并重启集群服务。
UDEV绑定与ASM磁盘访问:多节点映射失败的终极解法
第18招:UDEV规则要同步到所有节点
手动在node1写了UDEV规则,却忘了复制到node2,是最常见的低级错误,ASM磁盘在node2上变成/dev/sde、/dev/sdf,ASM实例无法正常启动。
第19招:udev规则文件必须设置OWNER为oracle:asmadmin
权限错误时会显示“ORACLE not available”或“ORA-15062”,确保UDEV规则中的OWNER为grid用户(或oracle用户,以实际部署为准),GROUP为asmadmin,同时加MODE=0660。
# 示例片段 KERNEL=="sdb1", OWNER="grid", GROUP="asmadmin", MODE="0660"
第20招:ASM_DISKSTRING只认特定的盘符
在Grid Infrastructure安装时,如果ASM_DISKSTRING指定了/dev/oracleasm/,那么普通/dev/sdb盘就不会被识别,在虚拟机环境中建议ASM_DISKSTRING设为`/dev/oracleasm/`,你不需要总改它。
第21招:两节点启动顺序不一致导致磁盘盘符摆动
node1先开机,sdb是节点一;node2先开机,sdb在node2变成不同的盘,必须用UID绑定来避免,EUDEV绑定了之后还需要再检查一遍/udev,确认Symlink都在。
安装部署与性能验证:怎么确认RAC在虚拟机上是健康的
第22招:runcluvfy.sh的检查项,尽量全过别跳过
每次安装前建议执行cluvfy stage -pre crsinst -n rac1,rac2 -fixup -verbose,它检查的东西比官方文档更细,虚拟机环境最常见的问题是内存锁(MEMLOCK)不够,这个参数在/etc/security/limits.conf里容易漏掉。
第23招:GRID在虚拟机上安装时,必须勾选“为集群配置为Flex Cluster”
官方强烈建议RAC在虚拟机上使用Admin-Managed数据库,默认的Flex Cluster配置能避免很多因节点心跳的虚拟网卡排错问题,该选项存在于Grid安装的配置页面,很多新手会直接忽略。

第24招:虚拟网卡的RX队列要增加
当RAC的业务放在虚拟机上,大量本地连接请求会进入公网(Public)网卡,VMXNET3的RX队列默认只有一个,会导致单核CPU跑满,RAC的TCP回包延迟升高,在虚拟机设置里给网卡增加队列数,或者用ethtool设置channel:
ethtool -L eth0 combined 4
第25招:IO调度器设为none或noop
虚拟机的底层I/O已经被虚拟化层排序,Linux内核的CFQ(Completely Fair Queueing)调度器会多做一遍无意义调度,将块设备IO调度器改为none,多路径时用noop。
echo 'echo noop > /sys/block/sda/queue/scheduler' >> /etc/rc.d/rc.local
第26招:ASM的AU_SIZE适合设大还是设小
虚拟环境的存储适合使用大AU(Allocation Unit)减少元数据分配冲突,配合1MB的ASM磁盘,当外部存储为SSD时,设置AU_SIZE=4M,日志文件组disk_recovery_file_size会分担更大压力,多数情况下,大量小文件系统IO类型适合1MB,大量大文件适合4MB。
第27招:必须检查Redo Log大小和Group数量
VMware的I/O延迟在极端情况可能有几十毫秒,为了配得上这个延迟,redo log建议比物理机增大30%左右,确保每组redo有2个成员,分布在不同虚拟磁盘上,定位用户:如果你用的是云主机,redo落盘延迟比物理机大,需要增加GROUP数量。
第28招:TODO:DB的DB_WRITER_PROCESSES建议等于物理CPU核数
在RAC生产环境中,虚拟机的CPU超分比不要超过1:1.5,如果宿主机负载过高,DBWR进程被调度延迟,RAC会出现“log file sync”等待事件,查询系统表:
show parameter db_writer_processes;
无法动态调整时,必须重启实例。
第29招:禁用Linux透明大页
透明大页(THP)在虚拟化场景,内存碎片化严重,RAC上的SQL执行计划容易卡顿,关闭方法写入/etc/rc.local:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
第30招:拔掉虚拟机的CD-ROM和软驱
很多兜底方案是拔掉光驱、软驱,这些设备在虚拟化层面会被RAC安装脚本误认为硬件变更,引起“CLSRSC-216”错误,拔掉后安装顺畅。
常见问题解答:虚拟机搭建RAC高频疑问
问:虚拟机搭建RAC,用VMware还是VirtualBox?
VMware ESXi是更成熟的企业级选择,各方面都好;VirtualBox能免费完成实验,但要真正解决共享磁盘的问题,需要自己手工配置VMDK的“独立共享”模式,日常练习用VirtualBox,生产或严肃测试不建议。
问:Oracle RAC对虚拟机的CPU和内存有什么最低要求?
官方要求至少2核CPU、4GB内存,但实际搭建双节点RAC,建议物理内存至少16GB,每个节点分配2-4个vCPU,虚拟化环境内存过小,SGA设不上去,ASM实例和DB实例互相争抢内存,日志文件切换慢是必然的。
问:RAC在虚拟机上坏了,怎么最快的定位是虚拟层还是Oracle层?
先停掉Oracle层面的集群服务,用iperf3打心跳网卡的带宽和延迟,如果延迟超过10ms,是网络问题;再对比宿主机磁盘的真实读写速率,低于200MB/s就要检讨存储配置,虚拟化层的问题,要回到宿主机去查,不要一直盯着oracle的alert日志。
虚拟机上跑RAC,多花点时间在设计虚拟化环境上,比调试Oracle本身更能解决问题,共享存储的独立性、心跳网络的隔离、时间同步的收敛,这三点按上面的招数做扎实,集群会稳定得多。这30招里,独立磁盘模式、UUID绑定、禁用时间同步是解决诸多实际问题的三个关键点,建议优先检查这几项。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/922508.html


评论列表(4条)
这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是独立部分,给了我很多新的思路。感谢分享这么好的内容!
读了这篇文章,我深有感触。作者对独立的理解非常深刻,论述也很有逻辑性。内容既有理论深度,又有实践指导意义,确实是一篇值得细细品味的好文章。希望作者能继续创作更多优秀的作品!
这篇文章写得非常好,内容丰富,观点清晰,让我受益匪浅。特别是关于独立的部分,分析得很到位,给了我很多新的启发和思考。感谢作者的精心创作和分享,期待看到更多这样高质量的内容!
@大开心7524:这篇文章的内容非常有价值,我从中学习到了很多新的知识和观点。作者的写作风格简洁明了,却又不失深度,让人读起来很舒服。特别是独立部分,给了我很多新的思路。感谢分享这么好的内容!