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和一个虚拟IPVIP如192.168.1.201/202。VIP是实现高可用故障转移的关键——当某个节点宕机其VIP会漂移到存活节点应用无需修改连接字符串即可重连。私有网络用于节点间高速内部通信如缓存融合Cache Fusion数据块传输、心跳检测、集群同步服务CSS通信。这部分流量巨大且延迟敏感必须使用万兆或更高速的网络并且与公共网络物理隔离。通常使用交换机直连或专用交换机。IP地址规划在另一个私有网段如172.16.1.1/2。存储网络用于节点访问共享存储。在传统的SAN存储区域网络环境中这通常通过光纤通道FC或iSCSI实现。如果使用NAS如NFS则可能通过公共或私有网络承载。共享存储是RAC的基石所有节点必须能并发读写同一份数据文件、控制文件、重做日志文件等。常见的选项有ASMOracle自动存储管理推荐、OCFS2Oracle集群文件系统或厂商提供的集群文件系统。我强烈推荐使用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 InfrastructureGIGI包含了集群软件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_LOCATIONOracle清单目录。SELECTED_LANGUAGES选择en, zh_CN如果需中文。oracle.install.option选择CRS_CONFIG表示安装集群软件。ORACLE_BASE,ORACLE_HOME设置Grid Infrastructure的家目录。oracle.install.asm.OSDBAoracle.install.asm.OSOPERoracle.install.asm.OSASM设置为对应的组asmdba,asmoper,asmadmin。集群配置指定集群名称oracle.install.crs.config.clusterName、SCAN名称和端口、节点信息名称、VIP、私有主机名。存储配置选择“配置ASM”的磁盘组。这里需要指定用于创建OCROracle集群注册表和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.dbora.node.vipora.asm等的状态正常情况下应该都是ONLINE。3.3 ASM磁盘组创建与管理GI安装时可能已经创建了一个用于OCR/Voting的磁盘组比如DATA。我们通常还需要为数据库文件创建额外的磁盘组比如DATA用于数据FRA用于快速恢复区。使用ASM命令行工具asmca图形界面或sqlplus连接ASM实例来创建。ASM实例的SID通常是ASM1ASM2。sqlplus / as sysasm CREATE DISKGROUP DATA NORMAL REDUNDANCY DISK /dev/oracleasm/disks/DISK1, /dev/oracleasm/disks/DISK2 ATTRIBUTE au_size4M;这里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_NAMEoinstall。INVENTORY_LOCATION与GI安装时相同或不同的清单目录。ORACLE_BASE,ORACLE_HOME设置数据库软件的家目录。oracle.install.db.InstallEdition选择企业版EE。oracle.install.db.OSDBA_GROUPdba。oracle.install.db.OSOPER_GROUPoper如有。oracle.install.db.OSBACKUPDBA_GROUPOSDGDBA_GROUPOSKMDBA_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 ExpressEnterprise 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 核心管理命令集你需要熟悉以下几组命令集群资源管理crsctlcrsctl stat res -t查看所有资源状态最常用。crsctl check cluster检查集群整体健康状态。crsctl stop cluster -all停止整个集群。crsctl start cluster -all启动整个集群。数据库与实例管理srvctlsrvctl 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资源是否在线。如果集群资源异常检查ohasdOracle 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名的解析和连通性。可能原因与解决DNS轮询问题SCAN名应解析到3个IP。如果只用hosts文件写了一个IP则无负载均衡。确保DNS配置正确或考虑使用GNSGrid 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_SIZE100G;。5.3 备份与恢复策略考虑RAC提供了实例级的高可用但并不能替代数据备份。你必须为RAC数据库制定完整的备份策略。Oracle推荐的工具是RMANRecovery Manager。备份配置将RMAN备份目标指向ASM磁盘组FRA或专用的备份磁盘组。配置控制文件和SPFILE的自动备份。全库备份可以连接到任一实例进行全库备份。RMAN能自动协调所有实例备份所有数据文件。rman target sys/passwordracdb1 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/startsrvctl modify最好先在测试环境演练并记录下操作步骤和回滚方案。毕竟在生产集群上一次误操作可能导致严重的服务中断。最后保持所有节点的操作系统补丁、GI补丁和数据库补丁版本一致这是避免许多诡异兼容性问题的基础。