1. 为什么要在本地环境部署Oracle RAC集群?
在开始动手之前,我们先聊聊为什么要在本地环境折腾Oracle RAC(Real Application Clusters)。作为数据库管理员,我最初接触RAC时也觉得这玩意儿就该跑在生产环境的专业服务器上。但后来发现,本地搭建RAC环境至少有三大不可替代的价值:
首先,本地环境是学习RAC架构的最佳试验场。RAC的核心特性——高可用性、负载均衡、故障自动转移——这些概念光看文档就像隔靴搔痒。只有在本地亲手搭建、故意制造节点故障、观察服务切换过程,才能真正理解其工作原理。我至今记得第一次看到节点宕机后服务无缝转移时的震撼,这种体验看一百遍PPT也得不到。
其次,开发测试需要与生产环境一致的架构。很多公司的测试环境直接用单机Oracle,结果代码一到生产环境的RAC就各种水土不服。SQL性能差异、锁机制变化、连接池配置,这些坑早在本地的RAC环境就能发现和解决。去年我们团队就靠本地RAC测试提前发现了一个序列号生成器的并发问题,避免了生产事故。
最后,对于准备OCM认证的DBA来说,本地RAC环境就是最好的训练场。考试中的很多场景(比如节点驱逐、OCR损坏恢复)都需要肌肉记忆般的熟练度,而云环境的按小时计费显然不适合反复练习。我的OCM备考时,本地虚拟机集群被我折腾重启不下百次。
提示:虽然本文以双节点为例,但所有配置都预留了扩展性。实际使用时只需重复节点配置步骤,即可扩展到更多节点。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备:硬件与软件的黄金组合
2.1 硬件配置方案
很多人觉得RAC必须用企业级服务器,其实不然。我的笔记本(32GB内存,1TB SSD)就能流畅运行双节点RAC测试环境。以下是经过验证的配置方案:
最低配置(能跑但卡):
- 主机:16GB内存,200GB可用空间
- 虚拟机:每个节点至少2核CPU+4GB内存
- 网络:千兆网卡,建议使用桥接模式
推荐配置(流畅操作):
- 主机:32GB内存,500GB SSD
- 虚拟机:每个节点4核CPU+8GB内存
- 网络:最好有两块物理网卡,分别用于public和private网络
我的现用配置是MacBook Pro(M1 Pro芯片,32GB内存)通过UTM运行CentOS虚拟机。虽然ARM架构需要些额外配置,但证明了RAC对硬件并不挑剔。关键是要给共享存储留足空间——OCR、投票盘和数据文件加起来至少需要50GB。
2.2 软件版本选择
软件版本的组合直接影响安装成功率。经过多次踩坑,我总结出几个稳定组合:
| Oracle版本 | 操作系统 | 网格架构版本 | 备注 |
|---|---|---|---|
| 19c | Oracle Linux 7 | 19.3 | 当前最稳定组合 |
| 12c R2 | CentOS 7 | 12.2 | 文档最全的版本 |
| 11g R2 | RHEL 6 | 11.2 | 传统系统常用,但已过时 |
强烈建议使用19c+OL7的组合。去年我做过统计,这个组合的安装成功率比11g高出40%。Oracle官方认证的安装包(比如Oracle Linux的UEK内核)对RAC有特别优化,能避免很多玄学问题。
2.3 网络配置要点
RAC对网络的要求堪称苛刻,这也是大多数安装失败的根本原因。我的建议配置:
-
网络拓扑:
- Public网络:192.168.1.0/24(节点1:192.168.1.101,节点2:192.168.1.102)
- Private网络:192.168.2.0/24(节点间心跳)
- SCAN IP:建议配置三个(如scan-rac.example.com解析到192.168.1.201/202/203)
-
必须检查的项目:
bash复制# 节点间互ping测试 ping -c 3 rac1-public ping -c 3 rac1-priv ping -c 3 rac1-vip # 网络延迟测试(应<1ms) ping -c 10 rac2-priv | grep rtt -
容易忽略的配置:
- 关闭NetworkManager:
systemctl stop NetworkManager; systemctl disable NetworkManager - 禁用IPv6:在/etc/sysctl.conf中添加
net.ipv6.conf.all.disable_ipv6=1 - 设置正确的hosts文件,所有节点必须保持一致
- 关闭NetworkManager:
注意:虚拟机环境下,务必确认MAC地址没有冲突。我曾遇到两个节点的网卡MAC相同导致集群通信异常,这种问题排查起来极其痛苦。
3. 存储配置:从ASM到投票盘的实战细节
3.1 共享存储方案选型
RAC的核心就是共享存储,本地环境常见三种方案:
-
虚拟磁盘方案(适合VMware/VirtualBox):
- 创建共享VMDK文件
- 配置为SCSI控制器,模式选择"Independent"和"Persistent"
- 优点:配置简单,无需额外硬件
- 缺点:性能较差,不适合压力测试
-
iSCSI方案:
- 在主机上搭建iSCSI target
- 节点作为initiator连接
- 我的配置示例:
bash复制# Target端配置(主机) yum install scsi-target-utils tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2024-06.local.rac:sharedisk tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb
-
NFS方案(最简单但官方不推荐):
- 仅适用于测试环境
- 需要设置no_root_squash
- 性能最差但配置最快
我强烈推荐方案2。去年在给客户做POC时,iSCSI方案的稳定性和性能都经受住了考验。关键是要配置多路径(multipath):
bash复制# 节点上的multipath配置示例
devices {
device {
vendor "LIO-ORG"
product "*"
path_grouping_policy multibus
path_selector "round-robin 0"
}
}
3.2 ASM磁盘组规划
ASM的配置直接影响后期运维难度。这是我的黄金法则:
-
磁盘组分类:
- OCR_VOTE:至少3个1GB磁盘(实际环境需要更大)
- DATA:存放数据文件,大小根据需求
- FRA:快速恢复区,通常是DATA的30%
-
关键参数:
sql复制CREATE DISKGROUP OCR_VOTE NORMAL REDUNDANCY DISK '/dev/oracleasm/disks/OCR1','/dev/oracleasm/disks/OCR2' ATTRIBUTE 'compatible.asm'='19.0','au_size'='1M'; CREATE DISKGROUP DATA EXTERNAL REDUNDANCY DISK '/dev/oracleasm/disks/DATA1' ATTRIBUTE 'compatible.rdbms'='19.0.0'; -
实用技巧:
- 先创建小的OCR_VOTE组,安装完成后再扩展
- 使用ASMLib虽然方便但已被Oracle弃用,直接使用UDEV规则更稳妥
- 务必检查磁盘权限:
ls -l /dev/oracleasm/disks/*
3.3 udev规则配置示例
正确的设备权限是ASM正常工作的前提。这是我的标准配置模板(/etc/udev/rules.d/99-oracle-asmdevices.rules):
bash复制KERNEL=="sd*", SUBSYSTEM=="block", PROGRAM=="/usr/lib/udev/scsi_id -g -u -d /dev/$parent", RESULT=="3600508b4000ab12a0000ab12a0000000", SYMLINK+="oracleasm/disks/OCR1", OWNER="grid", GROUP="asmadmin", MODE="0660"
配置后必须:
bash复制udevadm control --reload-rules
udevadm trigger
血泪教训:曾经因为一个磁盘的MODE设成了660而不是0660,导致集群安装到70%失败。细节决定成败!
4. 分步安装指南:从零到集群就绪
4.1 前置检查清单
安装前必须逐项检查:
bash复制# 1. 内存检查(每个节点至少4GB)
grep MemTotal /proc/meminfo
# 2. 交换空间检查
free -h
# 3. 磁盘空间检查(/tmp至少1GB)
df -h /tmp
# 4. 软件包检查(以OL7为例)
rpm -q binutils compat-libcap1 gcc glibc ksh libaio libXext libXtst libX11 libXau libxcb libXi make sysstat
# 5. 内核参数检查
sysctl -p | grep -E 'sem|shm|file-max|ip_local_port_range'
4.2 网格架构安装关键步骤
-
运行gridSetup时的重要选项:
- 选择"Configure a Standard Cluster"
- 存储选择"Automatic Storage Management (ASM)"
- 指定ASM密码(不要与oracle用户相同)
- 在"ASM Disk Groups"页面创建OCR_VOTE磁盘组
-
容易出错的界面:
- "Prerequisite Checks"页面:如果有失败项,不要急着忽略。我曾因为忽略一个"Package cvuqdisk not found"导致后续安装失败
- "Cluster Node Information":确保所有节点VIP都能ping通
- "Management Options":本地环境可以取消EM配置节省资源
-
静默安装示例:
bash复制
./gridSetup.sh -silent -ignorePrereq \ -responseFile /home/grid/grid.rsp \ -waitforcompletion
4.3 数据库软件安装技巧
-
最佳实践顺序:
- 先在一个节点安装数据库软件
- 然后用addNode.sh添加其他节点
- 最后创建数据库
-
创建数据库时的关键选择:
- 模板选择"General Purpose or Transaction Processing"
- 存储选择"ASM"
- 启用ARCHIVELOG模式(即使测试环境也建议开启)
- 字符集必须谨慎选择,推荐AL32UTF8
-
我的常用DBCA静默命令:
bash复制dbca -silent -createDatabase \ -templateName General_Purpose.dbc \ -gdbName orcl -sid orcl \ -characterSet AL32UTF8 \ -createAsContainerDatabase true \ -numberOfPDBs 1 \ -pdbName pdb1 \ -storageType ASM \ -diskGroupName DATA \ -recoveryGroupName FRA \ -emConfiguration NONE
4.4 安装后必须的检查
-
集群健康检查:
bash复制
crsctl check cluster -all -
ASM磁盘组检查:
sql复制SELECT name, state, total_mb, free_mb FROM v$asm_diskgroup; -
服务注册检查:
sql复制SELECT instance_name, status FROM gv$instance; -
SCAN监听测试:
bash复制
tnsping scan-rac.example.com:1521/orcl
5. 常见问题与排错指南
5.1 安装阶段典型错误
-
INS-20802 Oracle Cluster Verification failed:
- 原因:通常是因为网络配置不符合要求
- 解决:运行
cluvfy stage -pre crsinst -n all -verbose查看详情 - 我的案例:曾经因为/etc/hosts文件用了localhost.localdomain导致此错误
-
ORA-15077: could not locate ASM instance serving a required diskgroup:
- 原因:ASM实例未启动或磁盘组未挂载
- 解决:检查
crsctl stat res -t中ASM资源状态 - 高级技巧:可以临时设置
export ORACLE_SID=+ASM1直接连接ASM实例
-
GI安装卡在70%:
- 典型原因:OCR磁盘权限问题
- 应急方案:查看
$GRID_HOME/install/root*.log - 根治方法:确保所有共享磁盘对grid用户可读写
5.2 运行阶段问题处理
-
节点驱逐(Node Eviction):
bash复制# 查看ocssd日志 tail -f $GRID_HOME/log/`hostname`/cssd/ocssd.log # 手动重启集群 crsctl stop cluster -all crsctl start cluster -all -
VIP无法启动:
- 检查网络:
ifconfig -a查看VIP接口是否存在 - 强制重新配置:
crsctl modify resource ora.${NODE_NAME}.vip -attr "AUTO_START=never"然后改回always
- 检查网络:
-
ASM磁盘组脱机:
sql复制-- 强制挂载 ALTER DISKGROUP ALL MOUNT FORCE; -- 检查磁盘路径 SELECT path, header_status FROM v$asm_disk;
5.3 性能调优基础
-
缓存融合(Cache Fusion)优化:
sql复制-- 检查全局缓存等待 SELECT event, total_waits, time_waited FROM gv$system_event WHERE event LIKE 'gc%' ORDER BY time_waited DESC; -
私有网络优化:
bash复制# 检查网络丢包 netstat -su | grep packets # 建议设置(/etc/sysctl.conf) net.core.rmem_max=4194304 net.core.wmem_max=4194304 -
ASM重平衡控制:
sql复制-- 限制重平衡速度 ALTER DISKGROUP DATA REBALANCE POWER 2;
6. 本地RAC的高级玩法
6.1 模拟生产环境故障
本地环境最大的价值就是可以安全地制造各种故障:
-
节点崩溃测试:
bash复制# 在节点1上执行 echo c > /proc/sysrq-trigger # 观察节点2的alert日志 tail -f $ORACLE_BASE/diag/rdbms/orcl/orcl2/trace/alert_orcl2.log -
网络隔离测试:
bash复制# 阻断私有网络 iptables -A INPUT -p all -s rac1-priv -j DROP # 观察集群重组过程 crsctl status cluster -wait
6.2 与开发工具集成
-
连接池配置示例(HikariCP):
java复制HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:oracle:thin:@scan-rac.example.com:1521/orcl"); config.setConnectionTestQuery("SELECT 1 FROM dual"); config.setMaximumPoolSize(50); config.setMinimumIdle(5); config.addDataSourceProperty("oracle.jdbc.fanEnabled", "true"); -
SQL*Plus快捷方式:
bash复制# 在.bashrc中添加 alias rsql='sqlplus sys/"${ORACLE_PWD}"@scan-rac.example.com:1521/orcl as sysdba'
6.3 备份恢复演练
-
RMAN备份脚本示例:
bash复制run { ALLOCATE CHANNEL ch1 DEVICE TYPE DISK CONNECT 'sys/password@rac1'; ALLOCATE CHANNEL ch2 DEVICE TYPE DISK CONNECT 'sys/password@rac2'; BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG; BACKUP CURRENT CONTROLFILE; DELETE NOPROMPT OBSOLETE; } -
跨节点恢复测试:
bash复制# 在节点2恢复节点1的数据文件 rman target / RMAN> CATALOG DATAFILECOPY '/shared_storage/users01.dbf' AS '+DATA/orcl/datafile/users.123.456'; RMAN> RECOVER DATAFILE 4;
经过这些年的RAC运维,我最大的体会是:本地环境搭建的RAC集群就像飞行模拟器,让你在安全的环境中积累宝贵的"飞行小时数"。当生产环境真的出现问题时,那些在本地模拟过的场景会形成条件反射般的应对能力。
