Oracle 19c RAC集群搭建实战:从规划部署到高可用架构实现
1. 项目概述:为什么需要Oracle RAC?
在数据库领域,高可用性和可扩展性是两个永恒的追求。想象一下,一个核心业务系统,如果数据库服务器宕机,整个业务就会停摆,这种单点故障的风险是任何企业都无法承受的。同时,随着业务量的增长,单一服务器的性能瓶颈也会日益凸显。Oracle Real Application Clusters,也就是我们常说的RAC,就是为了解决这两个核心痛点而生的。
简单来说,Oracle RAC允许你将一个Oracle数据库运行在多台服务器(节点)上,这些服务器通过高速网络互联,并共享同一份存储。从应用的角度看,它仍然是一个单一的数据库,但背后有多台服务器在同时为其工作。这意味着,即使其中一台服务器硬件故障,其他服务器可以立即接管其工作,保证数据库服务不中断,实现了真正的高可用。另一方面,当业务压力增大时,你可以通过简单地增加服务器节点来线性地提升整个数据库集群的处理能力,这就是横向扩展的魅力。
我这次搭建的是Oracle 19c RAC。19c是Oracle 12c以来“多租户”架构的长期支持版本,以其稳定性和新特性备受青睐。搭建一个RAC集群,尤其是从零开始,是一个系统性工程,涉及操作系统配置、网络规划、共享存储准备、集群软件安装、数据库软件安装和数据库创建等多个环节。任何一个环节的疏漏都可能导致前功尽弃。接下来,我将结合我多次搭建的经验,为你拆解整个流程中的核心思路、实操要点和那些容易踩坑的细节。
2. 集群整体设计与基础环境规划
搭建RAC不是简单的软件安装,而是一次精密的架构部署。在动手敲第一条命令之前,周密的规划是成功的一半。这个阶段的目标是构建一个稳定、高效的底层运行平台。
2.1 硬件与网络架构设计
一个典型的双节点RAC集群,其物理架构可以概括为“两台服务器,一套存储,三张网卡”。让我们深入看看每个部分的作用。
首先是服务器节点。建议两个节点的硬件配置(CPU、内存)尽可能一致,以避免潜在的资源分配不均和性能瓶颈。操作系统我选择的是Oracle Linux 7.9,因为它与Oracle软件有最好的兼容性,预装了必要的依赖包,能省去很多麻烦。
网络部分是RAC的神经系统,至关重要。我们需要为每个节点配置至少三块网卡,分别承担不同的流量:
- 公共网络:用于节点与外部客户端、应用服务器通信。它需要配置一个固定的公共IP地址(比如192.168.1.101/102)和一个虚拟IP(VIP,如192.168.1.201/202)。VIP是实现高可用故障转移的关键——当某个节点宕机,其VIP会漂移到存活节点,应用无需修改连接字符串即可重连。
- 私有网络:用于节点间高速内部通信,如缓存融合(Cache Fusion)数据块传输、心跳检测、集群同步服务(CSS)通信。这部分流量巨大且延迟敏感,必须使用万兆或更高速的网络,并且与公共网络物理隔离。通常使用交换机直连或专用交换机。IP地址规划在另一个私有网段,如172.16.1.1/2。
- 存储网络:用于节点访问共享存储。在传统的SAN(存储区域网络)环境中,这通常通过光纤通道(FC)或iSCSI实现。如果使用NAS(如NFS),则可能通过公共或私有网络承载。
共享存储是RAC的基石,所有节点必须能并发读写同一份数据文件、控制文件、重做日志文件等。常见的选项有ASM(Oracle自动存储管理,推荐)、OCFS2(Oracle集群文件系统)或厂商提供的集群文件系统。我强烈推荐使用ASM,因为它由Oracle原生提供,专为RAC设计,能自动管理磁盘组、提供镜像和条带化,简化了存储管理。
2.2 操作系统前置配置详解
操作系统安装完成后,有一系列必须完成的标准化配置。这些配置确保了环境的一致性,满足了Oracle软件安装和运行的最低要求。
主机名与网络配置:每个节点的主机名需要能解析到其公共IP。我通常会在每个节点的/etc/hosts文件中静态配置所有地址,这比依赖DNS更可靠。文件内容大致如下:
# Public Network 192.168.1.101 rac01.example.com rac01 192.168.1.102 rac02.example.com rac02 192.168.1.201 rac01-vip.example.com rac01-vip 192.168.1.202 rac02-vip.example.com rac02-vip # Private Network 172.16.1.1 rac01-priv.example.com rac01-priv 172.16.1.2 rac02-priv.example.com rac02-priv # SCAN (Single Client Access Name) 192.168.1.210 rac-scan.example.com rac-scan注意SCAN(单客户端访问名),它是一个域名,解析到三个IP地址(需要在DNS中配置轮询,或直接在hosts里写三个),为客户端提供统一的连接端点,实现负载均衡。
内核参数与资源限制:Oracle数据库对内核参数(如共享内存、信号量、网络端口范围)和用户资源限制(如进程数、文件句柄数)有特定要求。我们需要修改/etc/sysctl.conf和/etc/security/limits.conf文件。具体参数值可以在Oracle官方文档中找到,但一个常见的做法是运行Oracle提供的gridSetup.sh或runcluvfy.sh预检查脚本,它会给出需要调整的具体建议。
用户与组创建:需要创建两个主要的操作系统用户和对应的组。
- grid用户:用于安装和管理Oracle Grid Infrastructure(GI),GI包含了集群软件(Clusterware)和ASM。主要属组是
oinstall,管理组是asmadmin和asmdba。 - oracle用户:用于安装和管理Oracle数据库软件。主要属组是
oinstall,管理组是dba。
共享存储准备与ASM磁盘发现:这是关键一步。确保共享磁盘(LUN)在所有节点上可见,并且权限正确。通常需要配置多路径软件(如multipath)来聚合存储阵列提供的多条路径。然后,使用udev规则或ASMLib为这些磁盘配置持久化命名和权限,确保grid用户有读写权限。你可以用lsblk或multipath -ll命令来查看磁盘。配置好后,一个重要的检查是:从两个节点分别运行oracleasm scandisks和oracleasm listdisks(如果使用ASMLib),看到的磁盘列表和主要/次要设备号应该完全一致。
注意:在配置
/etc/hosts时,务必确保没有重复的IP地址,并且主机名解析完全正确。一个常见的错误是在某个节点上错误地配置了另一个节点的IP,这会导致集群安装或启动时出现诡异的网络通信失败。我习惯在配置完成后,在每个节点上ping一遍所有的主机名和VIP,确保双向通信都畅通无阻。
3. Grid Infrastructure安装与配置实战
Grid Infrastructure是RAC的“操作系统”,它负责管理集群成员、节点监控、故障转移和存储资源。安装GI是整个过程中最复杂、最容易出错的一环。
3.1 软件解压与响应文件准备
从Oracle官网下载19c的Grid Infrastructure安装包。解压后,我强烈建议使用静默安装方式,因为它可重复、可预测,并且便于记录和排错。静默安装依赖于一个响应文件(response file)。
你可以通过图形界面安装一次,在最后一步选择“保存响应文件”,从而得到一个模板。或者,直接修改软件包自带的示例响应文件。关键参数需要仔细核对:
ORACLE_HOSTNAME:当前节点的主机名。INVENTORY_LOCATION:Oracle清单目录。SELECTED_LANGUAGES:选择en, zh_CN(如果需中文)。oracle.install.option:选择CRS_CONFIG,表示安装集群软件。ORACLE_BASE,ORACLE_HOME:设置Grid Infrastructure的家目录。oracle.install.asm.OSDBA,oracle.install.asm.OSOPER,oracle.install.asm.OSASM:设置为对应的组asmdba,asmoper,asmadmin。- 集群配置:指定集群名称(
oracle.install.crs.config.clusterName)、SCAN名称和端口、节点信息(名称、VIP、私有主机名)。 - 存储配置:选择“配置ASM”的磁盘组。这里需要指定用于创建OCR(Oracle集群注册表)和Voting Disk的磁盘组。OCR存储集群配置,Voting Disk用于节点间心跳仲裁,它们对高可用至关重要,必须使用外部冗余(至少2块磁盘)或普通冗余(至少3块磁盘)。
3.2 运行安装与集群配置
首先,以grid用户身份,运行集群验证工具:./runcluvfy.sh stage -pre crsinst -n rac01,rac02 -verbose。这个工具会全面检查系统环境是否满足要求,包括网络、存储、内核参数等。必须确保所有检查项都通过(或至少没有FAIL项),才能继续安装。
然后,在第一个节点(rac01)上启动静默安装:
./gridSetup.sh -silent -responseFile /path/to/your_grid.rsp安装程序会首先将软件拷贝到本地,然后进行配置。在配置阶段,它会自动将必要的软件推送到第二个节点(rac02)并进行配置。整个过程会在终端显示详细的日志,你需要密切关注是否有错误出现。日志文件通常位于$ORACLE_BASE/oraInventory/logs下。
安装完成后,需要以root身份在两个节点上依次执行指定的脚本。这些脚本会配置守护进程、创建资源等。务必严格按照屏幕提示的顺序执行。
最后,验证集群状态。以grid用户执行:
crsctl stat res -t这个命令会列出所有集群资源(如ora.<cluster_name>.db,ora.<node>.vip,ora.asm等)的状态,正常情况下应该都是ONLINE。
3.3 ASM磁盘组创建与管理
GI安装时可能已经创建了一个用于OCR/Voting的磁盘组(比如+DATA)。我们通常还需要为数据库文件创建额外的磁盘组(比如+DATA用于数据,+FRA用于快速恢复区)。
使用ASM命令行工具asmca(图形界面)或sqlplus连接ASM实例来创建。ASM实例的SID通常是+ASM1,+ASM2。
sqlplus / as sysasm CREATE DISKGROUP DATA NORMAL REDUNDANCY DISK '/dev/oracleasm/disks/DISK1', '/dev/oracleasm/disks/DISK2' ATTRIBUTE 'au_size'='4M';这里NORMAL REDUNDANCY表示双路镜像,至少需要两块磁盘。au_size是分配单元大小,对于OLTP系统,4M是常用值。
实操心得:在运行
gridSetup.sh之前,一定要确保grid用户对安装目录(ORACLE_BASE,ORACLE_HOME)有完全的读写权限,并且磁盘空间充足。我曾遇到因为/tmp空间不足导致安装失败的情况。另外,执行root脚本时,如果中途报错,不要盲目重试。先仔细查看错误日志,通常位于/etc/oracle或$GRID_HOME/log/<hostname>目录下。一个常见的错误是ohasd服务启动失败,这往往与/etc/hosts配置或网络接口的命名规则(如eth0 vs ens192)有关。
4. Oracle数据库软件安装与RAC数据库创建
GI搭建好后,相当于准备好了舞台。接下来就是在舞台上安装数据库软件并创建数据库这个“演员”了。
4.1 数据库软件安装
切换到oracle用户,解压Oracle数据库软件安装包。同样推荐使用静默安装。响应文件的关键参数包括:
oracle.install.option:选择INSTALL_DB_SWONLY,仅安装数据库软件。ORACLE_HOSTNAME:当前节点主机名。UNIX_GROUP_NAME:oinstall。INVENTORY_LOCATION:与GI安装时相同或不同的清单目录。ORACLE_BASE,ORACLE_HOME:设置数据库软件的家目录。oracle.install.db.InstallEdition:选择企业版EE。oracle.install.db.OSDBA_GROUP:dba。oracle.install.db.OSOPER_GROUP:oper(如有)。oracle.install.db.OSBACKUPDBA_GROUP,OSDGDBA_GROUP,OSKMDBA_GROUP:分别设置为backupdba,dgdba,kmdba。oracle.install.db.CLUSTER_NODES:指定所有节点名,如rac01,rac02。
在第一个节点运行:
./runInstaller -silent -responseFile /path/to/your_db.rsp安装程序会自动将软件推送到其他节点。安装完成后,同样需要以root身份在所有节点上执行指定的root.sh脚本。
4.2 使用DBCA创建RAC数据库
数据库软件安装好后,使用dbca(数据库配置助手)来创建数据库。在19c中,dbca也支持静默模式,但首次创建时,使用图形界面更直观,因为它涉及到很多选择。
关键步骤包括:
- 选择操作:“创建数据库”。
- 创建模式:“高级配置”。
- 数据库类型:根据用途选择,如“一般用途或事务处理”。
- 节点选择:勾选所有要加入集群的节点(rac01, rac02)。
- 数据库标识:指定全局数据库名(如
racdb.example.com)和SID前缀(如racdb)。每个实例的SID会自动生成(racdb1,racdb2)。 - 管理选项:通常不配置EM Express(Enterprise Manager Database Express)。
- 数据库身份证明:为SYS, SYSTEM等管理员用户设置统一密码。
- 存储位置:这是重点。存储类型选择“自动存储管理(ASM)”。数据文件位置指定之前创建的ASM磁盘组,例如
+DATA。快速恢复区也指定一个ASM磁盘组,如+FRA。 - 数据库选项:选择需要的组件(如Oracle Text, OLAP等)。
- 初始化参数:设置内存管理(如自动内存管理AMM)、字符集(推荐AL32UTF8)、进程数等。对于RAC,需要特别注意
cluster_database参数应为TRUE。 - 创建选项:选择“创建数据库”,并可以勾选“生成数据库创建脚本”,便于以后查看或复用。
点击完成,dbca会开始创建数据库。这个过程会在后台调用一系列脚本,在ASM上创建数据文件、控制文件、重做日志文件(每个线程对应一个节点),并启动数据库实例。创建完成后,你可以通过sqlplus连接到任一实例进行验证。
4.3 后期关键配置
数据库创建后,还有一些针对RAC环境的优化配置建议:
- 配置Service:服务(Service)是RAC中实现负载均衡和故障转移的逻辑抽象。你可以为不同的应用创建不同的服务,并将其运行在特定的节点或所有节点上。例如,创建一个
oltp_srv服务,将其优先运行在节点1,备用在节点2。-- 在其中一个实例上执行 srvctl add service -d racdb -s oltp_srv -r racdb1 -a racdb2 -P BASIC srvctl start service -d racdb -s oltp_srv - 配置SCAN监听:确保监听器正确注册了SCAN地址。客户端连接时,应使用SCAN名称(如
rac-scan.example.com:1521/racdb)而不是某个节点的VIP。 - 重做日志与Undo表空间:确保每个实例有自己的重做日志线程(
THREAD)和Undo表空间。dbca通常会自动配置好。
注意事项:使用
dbca图形界面时,如果是通过SSH远程连接到Linux服务器,需要正确配置X11转发(ssh -X)并确保本地有X Server(如Windows上的Xming, MobaXterm内置)。如果图形界面无法启动,静默模式是可靠的备选方案。另外,在创建数据库时,如果ASM磁盘组空间不足,dbca会报错。务必提前规划好+DATA和+FRA的大小,为数据增长留足余地。一个经验法则是,+FRA的大小至少应是数据库总大小的两倍,用于存放归档日志和备份。
5. 集群管理与日常维护要点
RAC搭建成功只是开始,日常的稳定运行离不开正确的管理和维护。掌握一些核心命令和排查思路至关重要。
5.1 核心管理命令集
你需要熟悉以下几组命令:
- 集群资源管理(
crsctl):crsctl stat res -t:查看所有资源状态(最常用)。crsctl check cluster:检查集群整体健康状态。crsctl stop cluster -all:停止整个集群。crsctl start cluster -all:启动整个集群。
- 数据库与实例管理(
srvctl):srvctl status database -d racdb:查看数据库状态。srvctl start database -d racdb:启动数据库所有实例。srvctl stop instance -d racdb -i racdb1:停止特定实例。srvctl config database -d racdb:查看数据库配置。srvctl add/modify/remove service:管理服务。
- ASM管理:
asmcmd:进入ASM命令行工具,可以像操作文件系统一样操作磁盘组(lsdg,ls,cp等)。sqlplus / as sysasm:连接ASM实例进行SQL操作。
5.2 常见问题与故障排查实录
即使规划得再周密,在实际运行中也可能遇到问题。以下是我遇到过的几个典型场景及排查思路:
问题一:某个节点实例无法启动,报错“ORA-12547: TNS:lost contact”或“ORA-29701: unable to connect to Cluster Synchronization Service”。
排查思路:
- 首先检查集群状态:
crsctl stat res -t。看ora.asm资源、该节点的ora.<db_name>_<instance_num>.db资源是否在线。 - 如果集群资源异常,检查
ohasd(Oracle High Availability Services Daemon)是否运行:ps -ef | grep ohasd。 - 检查网络:
ping其他节点的私有IP和VIP。使用oifcfg查看网络配置:oifcfg getif。 - 检查ASM实例是否启动:
srvctl status asm -n rac01。 - 查看告警日志:定位到
$ORACLE_BASE/diag/rdbms/<db_name>/<instance_name>/trace目录下的alert_<instance_name>.log文件,寻找启动过程中的具体错误。
- 首先检查集群状态:
可能原因与解决:
- 私有网络不通:检查网线、交换机、防火墙(应关闭)和
/etc/hosts配置。 - CSS(集群同步服务)通信故障:检查
ocr.loc和olr.loc文件指向的OCR位置是否正确,磁盘是否可访问。 - 权限问题:确保
oracle用户对$ORACLE_HOME和ASM磁盘有正确权限。
- 私有网络不通:检查网线、交换机、防火墙(应关闭)和
问题二:应用连接SCAN时出现随机连接失败或负载不均。
排查思路:
- 检查SCAN监听状态:在任一节点,
lsnrctl status LISTENER_SCAN1(或SCAN2, SCAN3)。 - 检查监听是否在所有节点注册:
srvctl config listener。 - 检查客户端使用的连接字符串是否正确包含了SCAN名和端口。
- 使用
tnsping从客户端测试SCAN名的解析和连通性。
- 检查SCAN监听状态:在任一节点,
可能原因与解决:
- DNS轮询问题:SCAN名应解析到3个IP。如果只用hosts文件写了一个IP,则无负载均衡。确保DNS配置正确,或考虑使用GNS(Grid Naming Service)。
- 监听未在所有节点启动:使用
srvctl start listener启动。 - 防火墙阻挡了1521端口。
问题三:ASM磁盘组空间不足告警。
排查思路:
- 使用
asmcmd lsdg查看所有磁盘组的可用空间。 - 连接ASM实例,查询
V$ASM_DISKGROUP视图。 - 检查数据库的快速恢复区(
+FRA)是否被归档日志占满。
- 使用
解决:
- 添加新磁盘到现有磁盘组:
ALTER DISKGROUP DATA ADD DISK '/dev/new_disk'。 - 清理过期的归档日志和备份:
RMAN> DELETE OBSOLETE;。 - 调整快速恢复区大小:
ALTER SYSTEM SET DB_RECOVERY_FILE_DEST_SIZE=100G;。
- 添加新磁盘到现有磁盘组:
5.3 备份与恢复策略考虑
RAC提供了实例级的高可用,但并不能替代数据备份。你必须为RAC数据库制定完整的备份策略。Oracle推荐的工具是RMAN(Recovery Manager)。
- 备份配置:将RMAN备份目标指向ASM磁盘组
+FRA或专用的备份磁盘组。配置控制文件和SPFILE的自动备份。 - 全库备份:可以连接到任一实例进行全库备份。RMAN能自动协调所有实例,备份所有数据文件。
rman target sys/password@racdb1 RMAN> BACKUP DATABASE PLUS ARCHIVELOG; - 归档日志备份:由于每个实例产生自己的归档日志,并默认存放在本地
$ORACLE_HOME/dbs下,需要配置LOG_ARCHIVE_DEST_1参数,将所有实例的归档日志都指向共享的ASM位置(如+FRA),以便于统一备份和管理。 - 恢复测试:定期在测试环境进行恢复演练,确保备份的有效性。RAC环境的恢复可能涉及将数据库恢复到单实例或另一个RAC环境,需要熟悉
restore和recover命令,以及catalog start with命令来注册备份片。
个人体会:管理RAC,日志是你的第一手资料。无论是集群的
crsd.log、ohasd.log,还是数据库的告警日志alert_.log,亦或是监听日志,都要养成定期查看和归档的习惯。当问题发生时,第一时间查看相关日志,往往能快速定位方向。另外,对于关键命令的操作(如crsctl stop/start,srvctl modify),最好先在测试环境演练,并记录下操作步骤和回滚方案。毕竟,在生产集群上,一次误操作可能导致严重的服务中断。最后,保持所有节点的操作系统补丁、GI补丁和数据库补丁版本一致,这是避免许多诡异兼容性问题的基础。
