Oracle RAC的安装门槛一直不低,主要原因是它要求至少两台服务器以及一套共享存储设备。对于想深入学习RAC架构、练习故障切换和负载均衡的工程师来说,如果没有专门的实验硬件,VirtualBox可以提供一个相当完整的替代方案。VirtualBox的虚拟网络支持内部网络模式,能够模拟RAC所需的专用互连网络;它的共享磁盘机制允许一个虚拟磁盘文件被多个虚拟机同时访问,用来充当OCR、投票盘和ASM数据盘。两个虚拟机节点共用一块虚拟磁盘,再配合合适的磁盘控制器类型,就基本具备了RAC安装的存储条件。

整个实验流程分为几个阶段:首先是创建两台虚拟机并规划三块网卡;然后是创建共享磁盘并在操作系统层面做好持久化绑定;接着完成两个节点之间的SSH互信以及内核参数调整;最后安装Grid Infrastructure、创建ASM磁盘组并部署Oracle数据库软件。每个阶段都有不少细节需要留意,尤其是共享磁盘的控制器类型选择和udev规则的编写方式,这两个地方一旦出错,后续安装就会卡住。
虚拟机网络与共享磁盘的规划
RAC节点之间通常需要两类网络:公共网络和专用互连网络。公共网络负责客户端连接和VIP地址,专用互连网络则承载节点间的心跳和缓存融合流量。在VirtualBox中,公共网络可以选择桥接模式或者NAT网络,专用互连网络建议使用内部网络模式,这样两个节点之间的互连流量不会经过宿主机的物理网卡,延迟更低也更贴近真实RAC的私网环境。每台虚拟机至少配置三块网卡:第一块用于公共通信,第二块用于私网互连,第三块可以留给后续的可选备份网络或者管理用途。IP地址规划要做到两个节点在同一网段,私网地址建议使用独立的子网,比如192.168.10.0/24,公网则根据宿主机所在网段分配。
共享磁盘的创建是VirtualBox模拟RAC环境的核心步骤。使用VBoxManage命令行工具创建虚拟磁盘文件,需要指定磁盘格式为固定大小或者动态分配,固定大小虽然占用的宿主机空间多一些,但性能更稳定。更关键的参数是variant选项,创建共享磁盘时必须使用--variant Fixed或者--variant Split2G配合共享模式。命令大致如下:VBoxManage createmedium disk --filename /data/rac_shared/ocr.vdi --size 5120 --format VDI --variant Fixed。创建完成后,还需要用VBoxManage modifymedium disk /data/rac_shared/ocr.vdi --type shareable将磁盘类型改为可共享。如果跳过这一步,第二个节点在挂载同一磁盘时会直接报错。
磁盘控制器类型的选择同样重要。Oracle RAC的共享磁盘需要支持SCSI持久保留,VirtualBox提供多种控制器,其中SAS控制器和SCSI控制器对共享磁盘的兼容性较好。在虚拟机设置中添加共享磁盘时,建议选择SAS控制器或者虚拟SCSI控制器,而不是默认的SATA控制器。SATA控制器在双节点同时访问时容易出现设备识别不一致的问题。实际经验表明,将每块共享磁盘分别挂载到独立的SAS控制器端口上,可以减少安装过程中的I/O冲突。至少需要三块共享磁盘:一块用于OCR和投票盘,大小5GB左右即可;两块作为ASM数据盘和快速恢复区磁盘,每块根据实验需求分配20GB到50GB不等。如果磁盘空间允许,建议所有共享磁盘都挂载到每台虚拟机的SAS控制器上,并保持两个节点的设备顺序一致,这样后续的udev规则编写会简单很多。
操作系统准备与磁盘持久化绑定
操作系统安装完成后,首先需要确认两个节点能够看到共享磁盘。在Linux系统下可以用lsblk命令查看,如果共享磁盘已挂载,会看到类似sdb、sdc、sdd这样的块设备。但直接使用内核分配的设备名是不安全的,重启后设备名可能发生变化,尤其是在添加或移除其他虚拟磁盘之后。因此需要通过udev规则将共享磁盘绑定到固定的设备名。具体做法是先使用scsi_id命令获取每块共享磁盘的唯一标识符,这个标识符反映的是虚拟磁盘的序列号,而不是宿主机上的文件路径,所以两个节点获取到的标识符是一致的。
udev规则文件通常放在/etc/udev/rules.d/目录下,命名为99-oracle-shared-disk.rules。每一行规则包含匹配条件和赋值操作,通过ENV{ID_SERIAL}匹配特定磁盘,再用SYMLINK创建指向该磁盘的符号链接。写好规则后执行udevadm trigger重新触发设备事件,然后检查/dev/目录下是否出现了预期的软链接名称。需要注意权限设置,规则中应该把共享磁盘的属主设置为oracle用户和oinstall组,否则Grid Infrastructure安装时无法直接访问裸设备。也可以选择不创建软链接,而是将设备直接绑定为固定名称,两种方式的效果类似,但软链接方式在可读性上更好。
用户和组是另一个需要提前准备的事项。两个节点需要创建相同的用户和组,包括oracle用户、grid用户,以及oinstall、dba、asmadmin、asmdba、asmoper等组。UID和GID必须在两个节点完全一致,否则共享存储上的权限校验会出问题。创建命令可以写成脚本在两台机器上分别执行,确保一致性。内核参数调整涉及共享内存、信号量、文件句柄数等内容,建议直接参考Oracle官方文档中的RAC安装前提条件,把kernel.shmmax、kernel.sem、fs.file-max等参数写入/etc/sysctl.conf并执行sysctl -p生效。limits配置同样不可忽略,oracle和grid用户的nofile、nproc等限制需要在/etc/security/limits.conf中设置。
Grid Infrastructure安装与ASM磁盘组创建
在开始Grid Infrastructure安装之前,两个节点之间必须建立SSH互信。安装程序会通过SSH在远程节点上执行命令,如果互信没有配置好,安装过程中的远程操作会反复要求输入密码或者直接失败。配置方法是在grid用户的home目录下生成密钥对,将公钥追加到两个节点的authorized_keys文件中。测试时从每个节点分别SSH到对方节点以及自身节点,确认不需要输入密码即可登录。Oracle提供的安装程序自带SSH互信配置工具,也可以手动完成,手动配置的好处是过程透明,出了问题更容易排查。
Grid Infrastructure安装包解压后执行gridSetup.sh启动图形界面。安装类型选择“为集群配置Oracle Grid Infrastructure”,然后按照向导指定集群名称、节点列表、网络接口分配。公共网卡对应公网地址,专用网卡对应ASM私有网络,VIP地址需要规划好两个节点各自的虚拟IP。存储选项选择“配置标准ASM”,发现路径填写udev规则创建的共享磁盘符号链接。OCR和投票盘可以放在同一个磁盘组中,但生产环境建议分离。安装程序会自动检查各项前置条件,如果前面的内核参数、用户权限、磁盘权限配置无误,检查结果应该是全部通过。安装过程中需要在root用户下执行两个脚本,分别是orainstRoot.sh和root.sh,执行顺序不能颠倒,两个节点都执行完成后安装才会继续。
Grid Infrastructure安装完成后,ASM实例已经在两个节点上运行。接下来使用asmca工具创建ASM磁盘组。创建磁盘组时需要指定冗余级别,双节点环境通常选择外部冗余或者正常冗余。外部冗余依赖底层存储的可靠性,对于实验环境来说足够。将数据盘加入DATA磁盘组,将快速恢复区磁盘加入FRA磁盘组。磁盘组的兼容性参数建议保持默认值,除非有特殊需求。创建完成后可以通过crsctl stat res -t查看集群资源状态,确认ASM实例、监听器、VIP等资源均处于ONLINE状态。如果某些资源启动失败,需要检查日志定位原因,常见的问题包括私网通信不通、磁盘权限错误、时间同步异常等。
数据库软件部署与RAC数据库创建
数据库软件的安装相对独立,在grid用户和oracle用户之间需要做好权限衔接。oracle用户需要属于asmadmin组才能访问ASM实例,安装数据库软件时选择“仅安装数据库软件”,安装类型选择“Oracle Real Application Clusters数据库安装”,节点列表勾选两个节点。安装程序会将软件分发到所有选中节点,这一步依赖之前配置好的SSH互信。安装过程中同样需要在root用户下执行脚本,但数据库软件的root脚本比Grid Infrastructure的简单,主要是设置一些文件权限和注册资源。
数据库软件安装完成后使用DBCA创建RAC数据库。DBCA界面中选择“创建数据库”,存储类型选择“自动存储管理”,数据库文件位置选择之前创建的DATA磁盘组,快速恢复区选择FRA磁盘组。在“数据库选项”步骤中勾选需要安装的组件,如果是纯实验环境可以保持默认。在“管理选项”中可以选择配置Enterprise Manager,但实验环境为了节省资源可以跳过。实例数量选择两个,分别对应两个节点。创建过程中DBCA会自动在ASM中创建数据文件、控制文件和重做日志,并在集群中注册数据库资源。创建完成后用crsctl stat res -t可以看到数据库服务已经在两个节点上运行。
验证RAC环境是否正常工作,可以分别从两个节点连接数据库,确认实例名不同但数据库是同一个。执行查询检查实例状态,例如查看v$active_instances视图,应该能看到两个实例同时处于活动状态。测试故障切换的方式是直接关闭其中一个节点的数据库实例,观察连接是否会被VIP漂移和监听器重新路由到存活节点。如果应用程序连接使用的是SCAN地址或者服务名,切换过程中会有一段短暂的等待时间,之后连接自动恢复。负载均衡可以通过在客户端连接串中设置LOAD_BALANCE=ON来验证,观察新连接是否在两个节点之间轮询分配。整个实验环境搭建完成后,后续可以在此基础上继续练习备份恢复、节点添加删除、补丁升级等进阶操作。

