概念架构
Oracle RAC 的概念架构图如下:构建私有 RAC 测试环境最大的障碍是需要 Shared Storage。传统上,这需要昂贵的 SAN 硬件。然而,通过在 VMware ESXi 中配置具有 Multi-writer flag 的虚拟磁盘,我们可以模拟专业的存储环境。这种 Poor man's RAC 方案允许在不需要专用物理存储硬件的情况下构建全功能集群。
接下来的章节将逐步演示这一过程。
测试环境
我们将在 ESXi server (192.168.82.27) 上部署两个运行 Oracle Linux 9 的虚拟机。
IP Address 分配表
创建 4 个 20GB 的磁盘作为 RAC 的共享 ASM 磁盘。
在第一个节点安装 OL9
将 Oracle Linux 9 的 ISO 镜像上传到 ESXi 数据存储,然后使用该 ISO 文件启动并安装 Linux。
操作系统加固
安装操作系统后,设置 Time Zone 并禁用冲突的服务:
timedatectl set-timezone Asia/Shanghai# 禁用 Firewall 和 SELinuxsystemctl stop firewalldsystemctl disable firewalldsed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/configsetenforce 0# 禁用 Avahi daemon 以防止 Multicast 冲突systemctl stop avahi-daemon.socketsystemctl stop avahi-daemonsystemctl disable avahi-daemon.socketsystemctl disable avahi-daemon
网络配置
使用 nmcli 配置 Public Interface。请注意,Private Interconnect 将在后续步骤或通过第二个网卡处理。
nmcli connection modify ens192 ipv4.addresses 192.168.110.86/24nmcli connection modify ens192 ipv4.gateway 192.168.110.1nmcli connection modify ens192 ipv4.dns 192.168.88.10nmcli connection modify ens192 ipv4.method manualnmcli connection up ens192
在两个节点的 /etc/hosts 中配置 IP:
192.168.110.86 AI261192.168.110.87 AI262192.168.80.86 AI261-priv192.168.80.87 AI262-priv192.168.110.28 AI261-vip192.168.110.29 AI262-vip192.168.110.88 AI26-SCAN
Oracle Pre-installation 与用户创建
利用 Oracle Pre-installation RPM 自动配置 Kernel Parameters 并创建 oracle 用户。之后,手动创建 grid 用户及 ASM 相关的 Groups。
dnf -y install oracle-ai-database-preinstall-26ai# 创建 ASM groups 和 Grid 用户groupadd -g 54331 asmadmingroupadd -g 54332 asmdbagroupadd -g 54333 asmoperuseradd -u 54322 -g oinstall -G asmadmin,asmdba,asmoper,dba grid# 更新 Oracle 用户组usermod -a -G asmdba oracle# 为 grid 用户应用 limitscp /etc/security/limits.d/oracle-ai-database-preinstall-26ai.conf /etc/security/limits.d/grid.confsed -i 's/oracle/grid/g' /etc/security/limits.d/grid.conf
环境变量与目录结构
在 .bash_profile 文件中为 grid 用户配置环境变量:
export ORACLE_BASE=/u01/app/gridexport ORACLE_HOME=/u01/app/26ai/gridexport ORACLE_SID=+ASM1export PATH=$ORACLE_HOME/bin:$PATH
为 oracle 用户配置:
export ORACLE_BASE=/u01/app/oracleexport ORACLE_HOME=/u01/app/oracle/product/26ai/dbhome_1export ORACLE_SID=AI261export PATH=$ORACLE_HOME/bin:$PATH
创建目录:
mkdir -p /u01/app/26ai/gridmkdir -p /u01/app/gridmkdir -p /u01/app/oracle/product/26ai/dbhome_1chown grid:oinstall /u01 -Rchown oracle:oinstall /u01/app/oracle -R
创建第二个节点
克隆第一个节点 (AI261) 以创建 AI262。克隆后修改以下内容:
修改 oracle 和 grid 用户的 .bash_profile,将 ORACLE_SID 环境变量从 AI261 修改为 AI262。
时间同步策略
在 RAC 环境中,Clock Drift 是导致 Cluster Eviction 的主要原因。我们采用两层同步方案。
Host-to-Guest 同步
确保第一个节点配置为从 Host 接收时间。
vSphere Client:右键点击 VM -> Edit Settings -> VM Options -> VMware Tools。
Time:勾选 Synchronize guest time with host。
Peer-to-Peer Chrony 配置
为了确保节点间的毫秒级精度,将 AI261 配置为 Local Time Master,AI262 作为其 Client。
在 AI261 的 /etc/chrony.conf 中:
local stratum 10allow 192.168.110.0/24
在 AI262 的 /etc/chrony.conf 中,注释掉以 pool 开头的行,并添加以下内容:
server AI261 iburst
验证同步状态:
[root@AI262 ~]# systemctl restart chronyd[root@AI262 ~]# chronyc makestep200 OK[root@AI262 ~]# chronyc sources -vMS Name/IP address Stratum Poll Reach LastRx Last sample===============================================================================^* AI261 10 6 17 22 +5654ns[ +32ms] +/- 75us
这证实了 AI262 不仅连接到了 Master Node,而且成功同步了时钟。Offset 降至仅 5654 纳秒(几乎为零)。
共享存储配置
Multi-Writer 方案
首先添加第二个 SCSI Controller。所有共享磁盘都将位于此控制器上。
我们将使用 Multi-writer flag 来共享磁盘(VMware 最佳实践),因此 SCSI Bus Sharing 应保持为 None。SCSI Controller 应设置为 VMware Paravirtual 以获得最佳性能。
添加 20GB 新硬盘。
将其添加到新创建的 SCSI Controller 上,将磁盘设置为 Thick provisioned, eagerly zeroed 和 Independent – persistent,并将 Sharing 设置为 Multi-writer。
在第一个节点上添加另外三个 20GB 磁盘,保持与第一个磁盘相同的设置。
接着,在其他节点上通过选择 Existing Hard Disk 添加这四个 VMDK,并将其添加到新创建的 SCSI Controller 中。

启动服务器并检查磁盘:
[root@AI261 ~]# ll /dev/sd*brw-rw---- 1 root disk 8, 0 Feb 3 15:01 /dev/sdabrw-rw---- 1 root disk 8, 1 Feb 3 15:01 /dev/sda1brw-rw---- 1 root disk 8, 2 Feb 3 15:01 /dev/sda2brw-rw---- 1 root disk 8, 16 Feb 3 15:01 /dev/sdbbrw-rw---- 1 root disk 8, 32 Feb 3 15:01 /dev/sdcbrw-rw---- 1 root disk 8, 48 Feb 3 15:01 /dev/sddbrw-rw---- 1 root disk 8, 64 Feb 3 15:01 /dev/sde[root@AI261 ~]# lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSsda 8:0 0 160G 0 disk├─sda1 8:1 0 1G 0 part /boot└─sda2 8:2 0 159G 0 part ├─ol-root 252:0 0 70G 0 lvm / ├─ol-swap 252:1 0 7.9G 0 lvm [SWAP] └─ol-home 252:2 0 81.1G 0 lvm /homesdb 8:16 0 20G 0 disksdc 8:32 0 20G 0 disksdd 8:48 0 20G 0 disksde 8:64 0 20G 0 disksr0 11:0 1 1024M 0 rom
磁盘分区
在第一个节点上对磁盘进行分区:
for disk in sdb sdc sdd sde; dofdisk /dev/${disk} <<EOFnp1wEOFdone
验证新建的分区
[root@AI261 ~]# ll /dev/sd*brw-rw---- 1 root disk 8, 0 Feb 3 15:01 /dev/sdabrw-rw---- 1 root disk 8, 1 Feb 3 15:01 /dev/sda1brw-rw---- 1 root disk 8, 2 Feb 3 15:01 /dev/sda2brw-rw---- 1 root disk 8, 16 Feb 3 15:03 /dev/sdbbrw-rw---- 1 root disk 8, 17 Feb 3 15:03 /dev/sdb1brw-rw---- 1 root disk 8, 32 Feb 3 15:03 /dev/sdcbrw-rw---- 1 root disk 8, 33 Feb 3 15:03 /dev/sdc1brw-rw---- 1 root disk 8, 48 Feb 3 15:03 /dev/sddbrw-rw---- 1 root disk 8, 49 Feb 3 15:03 /dev/sdd1brw-rw---- 1 root disk 8, 64 Feb 3 15:03 /dev/sdebrw-rw---- 1 root disk 8, 65 Feb 3 15:03 /dev/sde1
在 VM 的 .vmx 文件中,确保设置了 disk.enableuuid = "TRUE"。
ASM 设备的 Udev Rules
为了确保 grid 用户在重启后仍能访问磁盘,我们使用 scsi_id 识别磁盘并通过 udev 分配权限。在 Oracle 26ai 中,Group 已从 asmadmin 更改为 asmdba。
识别 UUID:
/usr/lib/udev/scsi_id -g -u -d /dev/sdb1
创建 /etc/udev/rules.d/99-oracle-asm.rules:
KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="36000c2947fc68265290c9ff1a9c58777", OWNER="grid", GROUP="asmdba", MODE="0660"KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="36000c29a2b5bdb6aa0df4285c524b83b", OWNER="grid", GROUP="asmdba", MODE="0660"KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="36000c29a121dc5634ba13ecc45ce9691", OWNER="grid", GROUP="asmdba", MODE="0660"KERNEL=="sd?1", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="36000c2933fbeffeeae7b086679d59069", OWNER="grid", GROUP="asmdba", MODE="0660"
应用并验证 Rules:
# Reload the udev rulesudevadm control --reload-rules# Trigger the rules for all block devicesudevadm trigger --type=devices --action=add# Verify ownership and permissions# ls -al /dev/sd[b-e]1brw-rw---- 1 grid asmdba 8, 17 Feb 3 15:07 /dev/sdb1brw-rw---- 1 grid asmdba 8, 33 Feb 3 15:07 /dev/sdc1brw-rw---- 1 grid asmdba 8, 49 Feb 3 15:07 /dev/sdd1brw-rw---- 1 grid asmdba 8, 65 Feb 3 15:07 /dev/sde1
安装Grid Infrastructure
将 Grid 软件移动到 Grid Home 并解压,随后启动安装向导:
[root@AI261 ~]# mv LINUX.X64_2326100_grid_home.zip /u01/app/26ai/grid/[root@AI261 ~]# su - grid[grid@AI261 ~]$ cd$ORACLE_HOME[grid@AI261 grid]$ unzip -q LINUX.X64_2326100_grid_home.zip[grid@AI261 grid]$ ./gridSetup.shLaunching Oracle Grid Infrastructure Setup Wizard...


选择 Cluster Name 和 SCAN Name,确保 SCAN Name 是可解析的。
添加第二个节点到列表中
配置节点间的 Passwordless SSH connectivity
点击 "Fix & check Again"
注意:我们使用 /etc/hosts 并且已经验证过手动同步,那么 SCAN 和 NTP 的检查失败可以忽略。
安装数据库软件
以 oracle 用户登录安装数据库软件:
[oracle@AI261 ~]$ cd$ORACLE_HOME[oracle@AI261 dbhome_1]$ unzip -q ~/LINUX.X64_2326100_db_home.zip[oracle@AI261 dbhome_1]$ ./runInstaller
在 Prerequisite Checks 页面,点击 Ignore All 并继续。


欢迎关注我的公众号
入群,或者需要我帮您免费解读Oracle AWR报告,请加我的微信