文章目录
-
- 概念架构
- 测试环境
-
- [IP Address 分配表](#IP Address 分配表)
- [在第一个节点安装 OL9](#在第一个节点安装 OL9)
- 创建第二个节点
- 时间同步策略
-
- [Host-to-Guest 同步](#Host-to-Guest 同步)
- [Peer-to-Peer Chrony 配置](#Peer-to-Peer Chrony 配置)
- 共享存储配置
-
- [Multi-Writer 方案](#Multi-Writer 方案)
- 磁盘分区
- [ASM 设备的 Udev Rules](#ASM 设备的 Udev Rules)
- [安装Grid Infrastructure](#安装Grid Infrastructure)
- 安装数据库软件
- 创建数据库
关于号主,姚远:
- Oracle ACE(Oracle和MySQL数据库方向)
- 华为云最有价值专家
- 《MySQL 8.0运维与优化》的作者
- 拥有数十项数据库认证
- 曾任IBM公司数据库部门经理
- 20+年DBA经验,服务2万+客户
- 精通C和Java,发明两项计算机专利
- 两次获得国家部级奖
概念架构
Oracle RAC 的概念架构图如下:

构建私有 RAC 测试环境最大的障碍是需要 Shared Storage。传统上,这需要昂贵的 SAN 硬件。然而,通过在 VMware ESXi 中配置具有 Multi-writer flag 的虚拟磁盘,我们可以模拟专业的存储环境。这种 Poor man's RAC 方案允许在不需要专用物理存储硬件的情况下构建全功能集群。
接下来的章节将逐步演示这一过程。
测试环境
我们将在 ESXi server (192.168.??.??) 上部署两个运行 Oracle Linux 9 的虚拟机。
IP Address 分配表
| 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 磁盘。
在第一个节点安装 OL9
将 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 与用户创建
利用 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。克隆后修改以下内容:
-
修改 IP 地址。
-
修改 Hostname。
-
添加与 Node 1 共享的磁盘。
-
修改 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 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 纳秒(几乎为零)。
共享存储配置
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/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"。
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 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 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.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 并继续。

