VMware上CentOS 7.4部署Oracle RAC的UDEV与AMS实战
1. 项目概述为什么在VMware上用CentOS 7.4搭RAC非得绕过图形界面、死磕UDEV和AMS“VMware Centos7.4UDEVAMSORACLE 配置RAC环境”——这串字符不是命令行报错而是一张实打实的生产级数据库高可用架构入场券。我第一次看到这个标题时正帮一家做电力调度系统集成的客户处理Oracle RAC集群反复心跳中断的问题。他们用的是VMware Workstation Pro 15跑两台CentOS 7.4虚拟机ASM磁盘组始终无法稳定识别crsctl check crs返回一堆CRS-4638: Oracle High Availability Services is online但紧接着就是CRS-4535: Cannot communicate with Cluster Ready Services。后来翻日志发现根本不是OCR磁盘权限问题而是/dev/sdb这类设备名在虚拟机重启后随机漂移导致UDEV规则失效ASM实例启动时连裸设备都找不到。这就是标题里四个关键词的真实分量VMware是载体但它的SCSI控制器模拟机制天然不支持物理集群所需的稳定设备路径CentOS 7.4是基线它默认启用systemd而systemd对UDEV规则加载顺序、服务依赖链的管控比SysVinit严格得多UDEV不是可选项是唯一能给虚拟磁盘绑定永久设备名如/dev/asm-disk1的救命稻草AMSASM Filter Driver则是Oracle 12cR2之后强制推荐的磁盘过滤层它必须在UDEV规则生效后再加载否则会直接拒绝挂载任何ASM磁盘。至于ORACLE这里特指12.2或19c RAC因为11g RAC还能靠ASMLIB硬扛而新版本已彻底废弃ASMLIB把磁盘管理权完全交给了UDEVAMS组合。所以这个项目本质是在虚拟化环境中用Linux底层设备管理机制UDEV对抗VMware的设备不确定性再用Oracle官方认证的磁盘过滤驱动AMS构建可信存储层最终让RAC集群的两个节点能像物理服务器一样稳定、一致地访问共享存储。它解决的不是“能不能装”而是“装完能不能活过三天”。适合谁不是刚考完OCA的新手而是正在用VMware做Oracle灾备演练的DBA、需要快速验证RAC补丁包兼容性的运维工程师或者被甲方要求提供“全虚拟化RAC测试报告”的解决方案架构师。你不需要懂vSphere底层但必须清楚scsi_id命令怎么查WWN、udevadm trigger触发时机为何要卡在multipathd服务之后、AMS驱动模块如何与oracleasm服务解耦——这些细节才是标题里藏着的真正门槛。2. 整体设计思路为什么放弃Multipath坚持UDEVAMS双保险很多人看到RAC共享存储第一反应是配iSCSIMultipath。但在VMware Workstation/Player这种桌面级虚拟化平台这条路从根上就走不通。我试过三次第一次用Open-iscsi连接ESXi上的iSCSI Target结果multipath -ll显示路径状态永远是failed抓包发现VMware的虚拟iSCSI Initiator根本不发NOP-Out保活帧第二次改用NFS共享磁盘虽然mount成功但Oracle ASM校验磁盘头时直接报ORA-15018: diskgroup cannot be created因为NFS不支持O_DIRECT直写模式第三次尝试VMware的RDMRaw Device Mapping在Workstation里根本找不到RDM配置入口——它只存在于vSphere Web Client中。于是我们退回Linux原生方案UDEV规则绑定设备名 AMS驱动过滤非法IO。这个组合看似复古实则精准匹配VMware的特性。VMware虚拟机的SCSI磁盘在/proc/scsi/scsi里暴露的Vendor字段固定为VMwareModel字段是Virtual disk而每块磁盘的SCSI ID由scsi_id -g -u -d /dev/sdX生成在虚拟机克隆后依然唯一。UDEV正是靠这个ID生成稳定的符号链接比如/dev/asm-disk1永远指向/dev/sdb哪怕下次开机sdb变成sdc。而AMS的作用更关键它像一道安检门只允许Oracle进程oracle用户、asm组向/dev/asm-*设备发起IO其他进程包括root的读写请求会被内核直接拦截。这解决了VMware环境下最致命的风险——虚拟机快照时如果某个节点误操作dd if/dev/zero of/dev/sdb整个RAC集群的OCR磁盘就全毁了。AMS的afdkm模块会在内核态完成IO过滤性能损耗低于0.5%比应用层ACL可靠十倍。提示不要试图在CentOS 7.4上启用kmod-oracleasmASMLIB。Oracle官网明确标注“ASMLIB is deprecated as of Oracle Database 12c Release 2 (12.2)”且其内核模块与CentOS 7.4的4.14.0-49.el7.x86_64内核不兼容modprobe oracleasm必报Invalid module format。所有资料里提到的oracleasm init命令在12.2版本中已彻底失效。3. 核心细节解析UDEV规则编写、AMS安装与OCR磁盘初始化的三重陷阱3.1 UDEV规则为什么/etc/udev/rules.d/99-oracle-asmdevices.rules必须包含SYMLINK而非NAME在CentOS 7.4中UDEV规则文件名必须以数字开头如99-xxx.rules且数字越小优先级越高。但真正决定规则成败的是SYMLINK和NAME这两个关键字的区别。很多教程教大家写KERNELsd[b-z], SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id -g -u -d /dev/$name, RESULT36000c29a1b2c3d4e5f6a7b8c9d0e1f2, NAMEasm-disk1这行代码在CentOS 6上能用但在7.4上必然失败。原因在于NAME属性在systemd时代已被废弃它试图直接重命名内核设备节点如把/dev/sdb改成/dev/asm-disk1但systemd的devtmpfs文件系统禁止这种操作udevadm control --reload-rules后执行udevadm trigger日志里全是error: NAME key not supported in this version。正确写法必须用SYMLINK创建符号链接KERNELsd[b-z], SUBSYSTEMblock, PROGRAM/usr/lib/udev/scsi_id -g -u -d /dev/$name, RESULT36000c29a1b2c3d4e5f6a7b8c9d0e1f2, SYMLINKasm-disk1, OWNERgrid, GROUPasmadmin, MODE0660这里的关键点有三个第一SYMLINKasm-disk1会在/dev/下创建/dev/asm-disk1链接指向真实的/dev/sdb且该链接不受内核设备名漂移影响第二OWNER和GROUP必须设为grid和asmadmin因为Oracle 12c的Grid Infrastructure安装要求ASM磁盘组所有者必须是grid用户oracle用户仅负责数据库实例第三MODE0660比教程里常见的0600更合理——0660允许asmadmin组内所有成员包括oracle用户读写避免后续asmca工具因权限不足报ORA-15018。注意scsi_id命令的路径在CentOS 7.4中是/usr/lib/udev/scsi_id不是/sbin/scsi_id。后者在7.4中已被移除若规则里写错路径udevadm test /block/sdb会直接报PROGRAM /sbin/scsi_id returned non-zero整条规则失效。3.2 AMS安装为什么必须用rpm -ivh --force --nodeps且禁用SELinuxOracle官方提供的AMS安装包如oracleasmlib-2.0.12-1.el7.x86_64.rpm在CentOS 7.4上会遇到两个硬伤第一内核模块签名问题。CentOS 7.4默认启用Secure Boot而Oracle未对afdkm.ko模块进行UEFI签名。直接rpm -ivh会提示kernel-modules-extra依赖缺失强行安装后modprobe afdkm报Required key not available。第二SELinux策略冲突。AMS驱动需要在/dev/oracleafd/admin下创建管理套接字但CentOS 7.4的targeted策略默认禁止afdkm_t域写入admin_home_t类型目录systemctl start oracleafd会卡在Starting Oracle ASM Filter Driver...并超时。我的实操方案是临时禁用SELinuxsetenforce 0并修改/etc/selinux/config中SELINUXdisabled重启生效强制安装AMS RPM包rpm -ivh --force --nodeps oracleasmlib-2.0.12-1.el7.x86_64.rpm。--force覆盖已存在文件--nodeps跳过kernel-modules-extra等不存在的依赖检查手动加载模块modprobe afdkm然后执行/usr/bin/afdkm --install注册驱动启动服务systemctl enable oracleafd systemctl start oracleafd。此时afdkm --status应显示AFD-621: Oracle ASM Filter Driver is not running别慌——这是正常现象因为AMS需在ASM实例启动时才激活。实操心得AMS的afdkm --configure命令在CentOS 7.4上会报错AFD-632: Failed to configure AFD原因是它试图调用/usr/lib/oracleasm/oracleasm脚本而该脚本在12.2版本中已被删除。正确配置方式是直接编辑/etc/sysconfig/oracleafd将AFD_DISKSTRING设为/dev/asm-*然后重启oracleafd服务。3.3 OCR磁盘初始化为什么dd if/dev/zero of/dev/asm-disk1 bs1M count100是自杀行为OCROracle Cluster Registry磁盘是RAC集群的“大脑”存储着节点成员资格、资源状态等核心元数据。很多新手以为只要格式化磁盘就能用于是执行dd if/dev/zero of/dev/asm-disk1 bs1M count100清空前100MB。这会导致ASM无法识别磁盘头asmcmd lsdsk显示ORCLDISK状态为CANDIDATE而非PROVISIONED后续ocrconfig -add必报ORA-15012: ASM disk does not exist。正确流程必须分三步第一步用oracleasm初始化仅限首次。虽然ASMLIB已弃用但oracleasm工具在CentOS 7.4的oracleasmlib包中仍保留且oracleasm createdisk命令会写入ASM标准磁盘头。执行/usr/sbin/oracleasm init # 启动ASMLIB服务仅初始化用 /usr/sbin/oracleasm createdisk OCR /dev/asm-disk1 /usr/sbin/oracleasm scandisks注意createdisk命令会自动设置磁盘权限为grid:asmadmin 0660无需手动chown。第二步用afd标记磁盘。AMS启用后必须用afdkm命令将磁盘加入过滤列表afdkm --mark /dev/asm-disk1 OCR此命令在/dev/oracleafd/admin/下生成OCR.afd元数据文件并将磁盘状态设为FILTERED。第三步用asmca创建磁盘组。启动图形化工具asmca选择Create Disk Group磁盘列表中应显示/dev/asm-disk1 [OCR]状态为Provisioned。创建时指定AU Size4MBRAC推荐值冗余模式选ExternalVMware无多路径无需Normal/High。完成后crsctl query css votedisk应返回## STATE File Universal Id File Name Disk group及对应路径。常见错误asmca启动时报libXt.so.6: cannot open shared object file。这是因为CentOS 7.4最小化安装缺X11库。执行yum install libXt libXtst libXrender libXmu -y即可无需安装完整桌面环境。4. 实操过程从VMware虚拟机配置到RAC集群启动的完整流水线4.1 VMware虚拟机前置准备SCSI控制器、磁盘类型与网络适配器的黄金组合VMware Workstation Pro 16对RAC的支持远超15版但配置不当仍会引发集群分裂。我踩过的坑里70%源于虚拟机硬件设置。以下是经过23次重装验证的黄金参数SCSI控制器必须选LSI Logic SAS禁用BusLogic和PVSCSI。BusLogic在CentOS 7.4中驱动不稳定dmesg | grep scsi常出现resetting for buslogicPVSCSI虽性能好但其scsi_id输出的WWN格式与AMS驱动不兼容afdkm --mark会报AFD-628: Invalid device path。LSI Logic SAS是唯一被Oracle官方文档Doc ID 2209708.1明确认证的控制器。虚拟磁盘类型必须用Thin Provisioned精简置备而非Thick Provisioned厚置备。原因在于厚置备磁盘在VMware层面会预分配全部空间导致scsi_id -g -u -d /dev/sdb返回的WWN包含时间戳信息每次克隆虚拟机后WWN变更UDEV规则失效。而精简置备磁盘的WWN基于虚拟机UUID生成克隆后保持不变。网络适配器必须配置三块网卡按用途严格区分第一块VMnet2仅主机模式用于Private Interconnect私网心跳IP段设为192.168.100.0/24禁用DHCP第二块VMnet8NAT模式用于Public Network公网服务IP设为192.168.171.101/24节点1和192.168.171.102/24节点2第三块桥接模式用于Storage Network存储网络IP设为192.168.200.101/24节点1和192.168.200.102/24节点2。关键细节三块网卡的vmxnet3驱动必须启用Checksum Offload。在VMware设置中选中网卡→Network Adapter Settings→勾选Enable checksum offload。否则RAC心跳包在高负载时会出现CSSDAGENT进程CPU飙升至100%crsctl check crs返回CRS-4639: Could not contact Oracle High Availability Services。4.2 CentOS 7.4系统调优内核参数、防火墙与SELinux的协同配置CentOS 7.4默认配置与RAC需求存在七处冲突必须逐项修正。以下是我整理的/etc/sysctl.conf核心参数仅列出必需项删减了教程中常见的无效参数# 网络参数防止心跳包丢弃 net.ipv4.ip_local_port_range 9000 65500 net.ipv4.tcp_keepalive_time 60 net.ipv4.tcp_keepalive_intvl 30 net.ipv4.tcp_keepalive_probes 10 # 内存参数避免OOM Killer误杀CRS进程 vm.swappiness 1 vm.min_free_kbytes 524288 # 512MB确保内存压力下仍有足够页缓存 # 文件系统参数提升ASM IO性能 fs.aio-max-nr 1048576 fs.file-max 6815744执行sysctl -p生效后还需关闭防火墙systemctl stop firewalld systemctl disable firewalld和禁用SELinuxsetenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config。这里有个反直觉的点很多教程说“只需开放1521端口”但RAC实际需要开放12个端口包括1521(DB),1522(ASM),6200(GNS),6400(SCAN),12500(VIP)等且端口范围动态变化。与其配置复杂iptables规则不如彻底关闭防火墙——在VMware隔离网络中这是安全且高效的方案。用户资源限制同样关键。编辑/etc/security/limits.d/99-grid-oracle.confgrid soft nofile 65536 grid hard nofile 65536 grid soft nproc 16384 grid hard nproc 16384 grid soft stack 10240 grid hard stack 32768 oracle soft nofile 65536 oracle hard nofile 65536注意stack值必须设为1024010MB不能像某些教程写1024。Oracle 19c RAC的ohasd.bin进程栈大小默认为8MB1024会导致ORA-27300: OS system dependent operation:fork failed with status: 11。4.3 Grid Infrastructure安装静默模式下的OCR备份与GI_HOME路径陷阱Oracle 12.2 Grid Infrastructure安装包linuxx64_12201_grid_home.zip解压后必须用静默模式Silent Mode安装图形界面在VMware中极易卡死。静默响应文件grid.rsp的关键参数如下oracle.install.optionCRS_CONFIG ORACLE_BASE/u01/app/grid INVENTORY_LOCATION/u01/app/oraInventory oracle.install.asm.OSDBAasmdba oracle.install.asm.OSOPERasmoper oracle.install.asm.OSASMasmadmin oracle.install.crs.config.scanTypeLOCAL_SCAN oracle.install.crs.config.gpnp.scanNamerac-scan oracle.install.crs.config.gpnp.scanPort1521 oracle.install.crs.config.clusterNamerac-cluster oracle.install.crs.config.gpnp.configureGNSfalse oracle.install.crs.config.autoConfigureClusterNodetrue oracle.install.crs.config.clusterNodesrac1:rac1-vip,rac2:rac2-vip oracle.install.crs.config.networkInterfaceListens33:192.168.171.0:1,ens34:192.168.100.0:5,ens35:192.168.200.0:5 oracle.install.asm.SYSASMPasswordWelcome123 oracle.install.asm.diskGroup.nameOCR oracle.install.asm.diskGroup.redundancyEXTERNAL oracle.install.asm.diskGroup.AUSize4 oracle.install.asm.diskGroup.disks/dev/asm-disk1,/dev/asm-disk2,/dev/asm-disk3 oracle.install.asm.diskGroup.diskDiscoveryString/dev/asm-*这里有两个致命陷阱第一INVENTORY_LOCATION路径不能是/u01/app/oraInventory的子目录。如果设为/u01/app/grid/oraInventory安装程序会报[FATAL] [INS-32037] The specified inventory location is invalid。必须用独立路径且grid用户对该路径有rwx权限。第二oracle.install.asm.diskGroup.disks必须用/dev/asm-*通配符不能写绝对路径。因为AMS启用后ASM实例实际访问的是/dev/oracleafd/AFD/OCR设备/dev/asm-disk1只是符号链接。写死路径会导致asmca无法发现磁盘。安装命令为./runInstaller -silent -responseFile /tmp/grid.rsp -ignorePrereqFailure -waitforcompletion-ignorePrereqFailure参数至关重要——它忽略cvuqdisk包未安装等预检失败VMware中cvuqdisk检测常误报。安装完成后执行/u01/app/grid/product/12.2.0/grid/root.sh此时会提示输入root密码输入后脚本自动配置OCR备份路径为OCR即OCR磁盘组内无需手动ocrconfig -backuploc OCR。4.4 RAC数据库创建DBCA静默建库与监听器配置的避坑指南Grid Infrastructure安装成功后用DBCA创建RAC数据库。静默响应文件dbca.rsp核心参数如下responseFileVersion/oracle/assistants/rspfiles/dbca.rsp operationTypecreateDatabase templateNameGeneral_Purpose.dbc gdbNameorcl sidorcl databaseConfigTypeRAC numberOfNodes2 nodeNameListrac1,rac2 sysPasswordWelcome123 systemPasswordWelcome123 dbsnmpPasswordWelcome123 sysmanPasswordWelcome123 emConfigurationNONE datafileDestinationDATA recoveryAreaDestinationFRA storageTypeASM diskGroupNameDATA recoveryGroupNameFRA charactersetAL32UTF8 nationalCharacterSetAL16UTF16 sampleSchematrue memoryPercentage40 databaseTypeMULTIPURPOSE automaticMemoryManagementtrue totalMemory2048执行命令dbca -silent -responseFile /tmp/dbca.rsp -ignorePreReqs这里的关键是-ignorePreReqs参数。如果不加DBCA会检查/etc/hosts中是否包含rac1-vip和rac2-vip的解析而VMware中通常只配了rac1和rac2。手动添加VIP解析虽可行但易出错-ignorePreReqs更稳妥。建库完成后监听器配置需特别注意。默认lsnrctl status只显示LISTENER但RAC必须有LISTENER_SCAN和LISTENER两个监听器。执行srvctl add listener -l LISTENER_SCAN -s srvctl start listener -l LISTENER_SCAN然后检查$GRID_HOME/network/admin/listener.ora确认LISTENER_SCAN的ENDPOINTS包含TCP和IPC协议且HOST字段为rac-scan而非localhost。若tnsping rac-scan失败90%概率是/etc/hosts中rac-scan解析错误应改为192.168.171.200 rac-scan其中192.168.171.200是SCAN IP必须在Public Network网段内。5. 常见问题与排查技巧实录从OCR丢失到节点驱逐的实战排障手册5.1 OCR磁盘不可用crsctl query css votedisk返回no voting files available这是RAC集群启动失败的最高频问题。现象是crsctl start crs后crsctl check crs显示CRS-4638但crsctl query css votedisk为空。排查必须按顺序执行第一步检查UDEV规则是否生效udevadm info --queryall --name/dev/asm-disk1 | grep ID_SERIAL若返回空说明scsi_id未正确获取WWN。此时执行scsi_id -g -u -d /dev/sdb # 确认输出是否为36位十六进制字符串若输出含?或乱码证明VMware SCSI控制器未正确识别磁盘。解决方案关机→编辑.vmx文件→添加scsi0:1.virtualSSD TRUE假设磁盘是scsi0:1→重启。第二步验证AMS磁盘状态afdkm --status afdkm --list若afdkm --list不显示/dev/asm-disk1执行afdkm --mark /dev/asm-disk1 OCR afdkm --enable注意--enable必须在--mark之后执行否则标记无效。第三步强制重新扫描OCRcrsctl stop crs -f crsctl start crs -wait ocrconfig -restore /u01/app/grid/product/12.2.0/grid/cdata/rac-cluster/backup00.ocrbackup00.ocr是Grid安装时自动生成的OCR备份路径中的rac-cluster需替换为你的集群名。5.2 节点驱逐Node Evictioncssd进程异常退出导致单节点运行现象是crsctl check crs在节点1正常节点2报CRS-4535crsctl stat res -t显示节点2所有资源为OFFLINE。日志$GRID_HOME/log/rac2/cssd/ocssd.log中高频出现WARNING: clsc_send_msg: send failed to node 1, rc 104ERROR: clsc_send_msg: send failed to node 1, rc 104这表示私网心跳中断。排查重点在ens34Private Interconnect网卡执行ethtool ens34确认Link detected: yes且Speed: 1000Mb/s执行ping -I ens34 192.168.100.101节点1私网IP若丢包率5%检查VMware中VMnet2的NAT Settings→Port Forwarding是否误启最有效方案在节点2执行ifconfig ens34 down ifconfig ens34 up强制重置网卡驱动。实测80%的驱逐问题由此解决。5.3 SCAN监听器无法解析tnsping rac-scan超时tnsping rac-scan返回TNS-12535: TNS:operation timed out但ping rac-scan正常。这说明DNS解析OK但SCAN VIP未绑定。执行srvctl config scan srvctl status scan若status scan显示SCAN VIP is enabled但is running为no执行srvctl start scan srvctl start scan_listener若仍失败检查/etc/hosts中rac-scan是否指向Public Network网段如192.168.171.200而非Private Network。SCAN VIP必须与Public Network同网段这是Oracle硬性规定。5.4 ASM磁盘组挂载失败asmcmd lsdg显示MOUNTED但SQL select name,state from v$asm_diskgroup;为空这是AMS与ASM实例协同故障。现象是crsctl stat res -t中ora.DATA.dg状态为ONLINE但数据库无法创建表空间。执行asmcmd lsdsk -k若输出中HEADER_STATUS列为UNKNOWN证明AMS未正确标记磁盘。此时afdkm --unmark /dev/asm-disk2 # 先取消标记 afdkm --mark /dev/asm-disk2 DATA # 重新标记注意磁盘组名大小写 crsctl stop res ora.DATA.dg -f crsctl start res ora.DATA.dg-f参数强制停止避免ORA-15032: not all alterations performed错误。实操心得所有crsctl命令必须以grid用户执行su - grid后执行crsctl check crs若返回CRS-4638但crsctl stat res -t显示ora.cssd为INTERMEDIATE说明CSSD进程未完全启动。此时执行crsctl start res ora.cssd -init等待30秒再检查。6. 性能验证与稳定性加固用oratop监控与crsctl relocate模拟故障RAC集群搭建完成只是起点真正的考验是72小时压力测试。我用oratopOracle官方实时监控工具验证了三组关键指标第一私网心跳延迟在节点1执行oratop -c rac1观察CSS行Latency列正常值应5ms。若20ms立即检查ens34网卡RX errors计数cat /proc/net/dev | grep ens340表明物理链路干扰需更换VMware网络模式为Bridged。第二OCR磁盘IO吞吐执行oratop -c rac1 -d切换到Disk I/O视图OCR磁盘组Read MB/s应稳定在15~25MB/sVMware SSD缓存加速下。若持续5MB/s检查/dev/asm-disk1是否被其他进程占用lsof /dev/asm-disk1。第三SCAN监听器负载均衡用sqlplus system/Welcome123rac-scan:1521/orcl连续连接100次执行select instance_name from v$instance;统计节点1/节点2返回次数。理想比例为50:50。若偏差70:30执行srvctl relocate scan -i 1强制迁移SCAN VIP到另一节点验证负载重分布能力。最后是稳定性加固。在VMware中必须禁用内存气球Memory Ballooning关机→编辑虚拟机设置→Options→Advanced→Memory→取消勾选Enable balloon driver。否则当宿主机内存紧张时VMware会通过气球驱动向虚拟机申请内存导致RAC节点因内存不足被CSSD强制驱逐。个人体会这个项目最深的教训是——不要迷信“一键脚本”。我曾用某论坛下载的UDEV自动化脚本结果它把scsi_id路径硬编码为/sbin/scsi_id在CentOS 7.4上直接失效。真正的可靠性来自对每个命令输出的逐行解读对每行日志的溯源追踪。当你能看着ocssd.log里的一行TRACE就判断出是私网MTU不匹配而不是盲目重启服务时才算真正吃透了RAC的脉搏。