概念架构
Oracle RAC 的概念架构图如下:
在 VMware ESXi 环境下构建 Oracle RAC 测试环境。涵盖 Oracle Linux 9 安装加固、网络配置、共享存储 Multi-Writer 方案、Grid Infrastructure 及数据库软件安装。通过克隆节点、配置 Chrony 时间同步和 ASM 磁盘权限,实现无专用 SAN 硬件的集群部署。

Oracle RAC 的概念架构图如下:

构建私有 RAC 测试环境最大的障碍是需要 Shared Storage。传统上,这需要昂贵的 SAN 硬件。然而,通过在 VMware ESXi 中配置具有 Multi-writer flag 的虚拟磁盘,我们可以模拟专业的存储环境。这种 Poor man's RAC 方案允许在不需要专用物理存储硬件的情况下构建全功能集群。
接下来的章节将逐步演示这一过程。
我们将在 ESXi server (192.168.??.??) 上部署两个运行 Oracle Linux 9 的虚拟机。
| Hostname | Public IP | Private IP | Virtual IP (VIP) | SCAN IP |
|---|---|---|---|---|
| AI261 | 192.168.999.86 | 192.168.888.86 | 192.168.999.28 | 192.168.999.88 |
| AI262 | 192.168.999.87 | 192.168.888.87 | 192.168.999.29 | (Shared) |
创建 4 个 20GB 的磁盘作为 RAC 的共享 ASM 磁盘。
将 Oracle Linux 9 的 ISO 镜像上传到 ESXi 数据存储,然后使用该 ISO 文件启动并安装 Linux。
安装操作系统后,设置 Time Zone 并禁用冲突的服务:
timedatectl set-timezone Asia/Shanghai # 禁用 Firewall 和 SELinux systemctl stop firewalld systemctl disable firewalld sed -i 's/^SELINUX=.*/SELINUX=disabled/g' /etc/selinux/config setenforce 0 # 禁用 Avahi daemon 以防止 Multicast 冲突 systemctl stop avahi-daemon.socket systemctl stop avahi-daemon systemctl disable avahi-daemon.socket systemctl disable avahi-daemon
使用 nmcli 配置 Public Interface。请注意,Private Interconnect 将在后续步骤或通过第二个网卡处理。
nmcli connection modify ens192 ipv4.addresses 192.168.999.86/24 nmcli connection modify ens192 ipv4.gateway 192.168.999.1 nmcli connection modify ens192 ipv4.dns 192.168.888.10 nmcli connection modify ens192 ipv4.method manual nmcli connection up ens192
在两个节点的 /etc/hosts 中配置 IP:
192.168.999.86 AI261 192.168.999.87 AI262 192.168.888.86 AI261-priv 192.168.888.87 AI262-priv 192.168.999.28 AI261-vip 192.168.999.29 AI262-vip 192.168.999.88 AI26-SCAN
利用 Oracle Pre-installation RPM 自动配置 Kernel Parameters 并创建 oracle 用户。之后,手动创建 grid 用户及 ASM 相关的 Groups。
dnf -y install oracle-ai-database-preinstall-26ai # 创建 ASM groups 和 Grid 用户 groupadd -g 54331 asmadmin groupadd -g 54332 asmdba groupadd -g 54333 asmoper useradd -u 54322 -g oinstall -G asmadmin,asmdba,asmoper,dba grid # 更新 Oracle 用户组 usermod -a -G asmdba oracle # 为 grid 用户应用 limits cp /etc/security/limits.d/oracle-ai-database-preinstall-26ai.conf /etc/security/limits.d/grid.conf sed -i 's/oracle/grid/g' /etc/security/limits.d/grid.conf
在 .bash_profile 文件中为 grid 用户配置环境变量:
export ORACLE_BASE=/u01/app/grid export ORACLE_HOME=/u01/app/26ai/grid export ORACLE_SID=+ASM1 export PATH=$ORACLE_HOME/bin:$PATH
为 oracle 用户配置:
export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=/u01/app/oracle/product/26ai/dbhome_1 export ORACLE_SID=AI261 export PATH=$ORACLE_HOME/bin:$PATH
创建目录:
mkdir -p /u01/app/26ai/grid mkdir -p /u01/app/grid mkdir -p /u01/app/oracle/product/26ai/dbhome_1 chown grid:oinstall /u01 -R chown oracle:oinstall /u01/app/oracle -R
克隆第一个节点 (AI261) 以创建 AI262。克隆后修改以下内容:
在 RAC 环境中,Clock Drift 是导致 Cluster Eviction 的主要原因。我们采用两层同步方案。
确保第一个节点配置为从 Host 接收时间。
为了确保节点间的毫秒级精度,将 AI261 配置为 Local Time Master,AI262 作为其 Client。
在 AI261 的 /etc/chrony.conf 中:
local stratum 10 allow 192.168.999.0/24
在 AI262 的 /etc/chrony.conf 中,注释掉以 pool 开头的行,并添加以下内容:
server AI261 iburst
验证同步状态:
[root@AI262 ~]# systemctl restart chronyd [root@AI262 ~]# chronyc makestep 200 OK [root@AI262 ~]# chronyc sources -v MS Name/IP address Stratum Poll Reach LastRx Last sample =============================================================================== ^* AI261 10 6 17 22 +5654ns[ +32ms] +/- 75us
这证实了 AI262 不仅连接到了 Master Node,而且成功同步了时钟。Offset 降至仅 5654 纳秒(几乎为零)。
首先添加第二个 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/sda brw-rw---- 1 root disk 8, 1 Feb 3 15:01 /dev/sda1 brw-rw---- 1 root disk 8, 2 Feb 3 15:01 /dev/sda2 brw-rw---- 1 root disk 8, 16 Feb 3 15:01 /dev/sdb brw-rw---- 1 root disk 8, 32 Feb 3 15:01 /dev/sdc brw-rw---- 1 root disk 8, 48 Feb 3 15:01 /dev/sdd brw-rw---- 1 root disk 8, 64 Feb 3 15:01 /dev/sde [root@AI261 ~]# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 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 /home sdb 8:16 0 20G 0 disk sdc 8:32 0 20G 0 disk sdd 8:48 0 20G 0 disk sde 8:64 0 20G 0 disk sr0 11:0 1 1024M 0 rom
在第一个节点上对磁盘进行分区:
for disk in sdb sdc sdd sde; do fdisk /dev/${disk} <<EOF n p 1 w EOF done
验证新建的分区
[root@AI261 ~]# ll /dev/sd* brw-rw---- 1 root disk 8, 0 Feb 3 15:01 /dev/sda brw-rw---- 1 root disk 8, 1 Feb 3 15:01 /dev/sda1 brw-rw---- 1 root disk 8, 2 Feb 3 15:01 /dev/sda2 brw-rw---- 1 root disk 8, 16 Feb 3 15:03 /dev/sdb brw-rw---- 1 root disk 8, 17 Feb 3 15:03 /dev/sdb1 brw-rw---- 1 root disk 8, 32 Feb 3 15:03 /dev/sdc brw-rw---- 1 root disk 8, 33 Feb 3 15:03 /dev/sdc1 brw-rw---- 1 root disk 8, 48 Feb 3 15:03 /dev/sdd brw-rw---- 1 root disk 8, 49 Feb 3 15:03 /dev/sdd1 brw-rw---- 1 root disk 8, 64 Feb 3 15:03 /dev/sde brw-rw---- 1 root disk 8, 65 Feb 3 15:03 /dev/sde1
在 VM 的 .vmx 文件中,确保设置了 disk.enableuuid = 'TRUE'。
为了确保 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 rules udevadm control --reload-rules # Trigger the rules for all block devices udevadm trigger --type=devices --action=add # Verify ownership and permissions # ls -al /dev/sd[b-e]1 brw-rw---- 1 grid asmdba 8, 17 Feb 3 15:07 /dev/sdb1 brw-rw---- 1 grid asmdba 8, 33 Feb 3 15:07 /dev/sdc1 brw-rw---- 1 grid asmdba 8, 49 Feb 3 15:07 /dev/sdd1 brw-rw---- 1 grid asmdba 8, 65 Feb 3 15:07 /dev/sde1
将 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.sh Launching Oracle Grid Infrastructure Setup Wizard...


选择 Cluster Name 和 SCAN Name,确保 SCAN Name 是可解析的。

添加第二个节点到列表中

配置节点间的 Passwordless SSH connectivity


定义 network configuration.












点击 '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










使用 DBCA 创建数据库。



在 Prerequisite Checks 页面,点击 Ignore All 并继续。



微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online
解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online
CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online