发新话题
打印

[转载]在Linux和FireWire上构建您自己的Oracle集群

[转载]在Linux和FireWire上构建您自己的Oracle集群

信息来源: Oracle.com

了解如何安装和配置一个成本低于 1800 美元的 Oracle RAC 10g 第 2 版开发集群。

2005 年 12 月更新

目录

  1. 简介
  2. Oracle RAC 10g 概述
  3. 共享存储器概述
  4. FireWire 技术
  5. 硬件及成本
  6. 安装 Linux 操作系统
  7. 配置网络
  8. 获取并安装新的 Linux 内核/FireWire 模块
  9. 创建“oracle”用户和目录
  10. 在共享的 FireWire 存储设备上创建分区
  11. 为 Oracle 配置 Linux 服务器
  12. 配置 hangcheck-timer 内核模块
  13. 为远程访问配置 RAC 节点
  14. 用于每个 RAC 节点的所有启动命令
  15. 检查 Oracle 10g 第 2 版的 RPM 程序包
  16. 安装和配置 Oracle 集群文件系统 (OCFS2)
  17. 安装和配置自动存储管理 (ASMLib 2.0)
  18. 下载 Oracle 10g RAC 软件
  19. 安装 Oracle 10g 集群件软件
  20. 安装 Oracle 10g 数据库软件
  21. 创建 TNS 监听器进程
  22. 安装 Oracle10g 随附 CD 软件
  23. 创建 Oracle 集群数据库
  24. 验证 TNS 联网文件
  25. 创建/更改表空间
  26. 验证 RAC 集群与数据库配置
  27. 启动/停止集群
  28. 透明的应用程序故障切换 - (TAF)
  29. 结论
  30. 致谢


本指南相关下载:
CentOS Enterprise Linux 4.2 Red Hat Enterprise Linux 4
Oracle 集群文件系统第 2 版 - (1.0.4-1)
Oracle 集群文件系统第 2 版工具 - (1.0.4-1)
Oracle 数据库 10g 第 2 版 EE、集群件、随附 CD - (10.2.0.1.0)
预编译的 RHEL 4 内核 - (2.6.9-11.0.0.10.3.EL)
预编译的 RHEL 4 FireWire 模块 - (2.6.9-11.0.0.10.3.EL)
ASMLib 2.0 库和工具
ASMLib 2.0 驱动程序 - 单处理器 / SMP


1. 简介

熟悉 Oracle 真正应用集群 (RAC) 10g 技术的最有效方法之一是访问一个实际的 Oracle RAC 10g 集群。没有什么方法比直接体验它们能够更好地理解其好处的了 — 包括容错、安全性、负载均衡和可伸缩性。

不幸的是,对于很多商家而言,典型的生产级 RAC 配置所需的硬件投入使它们无法实现这一目标。一个小型两节点集群可能需要 10,000 美元到 20,000 美元以上。该价格还不包括产品级 RAC 环境的核心(通常是一个存储区域网),其起价为 8,000 美元。

对于那些没有大笔现金而希望熟悉 Oracle RAC 10g 的人而言,本指南提供一种低成本的替代方法来配置一个 Oracle RAC 10g 第 2 版系统,它使用常见的商业组件和可下载的软件,估计成本在 1200 美元到 1800 美元之间。相关系统包括一个运行 Linux(CentOS 4.2 或 Red Hat Enterprise Linux 4)的双节点集群(每个节点使用一个处理器),具有基于 IEEE1394 (FireWire) 驱动器技术的共享磁盘存储器。(当然,您还可以考虑在 VMware 虚拟机上构建一个虚拟集群,但是其体验将不尽相同!)

请注意,这不是构建低成本 Oracle RAC 10g 系统的唯一方法。我曾见过其他的解决方案,这些解决方案利用了基于 SCSI 的实施而不是基于共享存储器的 FireWire。在大多数情况下,SCSI 的成本会高于我们的 FireWire 解决方案,典型的 SCSI 卡的价格在 70 美元左右,而一个 80GB 的外置 SCSI 驱动器价格为 700 美元到 1000 美元。注意,某些主板可能已包含内置的 SCSI 控制器。

请注意,不要在生产环境中运行此配置并且它不受 Oracle 或其他任何厂商的支持,这点很重要。在生产环境中,光纤通道(能够在点对点或交换式拓扑中连接系统与存储设备的高速串行传输接口)是首选技术。FireWire 为测试和开发提供了光纤通道的低成本替代方法,但尚不能用于生产。

Oracle9i 和 Oracle 10g 第 1 版指南使用原始分区存储共享存储器上的文件,但此处我们将利用 Oracle 集群文件系统第 2 版 (OCFS2) 和 Oracle 自动存储管理 (ASM) 特性。将对两个 Linux 服务器进行如下配置:

Oracle 数据库文件
RAC 节点名 实例名 数据库名 $ORACLE_BASE 用于存储 DB 文件的文件系统/卷管理器
linux1 orcl1 orcl /u01/app/oracle ASM
linux2 orcl2 orcl /u01/app/oracle ASM
Oracle 集群件共享文件
文件类型 文件名 分区 挂载点 文件系统
Oracle Cluster Registry /u02/oradata/orcl/OCRFile /dev/sda1 /u02/oradata/orcl OCFS2
CRS 表决磁盘 /u02/oradata/orcl/CSSFile /dev/sda1 /u02/oradata/orcl OCFS2

注意,在 Oracle 数据库 10g 第 2 版 (10.2) 中,集群就绪服务(即 CRS)现在称作 Oracle 集群件。

Oracle 集群件软件将安装到构成 RAC 集群的每个节点上的 /u01/app/oracle/product/crs 中。但集群件软件需要将其两个文件(Oracle 集群注册表 (OCR) 文件和表决磁盘文件)与集群中的所有节点共享。这两个文件将安装到使用 OCFS2 的共享存储器中。可以(但 Oracle 不建议)使用 RAW 设备存储这些文件,但不能使用 ASM 存储这两个集群件文件。

Oracle 数据库 10g 第 2 版软件将安装到构成 RAC 集群每个节点的 Oracle Home(即 /u01/app/oracle/product/10.2.0/db_1)中。所有 Oracle 物理数据库文件(数据、联机重做日志、控制文件、归档重做日志)将安装到由 ASM 管理的共享驱动器的不同分区上。(可以将 Oracle 数据库文件十分轻松地存储在 OCFS2 上。但是,使用 ASM 可以使本文更有趣!)

注意:本文仅作为绝对不可替代的文档。如果要寻找一个利用 RHEL 3 上的 Oracle RAC 10g 第 1 版的示例,请单击此处。要获得以前发布的本指南的 Oracle9i RAC 版本,请单击此处


2. Oracle RAC 10g 概述

随 Oracle9i 一同推出的 Oracle RAC 是 Oracle 并行服务器 (OPS) 的后续版本。RAC 允许多个实例同时访问同一数据库(存储器)。它通过允许系统进行扩展,提供了容错、负载均衡和性能效益,同时由于所有节点访问同一数据库,因此一个实例的故障不会导致无法访问数据库。

Oracle RAC 的核心是共享磁盘子系统。集群中的所有节点必须能够访问集群中所有节点的所有数据、重做日志文件、控制文件和参数文件。数据磁盘必须在全局范围内可用,以便允许所有节点访问数据库。每个节点拥有自己的重做日志和控制文件,但是其他节点必须能够访问这些文件,以便在系统故障时恢复该节点。

Oracle RAC 与 OPS 之间的一个较大区别是,它采用了高速缓存合并技术。在 OPS 中,节点间的数据请求需要先将数据写入磁盘,然后发出请求的节点才可以读取该数据。使用高速缓存合并时,一起传递数据与使用复杂锁定算法的高速互联。

不是所有的集群解决方案都使用共享存储器。有些厂商使用一种称为联合集群 的方法,在这种方法中,数据分布在多台计算机中,而不是由所有计算机共享。但是,在使用 Oracle RAC 10g 时,多个节点使用相同的磁盘集来存储数据。利用 Oracle RAC,数据文件、重做日志文件、控制文件和归档日志文件保存在原始磁盘设备的共享存储器、NAS、SAN、ASM 或集群文件系统中。Oracle 的集群方法利用了集群中所有节点的集体处理能力,同时提供了故障切换安全性。

有关 Oracle RAC 的更多背景知识,请访问 OTN 上的 Oracle RAC 产品中心


3. 共享存储器概述

光纤通道是最流行的共享存储器解决方案之一。前面曾提到,光纤通道是一种高速串行传输接口,用于在点对点或交换式拓扑结构中连接系统与存储设备。光纤通道支持的协议包括 SCSI 和 IP。

光纤通道配置可以支持多达 127 个节点,其每秒的吞吐量高达 2.12 GB。但是,光纤通道非常昂贵;仅交换机的起价就为 1000 美元,而高端驱动器价格可能达到 300 美元。总体而言,典型的光纤通道设置(包括服务器的插卡)价格约为 8000 美元。

光纤通道的一种较为便宜的替代方法是 SCSI。SCSI 技术为共享存储器提供了可接受的性能,但是对于那些习惯了基于 GPL 的 Linux 价格的管理员和开发人员来说,即使是 SCSI(一个双节点集群的价格在 2,000 美元到 5,000 美元左右)也可能超出预算。

另一种流行的解决方案是建立在 NAS 基础上的 Sun NFS(网络文件系统)。只有在您使用网络设备或类似的设备时,它才可以用于共享存储器。具体来说就是,您需要拥有能够保证在 NFS 上进行直接 I/O、将 TCP 作为传输协议并且读/写块大小为 32K 的服务器。


4. FireWire 技术

FireWire 是由 Apple Computer 和 Texas Instruments 开发的,它是一种高速串行数据总线的跨平台实施方案。利用其高带宽、长距离(长度多达 100 米)和高能量的总线,FireWire 现在用于数字视频 (DV)、专业音响、硬盘驱动器、高端数字照相机和家庭娱乐设备等应用中。现在,FireWire 以高达每秒 800 兆位的传输速率工作,而下一代的 FireWire 要求理论上的位速率达到 1600 Mbps,然后达到令人吃惊的 3200 Mbps。那是每秒 3.2 GB。这种速度将使 FireWire 成为传输大量数据文件甚至要求最苛刻的视频应用(如处理未压缩的高清晰 (HD) 视频或者多个标准清晰度 (SD) 的视频流)所必不可少的技术。

以下图表显示了多种类型磁盘接口的速度对比。对于每种接口,我提供了每秒千位 (kb)、千字节 (KB)、兆位 (Mb)、兆字节 (MB) 以及千兆位 (Gb) 的最大传输速率。可以看到,IEEE1394 的功能显然超过其他可用的磁盘接口技术。

磁盘接口 速度
Kb KB Mb MB Gb
串行 115 14.375 0.115 0.014
并行(标准) 920 115 0.92 0.115
USB 1.1 12 1.5
并行 (ECP/EPP) 24 3
SCSI-1 40 5
SCSI-2(快速 SCSI/快速窄带 SCSI) 80 10
ATA/100(并行) 100 12.5
IDE 133.6 16.7
快速宽带 SCSI(宽带 SCSI) 160 20
Ultra SCSI(SCSI-3 / Fast-20 / Ultra 窄带) 160 20
Ultra IDE 264 33
宽带 Ultra SCSI(快速宽带 20) 320 40
Ultra2 SCSI 320 40
FireWire 400 - IEEE1394(a) 400 50
USB 2.0 480 60
宽带 Ultra2 SCSI 640 80
Ultra3 SCSI 640 80
FireWire 800 - IEEE1394(b) 800 100
串行 ATA - (SATA) 1200 150 1.2
宽带 Ultra3 SCSI 1280 160 1.28
Ultra160 SCSI 1280 160 1.28
Ultra 串行 ATA 1500 1500 187.5 1.5
Ultra320 SCSI 2560 320 2.56
FC-AL 光纤通道 3200 400 3.2



5. 硬件及成本

我们用于构建示例 Oracle RAC 10g 环境的硬件包括两个 Linux 服务器以及您可以在本地任何计算机商店中或通过互联网购买的组件。

服务器 1 — (linux1)
Dimension 2400 系列
  • Intel Pentium 4 处理器 (2.80GHz)
  • 1GB DDR SDRAM (333MHz)
  • 40GB 7200 RPM 内置硬盘驱动器
  • 集成的 Intel 3D AGP 图形卡
  • 集成的 10/100 以太网卡
  • CDROM(48X 倍速)
  • 3.5" 软盘驱动器
  • 无监视器(已经有一台)
  • USB 鼠标和键盘
  • 620 美元
    1 - 以太网 LAN 卡

    每个 Linux 服务器应该包含两个 NIC 适配器。Dell Dimension 包含一个集成的 10/100 以太网适配器,它将用于连接公共网络。第二个 NIC 适配器将用于专用互联。
    20 美元
    1 - FireWire 卡

    已知那些使用 VIA 或 TI 制造的芯片集的接口卡可以正常工作。除了 SIIG, Inc. 3 端口 1394 I/O 卡之外,我还成功使用了 Belkin FireWire 3 端口 1394 PCI 卡StarTech 4 端口 IEEE-1394 PCI Firewire 卡 等 I/O 卡。
    30 美元
    服务器 2 — (linux2)
    Dimension 2400 系列
  • Intel Pentium 4 处理器 (2.80GHz)
  • 1GB DDR SDRAM (333MHz)
  • 40GB 7200 RPM 内置硬盘驱动器
  • 集成的 Intel 3D AGP 图形卡
  • 集成的 10/100 以太网卡
  • CDROM(48X 倍速)
  • 3.5" 软盘驱动器
  • 无监视器(已经有一台)
  • USB 鼠标和键盘
  • 620 美元
    1 - 以太网 LAN 卡

    每个 Linux 服务器应该包含两个 NIC 适配器。Dell Dimension 包含一个集成的 10/100 以太网适配器,它将用于连接公共网络。第二个 NIC 适配器将用于专用互联。
    20 美元
    1 - FireWire 卡

    已知那些使用 VIA 或 TI 制造的芯片集的接口卡可以正常工作。除了 SIIG, Inc. 3 端口 1394 I/O 卡之外,我还成功使用了 Belkin FireWire 3 端口 1394 PCI 卡StarTech 4 端口 IEEE-1394 PCI Firewire 卡 等 I/O 卡。
    30 美元
    其他组件
    FireWire 硬盘驱动器
    确保您所购买的 FireWire 驱动器支持多个登录。如果驱动器的芯片集不允许对超过一个服务器进行并发访问,则每次只有一台服务器能够看到该磁盘及其分区。已知使用 Oxford 911 芯片集的磁盘可以正常工作。以下是我为本测试所购买的磁盘的详细信息:
    厂商:Maxtor
    型号:OneTouch II
    Mfg.部件号或 KIT 号:E01G300
    容量:300 GB
    高速缓存缓冲区:16 MB
    转速:7200 RPM
    接口传输速率:400 Mbits/s
    “组合”接口:IEEE 1394 / 兼容 USB 2.0 和 USB 1.1

    以下是包含相应芯片组的 FireWire 驱动器(以及其中包含的附件)列表,这些驱动器支持多个登录,应适用于本文(但不予保证):


    280 美元
    1 - 额外的 FireWire 电缆
    20 美元
    1 - 以太网集线器或交换机

    (用于与 int-linux1 / int-linux2 互联)
    25 美元
    4 - 网络电缆 5 美元
    5 美元
    5 美元
    5 美元
    总计 1,685 美元

    请注意,Maxtor OneTouch 外置硬盘驱动器确实有两个 IEEE1394 (FireWire) 端口,尽管乍看上去可能不是这样。上面列出的其他外置硬盘驱动器也是如此。还要注意,虽然您可能总想将以太网交换机(用于互联 int-linux1/int-linux2)替换为一根交叉的 CAT5 线,但我不推荐使用这种方法。我发现在使用交叉的 CAT5 线进行互联时,只要我关闭一台 PC,另一台 PC 就会检测到一个“cable unplugged”错误,因而高速缓存合并网络将会变为不可用。

    既然我们知道了将在本示例中使用的硬件,就让我们对环境概况进行概念性的了解:



    图 1 体系结构

    在我们开始详细讨论安装过程时,始终切记大多数任务需要在两台服务器上执行。


    6. 安装 Linux 操作系统

    本节总结了用于安装 Linux 操作系统的各个屏幕。本指南原定使用 Red Hat Enterprise Linux 4 AS/ES (RHEL4) 操作环境。作为替代方法,我在本文中使用了 CentOS 4.2:RHEL4 操作环境的一个免费且稳定的版本。

    有关更多详细的安装说明,可以使用由 Red Hat Linux 提供的手册。但是,我建议对本配置使用我在下面提供的说明。

    在两个节点上安装 Linux 操作系统之前,您应该先安装 FireWire 和两个 NIC 接口(卡)。

    此外,在开始安装前,确保 FireWire 驱动器(我们的共享存储驱动器)没有连接到两个服务器中的任何一个上。您也可以选择将这两个服务器同时连接到 FireWire 驱动器,并只需关掉驱动器的电源。

    下载 CentOS 4.2 的以下 ISO 镜像:

    下载并将 CentOS 镜像(ISO 文件)刻录到 CD 之后,将 CentOS 1 号盘插入到第一个服务器(在本示例中是 linux1),启动其电源,并按照以下说明来回应安装屏幕的提示。在第一个节点上安装完 Linux 后,在第二个节点上执行相同的 Linux 安装,但将节点名 linux1 替换为 linux2 并设定适当的不同 IP 地址。

    Boot Screen
    第一个屏幕是 CentOS Enterprise Linux 引导屏幕。在 boot:提示符处按 [Enter] 键启动安装过程。

    Media Test
    当要求测试 CD 介质时,用 Tab 键切换到 [Skip] 并按 [Enter] 键。如果有错误,则介质刻录软件会向我们发出警告。在几秒钟后,安装程序将会检测视频卡、监视器和鼠标。然后安装程序进入 GUI 模式。

    Welcome to CentOS Enterprise Linux
    在欢迎屏幕上,单击 [Next] 继续。

    Language / Keyboard Selection
    接下来的两个屏幕提示您设置语言和键盘设置。为您的配置作出合适的选择。

    Installation Type
    选择 [Custom] 选项并单击 [Next] 继续。

    Disk Partitioning Setup
    选择 [Automatically partition] 并单击 [Next] 继续。

    如果以前在本机上安装了 Linux,则下一屏幕将询问您是要“删除”还是“保留”旧分区。选择 [Remove all partitions on this system] 选项。还要确保为本安装选择了 [hda] 驱动器。我还选中了 [Review (and modify if needed) the partitions created] 复选框。单击 [Next] 继续。

    然后显示一个对话窗口,询问您是否真的要删除所有分区。单击 [Yes] 回复这一警告。

    Partitioning
    随后安装程序将允许您查看(如果需要还可以更改)它自动选择的磁盘分区。几乎所有情况下,安装程序将为 /boot 分配 100MB,为 swap 分配双倍数量的 RAM,而将剩余空间分配给根 (/) 分区。我倾向于至少为 swap 分配 1 GB 的空间。就本安装而言,我将接受所有自动选用的大小。(包括 2GB 的 swap,因为我安装了 1GB 的 RAM。)

    从 RHEL 4 开始,安装程序将创建与刚才提到的相同磁盘配置,但将使用逻辑卷管理器 (LVM) 创建它们。例如,它将把第一个硬盘驱动器(我的配置使用 /dev/hda)划分为两个分区 - 一个分区用于 /boot 分区 (/dev/hda1),而磁盘的剩余部分专用于 LVM 指定的 VolGroup00 (/dev/hda2)。然后,将 LVM 卷分组 (VolGroup00) 划分为两个 LVM 分区 - 一个分区用于根文件系统 (/),另一个用于交换分区。我主要检查它是否创建了至少 1GB 的交换分区。由于我安装了 1GB RAM,因此安装程序创建了 2GB 的交换分区。也就是说,我只要接受默认的磁盘布局就行了。

    Boot Loader Configuration
    安装程序将默认使用 GRUB 引导加载程序。要使用 GRUB 引导加载程序,接受所有默认值并单击 [Next] 继续。

    Network Configuration
    在启动操作系统安装之前,我已确认在每个 Linux 机器上安装了两个 NIC 接口(卡)。本屏幕应该已经成功地检测到每个网络设备。

    首先,确保将每个网络设备设置为 [Active on boot]。安装程序可能选择不激活 eth1。

    第二步,按照以下方法对 eth0 和 eth1 进行 [Edit] 操作。您可能要为 eth0 和 eth1 使用不同的 IP 地址,没问题。如果可能,试着将 eth1(互联)置于不同于 eth0(公共网络)的子网中:

    eth0:
    — 取消选中 [Configure using DHCP] 复选项
    — 选中 [Activate on boot]
    — IP 地址:192.168.1.100
    — 网络掩码: 255.255.255.0

    eth1:
    — 取消选中 [Configure using DHCP] 复选项
    — 选中 [Activate on boot]
    — IP 地址:192.168.2.100
    — 网络掩码:255.255.255.0

    接着,手动设置您的主机名。第一个节点使用“linux1”,第二个节点使用“linux2”。然后提供您的网关和 DNS 服务器,最后关闭该对话框。

    Firewall
    在该屏幕上,确保选中 [No firewall],然后单击 [Next] 继续。系统可能显示一个警告对话框,提示您不要设置防火墙。如果出现此情况,只需单击 [Proceed] 继续。

    Additional Language Support/Time Zone
    接下来的两个屏幕允许您选择其他语言支持以及时区信息。几乎所有情况下,您都可以接受默认值。

    Set Root Password
    选择一个根口令,然后单击 [Next] 继续。

    Package Group Selection
    滚动到本屏幕的底部,在“Miscellaneous”区域的下面选择 [Everything]。单击 [Next] 继续。

    请注意,Oracle 的安装并不要求安装所有 Linux 程序包。为简单起见,我决定安装所有程序包。有关成功的 Oracle 安装所需重要程序包的详细说明,请参见第 15 节(“检查用于 Oracle 10g 第 2 版的 RPM 程序包”)。

    请注意,在使用某些 RHEL4 发行版本时,默认情况下将不显示“Package Group Selection”屏幕,而只显示“Install default software packages”或“Customize software packages to be installed”屏幕。选择选项“Customize software packages to be installed”,然后单击 [Next] 继续。随即将显示“Package Group Selection”屏幕。此时,向下滚动到该屏幕底部,然后在“Miscellaneous”部分下选择 [Everything]。单击 [Next] 继续。

    About to Install
    本屏幕主要是一个确认屏幕。单击 [Next] 开始安装。安装过程中,将请求您将磁盘切换到 2 号盘、3 号盘,然后切换到 4 号盘。单击 [Continue] 启动安装过程。

    请注意,在使用 CentOS 4.2 时,安装程序将请求您切换到 2 号盘、3 号盘、4 号盘、1 号盘,然后返回到 4 号盘。

    Graphical Interface (X) Configuration
    在使用大多数 RHEL4 发行版本(CentOS 4.2 除外)时,安装结束时,安装程序将尝试检测视频硬件。确保安装程序已经检测并选择了正确的视频硬件(图形卡和监视器),以便正确使用 X Windows 服务器。在接下来的几个屏幕中,您将继续进行 X 配置。

    Congratulations
    大功告成。您已经在第一个节点 (linux1) 上成功安装了 CentOS Enterprise Linux。安装程序将从 CD-ROM 驱动器中弹出 CD。取出 CD,单击 [Exit] 重新引导系统。

    系统第一次引导进入 Linux 中时将为您显示另一个 Welcome 屏幕。接下来的向导将允许您配置日期和时间、添加其他用户、测试声卡并安装任何其他 CD。我唯一关心的屏幕是时间和日期(如果您使用的是 CentOS 4.x,则是监视器/显示设置)。至于其他屏幕,由于没有其他需要安装的东西(至少目前是这样!),因此只需快速通过即可。如果一切都已成功,您现在应该看到登录屏幕了。

    在第二个节点上执行相同的安装
    在第一个节点上完成 Linux 安装后,在第二个节点 (linux2) 上重复以上步骤。在配置机器名和网络时,确保配置相应值。对于我的安装,以下是我为 linux2 所配置的内容:

    首先,确保将每个网络设备设置为 [Active on boot]。安装程序将选择不激活 eth1。

    第二步,按照以下方法对 eth0 和 eth1 进行 [Edit] 操作:

    eth0:
    — 取消选中 [Configure using DHCP] 复选项
    — 选中 [Activate on boot]
    — IP 地址:192.168.1.101
    — 网络掩码: 255.255.255.0

    eth1:
    — 取消选中 [Configure using DHCP] 复选项
    — 选中 [Activate on boot]
    — IP 地址:192.168.2.101
    — 网络掩码:255.255.255.0

    接着,手动设置您的主机名。我对第二个节点使用“linux2”。然后提供您的网关和 DNS 服务器,最后关闭该对话框。


    7. 配置网络

    在集群的所有节点上执行以下网络配置!

    注意:虽然我们在 Linux 安装过程中配置了几个网络设置,但千万不要跳过本节,这是因为它包含 RAC 环境所需的关键步骤。

    网络设置简介

    在 Linux O/S 安装过程中,您已经为每个节点配置了 IP 地址和主机名。现在您需要配置 /etc/hosts 文件,并调整几个用于互联的网络设置。我还提供了启用 Telnet 和 FTP 服务的说明。

    每个节点均应有一个用于公共网络的静态 IP 地址和一个用于专用集群互联的静态 IP 地址。专用互联只用于由 Oracle 传输与集群管理器和高速缓存合并相关的数据。虽然可以将公共网络用于互联,但由于它可能导致数据库性能降低(减少高速缓存合并和集群管理器流量的带宽),因此不建议使用这种方法。对于生产 RAC 实施,互联应该至少有 GB 或更多,并且只由 Oracle 使用。

    配置公共网络和专用网络

    在我们的双节点示例中,我们需要在两个节点上配置网络,以访问公共网络及其专用互联。

    在 RHEL4 中配置网络设置的最简单方法是使用网络配置程序。该应用程序可以以根用户帐户从命令行启动,如下所示:

    # su -
    # /usr/bin/system-config-network &
    

    不要为公共 IP 地址或互联使用 DHCP 命名;您需要静态 IP 地址!

    使用网络配置应用程序,您需要配置两个 NIC 设备以及 /etc/hosts 文件。可以使用网络配置 GUI 完成这两个任务。请注意,两个节点的 /etc/hosts 设置是相同的。

    我们的示例配置将使用以下的设置:

    服务器 1 (linux1)
    设备 IP 地址 子网 目的
    eth0 192.168.1.100 255.255.255.0 连接 linux1 与公共网络
    eth1 192.168.2.100 255.255.255.0 连接 linux1(互联)与 linux2 (int-linux2)
    /etc/hosts
    127.0.0.1        localhost      loopback
    
    # Public Network - (eth0)
    192.168.1.100    linux1
    192.168.1.101   linux2
    
    # Private Interconnect - (eth1)
    192.168.2.100   int-linux1
    192.168.2.101    int-linux2
    
    # Public Virtual IP (VIP) addresses for - (eth0)
    192.168.1.200    vip-linux1
    192.168.1.201    vip-linux2
    

    服务器 2 (linux2)
    设备 IP 地址 子网 目的
    eth0 192.168.1.101 255.255.255.0 连接 linux2 与公共网络
    eth1 192.168.2.101 255.255.255.0 连接 linux2(互联)与 linux1 (int-linux1)
    /etc/hosts
    127.0.0.1        localhost      loopback
    
    # Public Network - (eth0)
    192.168.1.100    linux1
    192.168.1.101   linux2
    
    # Private Interconnect - (eth1)
    192.168.2.100   int-linux1
    192.168.2.101    int-linux2
    
    # Public Virtual IP (VIP) addresses for - (eth0)
    192.168.1.200    vip-linux1
    192.168.1.201    vip-linux2
    

    请注意,只需在两个节点的 /etc/hosts 文件(或您的 DNS)中定义虚拟 IP 地址。当您运行 Oracle Universal Installer 时,该程序启动 Oracle 的虚拟互联网协议配置助手 (VIPCA),也就说 Oracle 将自动配置公共虚拟 IP 地址。当运行 srvctl start nodeapps -n 命令时,所有的虚拟 IP 地址将被激活。这就是将要在客户端 tnsnames.ora 文件中进行配置的主机名/IP 地址(后文详述)。

    在以下的屏幕截图中,只显示了节点 1 (linux1)。确保对两个节点进行了所有适当的网络设置。



    图 2 网络配置屏幕,节点 1 (linux1)



    图 3 以太网设备屏幕,eth0 (linux1)



    图 4 以太网设备屏幕,eth1 (linux1)



    图 5:网络配置屏幕,/etc/hosts (linux1)

    在配置网络后,您可以使用 ifconfig 命令验证一切是否正常。以下示例来自于 linux1

    $ /sbin/ifconfig -a
    eth0      Link encap:Ethernet  HWaddr 00:0D:56:FC:39:EC
    inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
    inet6 addr:fe80::20d:56ff:fefc:39ec/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    RX packets:835 errors:0 dropped:0 overruns:0 frame:0
    TX packets:1983 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:705714 (689.1 KiB)  TX bytes:176892 (172.7 KiB)
    Interrupt:3
    
    eth1      Link encap:Ethernet  HWaddr 00:0C:41:E8:05:37
    inet addr:192.168.2.100  Bcast:192.168.2.255  Mask:255.255.255.0
    inet6 addr:fe80::20c:41ff:fee8:537/64 Scope:Link
    UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:9 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:1000
    RX bytes:0 (0.0 b)  TX bytes:546 (546.0 b)
    Interrupt:11 Base address:0xe400
    
    lo        Link encap:Local Loopback
    inet addr:127.0.0.1  Mask:255.0.0.0
    inet6 addr:::1/128 Scope:Host
    UP LOOPBACK RUNNING  MTU:16436  Metric:1
    RX packets:5110 errors:0 dropped:0 overruns:0 frame:0
    TX packets:5110 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:8276758 (7.8 MiB)  TX bytes:8276758 (7.8 MiB)
    
    sit0      Link encap:IPv6-in-IPv4
    NOARP  MTU:1480  Metric:1
    RX packets:0 errors:0 dropped:0 overruns:0 frame:0
    TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
    collisions:0 txqueuelen:0
    RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
    

    关于虚拟 IP

    10g 中为什么使用虚拟 IP (VIP)?为什么当它的主节点发生故障时不只是返回一个无效的连接呢?

    这全是出于对应用程序可用性的考虑。当一个节点发生故障时,与其关联的 VIP 将被自动故障切换到另外某个节点上。当出现这种情况时,会发生两件事。

    1. 新的节点重新进行地址解析,显示该地址的一个新的 MAC 地址。对于直接连接的客户端,这通常使它们在连接旧地址时出现错误。
    2. 随后发送到 VIP 的数据包前往新的节点,该节点将把错误的 RST 数据包返回客户端。这导致客户端立即收到错误信息。

    这意味着,当客户端向现在已经停机的节点发出 SQL 时,或者在连接状态下遍历地址列表时,客户端不会等待很长的 TCP/IP 超时(大约 10 分钟),而是接收到一个 TCP 重置信息。就 SQL 来说,该信息为 ORA-3113。对于连接,使用 tnsname 中的下一个地址。

    更进一步的操作是使用透明的应用程序故障切换 (TAF)。成功配置 TAF 后,可以完全避免 ORA-3113 错误!第 28 节(“透明的应用程序故障切换 - (TAF)”)将更详细地介绍 TAF。

    如果不使用 VIP,连接停用节点的客户端经常要等待 10 分钟的 TCP 超时,然后才收到错误信息。因此,不使用 VIP 您就不会真正拥有好的高可用性解决方案(来源 — Metalink 注释 220970.1)。

    确保 RAC 节点名没有出现在回送地址中

    确保在 /etc/hosts 文件的回送地址中包含节点名(linux1linux2)。如果机器名出现在回送地址条目中,如下所示:

    127.0.0.1     linux1 localhost.localdomain localhost
    

    需要按如下所示将其删除:

    127.0.0.1        localhost.localdomain   localhost
    

    如果 RAC 节点名出现在回送地址中,您在 RAC 安装期间将接收到以下错误信息:

    ORA-00603:ORACLE server session terminated by fatal error
    

    ORA-29702:error occurred in Cluster Group Service operation
    

    调整网络设置

    在 Oracle 9.2.0.1 以及更高版本中,Oracle 在 Linux 上使用 UDP 作为默认协议进行过程间通信 (IPC) 的默认协议,如在 RAC 集群中的实例间的高速缓存合并和集群管理器缓冲区传输。

    Oracle 强烈建议将默认的和最大的发送缓冲区大小(SO_SNDBUF 套接字选项)调整为 256KB,并将默认的和最大的接收缓冲区大小(SO_RCVBUF 套接字选项)调整为 256KB。

    接收缓冲区由 TCP 和 UDP 用于保留所接收的数据,直到应用程序读出这些数据为止。由于不允许对等端发送超过缓冲区大小窗口的数据,因此接收缓冲区无法溢出。这意味着,如果数据报不适合套接字接收缓冲区,则将它们舍弃,从而可能导致发送端压垮接收端。

    无需重新引导即可在 /proc 文件系统中更改默认的和最大的窗口大小:

    # su - root
    
    # sysctl -w net.core.rmem_default=262144
    net.core.rmem_default = 262144
    
    # sysctl -w net.core.wmem_default=262144
    net.core.wmem_default = 262144
    
    # sysctl -w net.core.rmem_max=262144
    net.core.rmem_max = 262144
    
    # sysctl -w net.core.wmem_max=262144
    net.core.wmem_max = 262144
    

    以上命令对已经运行的操作系统作出更改。现在您应将以下各行添加到 RAC 集群中每个节点的 /etc/sysctl.conf 文件中,从而使以上更改成为永久性更改(针对每次重新引导而言):

    # Default setting in bytes of the socket receive buffer
    net.core.rmem_default=262144
    
    # Default setting in bytes of the socket send buffer
    net.core.wmem_default=262144
    
    # Maximum socket receive buffer size which may be set by using
    # the SO_RCVBUF socket option
    net.core.rmem_max=262144
    
    # Maximum socket send buffer size which may be set by using
    # the SO_SNDBUF socket option
    net.core.wmem_max=262144
    

    启用 Telnet 和 FTP 服务

    虽然将 Linux 配置为运行 Telnet 和 FTP 服务器,但在默认情况下禁用了这些服务。要启用 telnet 的这些服务,以根用户帐户登录到服务器并运行以下命令:

    # chkconfig telnet on
    # service xinetd reload
    Reloading configuration:[  OK  ]
    

    从 Red Hat Enterprise Linux 3.0 版(以及 CentOS 中)起,FTP 服务器 (wu-ftpd) 不再随 xinetd 一起提供。它已经为 vsftp 所取代,并且可以从 /etc/init.d/vsftpd 启动,如下所示:

    # /etc/init.d/vsftpd start
    Starting vsftpd for vsftpd:[  OK  ]
    

    如果您希望在重新启动(重新引导)计算机时启动和停止 vsftpd 服务,可以创建以下符号链接:

    # ln -s /etc/init.d/vsftpd /etc/rc3.d/S56vsftpd
    # ln -s /etc/init.d/vsftpd /etc/rc4.d/S56vsftpd
    # ln -s /etc/init.d/vsftpd /etc/rc5.d/S56vsftpd
    


    8. 获取并安装新的 Linux 内核/FireWire 模块

    在集群中的所有节点上执行以下内核升级和 FireWire 模块安装!

    接下来的步骤是获取并安装一个新的 Linux 内核以及支持具有多个登录的 IEEE1394 设备的 FireWire 模块。这将需要两个单独的下载和安装:一个用于新的 RHEL4 内核,另一个包含支持的 FireWire 模块。

    在本指南的先前版本中,我提供了下载 Linux 内核的一个修补版本(源代码)及编译它的步骤。 由于 Oracle 的 Linux 项目开发小组的工作,已经不再需要这些步骤了。Oracle 现在提供了一个 RHEL4 的预编译内核(它也可用于 CentOS!),很容易下载和安装。本节介绍了如何下载并安装此内核以及支持的 FireWire 模块。在开始详细说明如何执行这些操作之前,我们先花一些时间来介绍一下新内核需要进行的更改。

    尽管已经有了针对 Linux 的 FireWire 驱动程序,但它们常常不支持共享存储器。通常,当您登录到操作系统时,操作系统将驱动程序与该机器上一个具体的驱动器相连。这种实施方法不适用于我们的 RAC 配置。共享存储器(我们的 FireWire 硬盘驱动器)需要被多个节点所访问。您需要使 FireWire 驱动程序能够提供对驱动器的非独占访问,以便多个服务器(即组成集群的节点)能够访问同一个存储器。通过在源代码中删除在登录期间标识机器的位掩码,导致对 FireWire 硬盘驱动器进行非独占访问,从而实现这一目的。集群中的所有其他节点在其登录会话期间,使用相同的经过修改的驱动程序登录到同一个驱动器,因此它们也具有对于该驱动器的非独占访问权。

    您的实施描述了一个双节点的集群(每个节点具有单处理器)— 每个服务器均运行 CentOS Enterprise Linux。请牢记,需要在两个 Linux 节点上执行打补丁的 Linux 内核的安装过程。CentOS Enterprise Linux 4.2 包含内核 2.6.9-22.EL #1。 我们将需要从以下两个 URL 中下载 OTN 提供的 2.6.9-11.0.0.10.3.EL #1 Linux 内核和支持的 FireWire 模块:

    下载新 RHEL 4 内核的以下文件之一:

    kernel-2.6.9-11.0.0.10.3.EL.i686.rpm -(用于单处理器)

    kernel-smp-2.6.9-11.0.0.10.3.EL.i686.rpm -(用于多处理器)

    下载支持的 FireWire 模块的以下文件之一:

    oracle-firewire-modules-2.6.9-11.0.0.10.3.EL-1286-1.i686.rpm -(用于单处理器)

    oracle-firewire-modules-2.6.9-11.0.0.10.3.ELsmp-1286-1.i686.rpm -(用于多处理器)

    以 root 用户安装新的 RHEL 4 内核:

    # rpm -ivh --force kernel-2.6.9-11.0.0.10.3.EL.i686.rpm - (for single processor)
    

    # rpm -ivh --force kernel-smp-2.6.9-11.0.0.10.3.EL.i686.rpm - (for multiple processors)
    

    使用 RPM 安装新内核还将用适当的节 (stanza) 和默认的引导选项来更新您的 GRUB(或 lilo)配置。安装新内核后不必修改引导加载程序配置。

    注意:安装新内核后,不必在此时继续安装支持的 FireWire 模块。要安装 FireWire 模块,必须先重新引导至新内核中。

    重新引导至新的 Linux 服务器中:

    此刻,新 RHEL4 内核已经安装完毕。您现在需要重新引导至新的 Linux 内核中:

    # init 6
    

    以 root 身份安装支持的 FireWire 模块:

    引导至新的 RHEL 4 内核后,需要通过运行以下任意命令安装支持的 FireWire 模块程序包:

    # rpm -ivh oracle-firewire-modules-2.6.9-11.0.0.10.3.EL-1286-1.i686.rpm — (用于单处理器)
    — 或 —
    # rpm -ivh oracle-firewire-modules-2.6.9-11.0.0.10.3.ELsmp-1286-1.i686.rpm — (用于多处理器)
    

    添加模块选项:

    将以下行添加到 /etc/modprobe.conf

    options sbp2 exclusive_login=0
    

    将串行总线协议模块 (sbp2) 的参数 sbp2 exclusive_login 设置为零是非常重要的,以便允许多个主机并发地登录和访问 FireWire 磁盘。

    在第二个 Linux 服务器上执行以上任务:

    在第一个 Linux 服务器上安装新的 RHEL4 内核和支持的 FireWire 模块后,转移到第二个 Linux 服务器并在其中重复本节中的相同任务。

    将 FireWire 驱动器连接到每台机器并引导进入新的内核中:

    在集群中的两个节点上都执行了以上任务之后,关闭两台 Linux 机器的电源:

    ===============================
    
    # hostname
    linux1
    
    # init 0
    
    ===============================
    
    # hostname
    linux2
    
    # init 0
    
    ===============================
    

    在关闭了两台计算机的电源后,将它们连接到 FireWire 驱动器的后部。打开 FireWire 驱动器的电源。最后,打开每台 Linux 服务器的电源并确保将每台机器引导进入新的内核中。

    注意:在两个节点上执行引导的过程中,“查找新硬件”部分将提示 RHEL4 用户提供 FireWire 硬盘驱动器。只需选择选项“配置”来配置该设备并继续执行引导过程。如果“查找新硬件”部分中未提示您提供新的 FireWire 驱动器,您将需要运行以下命令并重新引导计算机:

    # modprobe -r sbp2
    # modprobe -r sd_mod
    # modprobe -r ohci1394
    # modprobe ohci1394
    # modprobe sd_mod
    # modprobe sbp2
    # init 6
    

    加载 FireWire 堆栈:

    在大多数情况下,在 /etc/rc.sysinit 文件中已经对 FireWire 堆栈加载进行了配置。该文件中所包含的用于加载 FireWire 堆栈的命令是:

    # modprobe sbp2
    # modprobe ohci1394
    

    在 Red Hat 的旧版本中,情况有所不同,必须手动运行这些命令或者将其包含在启动文件中。在 Red Hat Enterprise Linux 3 及更高版本中,这些命令已经包含在 /etc/rc.sysinit 文件中并在每次引导时运行。

    检查 SCSI 设备:

    重新引导每台机器后,内核应该自动把该磁盘检测为 SCSI 设备 (/dev/sdXX)。本节将提供几个应该在集群的所有节点上运行的命令,以验证是否成功地检测到 FireWire 驱动器并由集群中所有节点所共享。

    对于本配置而言,我同时在两个节点上执行上述过程。在过程完成后,我关闭两台机器,首先启动 linux1,然后启动 linux2。以下的命令和结果来自于我的 linux2 机器。同样,请确认您在两个节点上都运行了以下的命令,以确保两台机器都能登录到共享驱动器。

    首先查看该 FireWire 适配器是否已被成功地检测到:

    # lspci
    00:00.0 Host bridge:Intel Corporation 82845G/GL[Brookdale-G]/GE/PE DRAM Controller/Host-Hub Interface (rev 01)
    00:02.0 VGA compatible controller:Intel Corporation 82845G/GL[Brookdale-G]/GE Chipset Integrated Graphics Device (rev 01)
    00:1d.0 USB Controller:Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #1 (rev 01)
    00:1d.1 USB Controller:Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #2 (rev 01)
    00:1d.2 USB Controller:Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) USB UHCI Controller #3 (rev 01)
    00:1d.7 USB Controller:Intel Corporation 82801DB/DBM (ICH4/ICH4-M) USB2 EHCI Controller (rev 01)
    00:1e.0 PCI bridge:Intel Corporation 82801 PCI Bridge (rev 81)
    00:1f.0 ISA bridge:Intel Corporation 82801DB/DBL (ICH4/ICH4-L) LPC Interface Bridge (rev 01)
    00:1f.1 IDE interface:Intel Corporation 82801DB (ICH4) IDE Controller (rev 01)
    00:1f.3 SMBus:Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) SMBus Controller (rev 01)
    00:1f.5 Multimedia audio controller:Intel Corporation 82801DB/DBL/DBM (ICH4/ICH4-L/ICH4-M) AC'97 Audio Controller (rev 01)
    01:04:00.0 Ethernet controller:Linksys NC100 Network Everywhere Fast Ethernet 10/100 (rev 11)
    01:06:00.0 FireWire (IEEE 1394):Texas Instruments TSB43AB23 IEEE-1394a-2000 Controller (PHY/Link)
    01:09.0 Ethernet controller:Broadcom Corporation BCM4401 100Base-T (rev 01)
    

    然后,查看是否已加载这些模块:

    # lsmod |egrep "ohci1394|sbp2|ieee1394|sd_mod|scsi_mod"
    sd_mod                 17217   0
    sbp2                   23948   0
    scsi_mod              121293  2 sd_mod,sbp2
    ohci1394               35784  0
    ieee1394              298228  2 sbp2,ohci1394
    

    第三步,确认已检测到磁盘并由内核创建了一个条目:

    # cat /proc/scsi/scsi
    Attached devices:
    Host:scsi0 Channel:00 Id:01 Lun: 00
    Vendor:Maxtor   Model:OneTouch II      Rev:023g
    Type:Direct-Access                    ANSI SCSI revision: 06
    

    现在,我们将确认 FireWire 驱动器可以被多个登录所访问,并显示有效登录:

    # dmesg | grep sbp2
    sbp2:$Rev:1265 $ Ben Collins 
    ieee1394:sbp2:Maximum concurrent logins supported: 2
    ieee1394:sbp2:Number of active logins: 0
    ieee1394:sbp2:Logged into SBP-2 device
    

    从以上输出中,可以看到我的 FireWire 驱动器能够支持多达 2 个服务器的并发登录。您的驱动器的芯片组应该支持 RAC 集群中所有节点的并发访问,这很重要。

    我喜欢执行的另一项测试是从集群中的每个节点上运行快速的 fdisk -l,以验证它确实被操作系统所接受。您的驱动器可能会显示该设备不包含有效的分区表,但就 RAC 配置的这一阶段而言,这样是完全可以的。

    # fdisk -l
    Disk /dev/hda:40.0 GB, 40000000000 bytes
    255 heads, 63 sectors/track, 4863 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot    Start       End    Blocks   Id  System
    /dev/hda1   *         1        13    104391   83  Linux
    /dev/hda2              14        4863    38957625   8e  Linux LVM
    
    Disk /dev/sda:300.0 GB, 300090728448 bytes
    255 heads, 63 sectors/track, 36483 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot    Start       End    Blocks   Id  System
    /dev/sda1               1       36483   293049666    c  W95 FAT32 (LBA)
    

    不再需要重新扫描 SCSI 总线:

    在内核的旧版本中,我需要运行 rescan-scsi-bus.sh 脚本来检测 FireWire 驱动器。此脚本的目的是通过使用以下命令为节点创建 SCSI 项:

    echo "scsi add-single-device 0 0 0 0" > /proc/scsi/scsi
    

    在 RHEL3 和 RHEL4 中,不再需要该步骤,会自动检测到磁盘。

    SCSI 设备检测方面的故障诊断:

    如果您在检测 SCSI 设备的任何步骤(如上所述)中遇到问题,可以尝试以下操作:

    # modprobe -r sbp2
    # modprobe -r sd_mod
    # modprobe -r ohci1394
    # modprobe ohci1394
    # modprobe sd_mod
    # modprobe sbp2
    

    您可能还要拔下任何连接到服务器的 USB 设备。如果连接了 USB 设备,系统可能无法识别您的 FireWire 驱动器!


    9. 创建“oracle”用户和目录(在两个节点上)

    在集群中的所有节点上执行以下任务!

    您将使用 OCFS2 存储 Oracle 集群件软件需要共享的文件。使用 OCFS2 时,集群中所有计算机上的 UNIX 用户 oracle 的 UID 以及 UNIX 组 dba 的 GID 都必须相同。如果 UID 或 GID 不同,则 OCFS 文件系统中的文件将显示为“unowned”,甚至可能被其他用户所拥有。对于本文而言,oracle UID 使用 175,dba GID 使用 115。

    创建 Oracle 的组和用户

    让我们继续此示例,创建 Unix dba 组和 oracle 用户帐户以及所有相关目录。

    # mkdir -p /u01/app
    # groupadd -g 115 dba
    # useradd -u 175 -g 115 -d /u01/app/oracle -s /bin/bash -c "Oracle Software Owner" -p oracle oracle
    # chown -R oracle:dba /u01
    # passwd oracle
    # su - oracle
    

    注意:当您为每个 RAC 节点设置 Oracle 环境变量时,请确保为每个 RAC 节点分配唯一的 Oracle SID! 对于此示例,我使用:

    • linux1 :ORACLE_SID=orcl1
    • linux2 :ORACLE_SID=orcl2

    在两个节点上都创建了“oracle”UNIX 用户 id 后,通过使用以下 .bash_profile 确保正确设置了环境:

    
    ....................................
    
    # .bash_profile
    
    # Get the aliases and functions
    if [ -f ~/.bashrc ]; then
    . ~/.bashrc
    fi
    
    alias ls="ls -FA"
    
    # User specific environment and startup programs
    export ORACLE_BASE=/u01/app/oracle
    export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
    export ORA_CRS_HOME=$ORACLE_BASE/product/crs
    export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin
    
    # Each RAC node must have a unique ORACLE_SID.(i.e. orcl1, orcl2,...)
    export ORACLE_SID=orcl1
    
    export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin
    export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
    export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin
    export ORACLE_TERM=xterm
    export TNS_ADMIN=$ORACLE_HOME/network/admin
    export ORA_NLS10=$ORACLE_HOME/nls/data
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
    export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
    export CLASSPATH=$ORACLE_HOME/JRE
    export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
    export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
    export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
    export THREADS_FLAG=native
    export TEMP=/tmp
    export TMPDIR=/tmp
    
    ....................................
    

    为 OCFS2/集群件创建挂载点

    最后,为将用于存储两个 Oracle 集群件共享文件的 OCFS2 文件系统创建挂载点。需要以“root”用户帐户运行这些命令:

    $ su -
    # mkdir -p /u02/oradata/orcl
    # chown -R oracle:dba /u02
    

    确保为 OUI 提供足够的临时空间

    注意:Oracle Universal Installer (OUI) 最多需要 /tmp 目录具有 400MB 可用空间。

    您可以运行以下命令查看 /tmp 中的可用空间:

    # cat /proc/swaps
    Filename                                Type            Size    Used    Priority
    /dev/mapper/VolGroup00-LogVol01         partition       2031608 0       -1
    

    — 或 —

    # cat /proc/meminfo | grep SwapTotal
    SwapTotal:2031608 kB
    

    如果由于某种原因,您在 /tmp 中没有足够的空间,您可以在其他文件系统中临时创建空间,并在安装期间将您的 TEMPTMPDIR 指向该空间。以下是完成此操作的步骤:

    # su -
    # mkdir //tmp
    # chown root.root //tmp
    # chmod 1777 //tmp
    # export TEMP=//tmp     # used by Oracle
    # export TMPDIR=//tmp   # used by Linux programs
    #   like the linker "ld"
    

    当 Oracle 的安装完成时,您可以使用以下命令删除该临时目录:

    # su -
    # rmdir //tmp
    # unset TEMP
    # unset TMPDIR
    

    10. 在共享的 FireWire 存储设备上创建分区

    仅在集群中的一个节点上创建以下分区!

    接下来的步骤是在 FireWire(共享)驱动器上创建所需的分区。正如我在前面指出的,您将使用 OCFS2 来存储 Oracle 的集群件软件要共享的两个文件。然后,您将创建三个 ASM 卷;两个 ASM 卷用于所有物理数据库文件(数据/索引文件、联机重做日志文件、控制文件、SPFILE 和归档重做日志文件),另一个用于闪回恢复区。

    下表列出了将要在 FireWire(共享)驱动器上创建的各个分区以及它们将包含的文件。

    Oracle 共享驱动器配置
    文件系统类型 分区 大小 挂载点 ASM 磁盘组名称 文件类型
    OCFS2 /dev/sda1 1GB /u02/oradata/orcl Oracle 集群注册表文件 — (~100MB)
    CRS 表决磁盘 — (~20MB)
    ASM /dev/sda2 50GB ORCL:VOL1 +ORCL_DATA1 Oracle 数据库文件
    ASM /dev/sda3 50GB ORCL:VOL2 +ORCL_DATA1 Oracle 数据库文件
    ASM /dev/sda4 100GB ORCL:VOL3 +FLASH_RECOVERY_AREA Oracle 闪回恢复区
    总计 201GB

    在 FireWire 共享存储器上创建所有分区

    如上表中所示,我的 FireWire 驱动器显示为 SCSI 设备 /dev/sda。fdisk 命令用于创建(和删除)分区。对于此配置而言,我们将创建四个分区:一个分区用于 Oracle 的集群件共享文件,余下的三个分区用于 ASM(存储所有 Oracle 数据库文件和闪回恢复区)。在创建新分区之前,删除 FireWire 驱动器上的现有分区(如果有)是很重要的:

    # fdisk /dev/sda
    Command (m for help):p
    
    Disk /dev/sda:300.0 GB, 300090728448 bytes
    255 heads, 63 sectors/track, 36483 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot    Start       End    Blocks   Id  System
    /dev/sda1               1       36483   293049666    c  W95 FAT32 (LBA)
    
    
    Command (m for help):d
    Selected partition 1
    
    Command (m for help):p
    
    Disk /dev/sda:300.0 GB, 300090728448 bytes
    255 heads, 63 sectors/track, 36483 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot    Start       End    Blocks   Id  System
    
    
    Command (m for help):n
    Command action
    e   extended
    p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-36483, default 1): 1
    Last cylinder or +size or +sizeM or +sizeK (1-36483, default 36483):+1G
    
    
    Command (m for help):n
    Command action
    e   extended
    p   primary partition (1-4)
    p
    Partition number (1-4): 2
    First cylinder (124-36483, default 124): 124
    Last cylinder or +size or +sizeM or +sizeK (124-36483, default 36483):+50G
    
    Command (m for help):n
    Command action
    e   extended
    p   primary partition (1-4)
    p
    Partition number (1-4): 3
    First cylinder (6204-36483, default 6204): 6204
    Last cylinder or +size or +sizeM or +sizeK (6204-36483, default 36483):+50G
    
    Command (m for help):n
    Command action
    e   extended
    p   primary partition (1-4)
    p
    Selected partition 4
    First cylinder (12284-36483, default 12284): 12284
    Last cylinder or +size or +sizeM or +sizeK (12284-36483, default 36483):+100G
    
    Command (m for help):p
    
    Disk /dev/sda:300.0 GB, 300090728448 bytes
    255 heads, 63 sectors/track, 36483 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot    Start       End    Blocks   Id  System
    /dev/sda1             1        123    987966   83  Linux
    /dev/sda2            124      6203  48837600   83  Linux
    /dev/sda3          6204     12283  48837600   83  Linux
    /dev/sda4           12284       24442    97667167+  83  Linux
    
    Command (m for help):w
    The partition table has been altered!
    
    Calling ioctl() to re-read partition table.
    Syncing disks.
    

    在创建了所有必要分区后,现在应以 root 用户帐户使用以下语法将分区的更改情况通知给内核:

    # partprobe
    
    # fdisk -l /dev/sda
    Disk /dev/sda:300.0 GB, 300090728448 bytes
    255 heads, 63 sectors/track, 36483 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    
    Device Boot    Start       End    Blocks   Id  System
    /dev/sda1             1        123    987966   83  Linux
    /dev/sda2            124      6203  48837600   83  Linux
    /dev/sda3          6204     12283  48837600   83  Linux
    /dev/sda4           12284       24442    97667167+  83  Linux
    

    (注意:FireWire 驱动器和所创建的分区将显示为 SCSI 设备。)

    ...退出这个无聊的娱乐圈!

    TOP

    11. 为 Oracle 配置 Linux 服务器

    在集群中的所有节点上执行下列配置过程!

    每次启动计算机时,都需要在集群中的每个节点上执行本节中的一些命令。本节详细介绍了如何设置共享内存、信号和文件句柄限制。第 14 节(“用于每个 RAC 节点的所有启动命令”)中包含有关如何将这些命令置于启动脚本 (/etc/sysctl.conf) 中的说明。

    概述

    本节主要介绍了如何配置两个 Linux 服务器:使每个服务器为 Oracle RAC 10g 安装做好准备。这包括验证足够的交换空间、设置共享内存和信号,以及最后如何设置操作系统的最大文件句柄数。

    在本节中,您将注意到可以使用多种方法来配置(设置)这些参数。就本文而言,我将通过把所有命令置于 /etc/sysctl.conf 文件中使所有更改永久有效(通过重新引导)。

    对交换空间的考虑因素

    • 安装 Oracle10g 第 2 版至少需要 512MB 内存。(注:安装期间交换容量不足会导致 Oracle Universal Installer“挂起”或“死机”)
    • 要检查您已经分配的内存/交换容量,键入:
      # cat /proc/meminfo | grep MemTotal
      MemTotal:1034352 kB
      
    • 如果您的内存少于 512MB(介于 RAM 与 SWAP 之间),您可以通过创建临时交换文件添加临时交换空间。这样,您就不必使用原始设备甚至更彻底地重建系统了。

      以 root 身份创建一个用作额外交换空间的文件,假设大小为 300MB:

      # dd if=/dev/zero of=tempswap bs=1k count=300000

      现在我们应该更改文件的权限:

      # chmod 600 tempswap

      最后我们将该“分区”格式化为交换分区,并将其添加到交换空间:

      # mke2fs tempswap
      # mkswap tempswap
      # swapon tempswap

    设置共享内存

    共享内存通过将通用的结构和数据放在共享内存段中,使得进程可以对它们进行访问。这是现有最快的进程间通信 (IPC) 方式,主要是因为数据在进程之间传递时没有涉及内核操作。不需要在进程间复制数据。

    Oracle 将共享内存用于它的共享全局区 (SGA),这是一个由所有的 Oracle 备份进程及前台进程共享的内存区域。为 SGA 分配足够的容量对于 Oracle 的性能非常重要,这是因为它负责保存数据库缓冲区高速缓存、共享 SQL、访问路径,等等。

    要确定所有共享内存的限制,使用以下命令:

    # ipcs -lm
    
    ------ Shared Memory Limits --------
    max number of segments = 4096
    max seg size (kbytes) = 32768
    max total shared memory (kbytes) = 8388608
    min seg size (bytes) = 1
    
    设置 SHMMAX

    SHMMAX 参数定义共享内存段的最大大小(以字节为单位)。Oracle SGA 由共享内存组成,且错误设置 SHMMAX 可能会限制 SGA 的大小。在设置 SHMMAX 时,切记 SGA 的大小应该适合于一个共享内存段。SHMMAX 设置不足可能会导致以下问题:

    ORA-27123:unable to attach to shared memory segment
    
    您可以通过执行以下命令确定 SHMMAX 的值:
    # cat /proc/sys/kernel/shmmax
    33554432
    
    SHMMAX 的默认值为 32MB。通常,这个值对于配置 Oracle SGA 而言太小了。我通常使用以下方法将 SHMMAX 参数设置为 2GB:
    • 可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/kernel/shmmax) 来更改 SHMMAX 的默认设置,而不必重新引导计算机:
      # sysctl -w kernel.shmmax=2147483648
      

    • 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使该更改永久有效:
      # echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
      

    设置 SHMMNI

    我们现在看一下 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096

    可以通过执行以下命令确定 SHMMNI 的值:

    # cat /proc/sys/kernel/shmmni
    4096
    
    SHMMNI 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。

    设置 SHMALL

    最后,我们来看 SHMALL 共享内存内核参数。该参数控制系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应至少为:

    ceil(SHMMAX/PAGE_SIZE)
    
    SHMALL 的默认大小为 2097152,并可以使用以下命令进行查询:
    # cat /proc/sys/kernel/shmall
    2097152
    
    SHMALL 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。

    (注:i386 平台上的 Red Hat Linux 中的页面大小为 4,096 字节。但您可以使用 bigpages,它支持更大内存页面的配置。)

    设置信号

    至此,您已经配置了共享内存设置,接下来将配置信号。对“信号”的最佳描述是,它是用于在共享资源(如共享内存)的进程(或进程中的线程)之间提供同步的计数器。UNIX System V 支持信号集,其中的每个信号都是一个计数信号。当应用程序请求信号时,它使用“集合”来完成此工作。

    要确定所有信号限制,使用以下命令:

    # ipcs -ls
    
    ------ Semaphore Limits --------
    max number of arrays = 128
    max semaphores per array = 250
    max semaphores system wide = 32000
    max ops per semop call = 32
    semaphore max value = 32767
    

    您还可以使用以下命令:

    # cat /proc/sys/kernel/sem
    250     32000   32      128
    
    设置 SEMMSL

    SEMMSL 内核参数用于控制每个信号集合的最大信号数。

    Oracle 建议将 SEMMSL 设置为 init.ora 文件(适用于 Linux 系统上所有数据库)中的最大 PROCESS 实例参数设置再加上 10。此外,Oracle 建议将 SEMMSL 设置为不小于 100。

    设置 SEMMNI

    SEMMNI 内核参数用于控制整个 Linux 系统中信号集的最大数量。Oracle 建议将 SEMMNI 设置为不小于 100。

    设置 SEMMNS

    SEMMNS 内核参数用于控制整个 Linux 系统中的信号(而非信号集)的最大数量。

    Oracle 建议将 SEMMNS 设置为系统上每个数据库的 PROCESSES 实例参数设置之和,加上最大的 PROCESSES 的两倍,最后为系统上的每个 Oracle 数据库加上 10。

    使用以下计算式确定可以在 Linux 系统上分配的信号的最大数量。它将是以下两者中较小的一个值:

    SEMMNS  — 或 — (SEMMSL * SEMMNI) 。
    

    设置 SEMOPM

    SEMOPM 内核参数用于控制每个 semop 系统调用可以执行的信号操作数。

    semop 系统调用(函数)能够使用一个 semop 系统调用完成多个信号的操作。一个信号集可以拥有每个信号集中最大数量的 SEMMSL,因此建议将 SEMOPM 设置为等于 SEMMSL

    Oracle 建议将 SEMOPM 设置为不小于 100。

    设置信号内核参数

    最后,我们来看如何使用一些方法来设置所有信号参数。在下文中,我想更改(增加)的唯一参数是 SEMOPM。所有其他的默认设置可以完全满足我们的示例安装。

    • 可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/kernel/sem) 来更改所有信号设置的默认设置,而不必重新引导计算机:
      # sysctl -w kernel.sem="250 32000 100 128"
    • 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
      # echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
      

    设置文件句柄

    在配置我们的 Red Hat Linux 服务器时,确保文件句柄的最大数量足够大是非常关键的。文件句柄的设置表示您在 Linux 系统上可以打开的文件数。

    使用以下命令来确定整个系统中文件句柄的最大数量:

    # cat /proc/sys/fs/file-max
    102563
    
    Oracle 建议将整个系统的文件句柄值至少设置为 65536
    • 可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/fs/file-max) 更改文件句柄最大数量的默认设置,不必重新引导计算机:
      # sysctl -w fs.file-max=65536
      

    • 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
      # echo "fs.file-max=65536" >> /etc/sysctl.conf
      
    可以通过使用以下命令查询文件句柄的当前使用情况:
    # cat /proc/sys/fs/file-nr
    825     0       65536
    
    file-nr 文件显示了三个参数:分配的文件句柄总数、当前使用的文件句柄数以及可以分配的最大文件句柄数。

    (注:如果需要增大 /proc/sys/fs/file-max 中的值,请确保正确设置 ulimit。对于 2.4.20,通常将其设置为 unlimited。使用 ulimit 命令验证 ulimit 设置:

    # ulimit
    unlimited
    

    12. 配置 hangcheck-timer 内核模块

    在集群中的所有节点上执行下列配置过程!

    Oracle9i 第 1 版 (9.0.1) 和 Oracle9i 第 2 版 ( 9.2.0.1) 使用一个称为 watchdogd 的用户空间监视后台程序 监视集群的运行状况,并在出现故障时重新启动 RAC 节点。从 Oracle9i 第 2 版 (9.2.0.2) 开始(在 Oracle 10g 第 2 版中仍然存在),一个称为 hangcheck-timer 的 Linux 内核模块取代了监视后台程序,该模块更好地解决了可用性和可靠性问题。它将 hang-check 计时器加载到 Linux 内核中并检查系统是否挂起。它将设置一个计时器,并在特定的时间量之后检查该计时器。有一个用于检查挂起情况的可配置阈值,如果超过该阈值,计算机将重新启动。尽管 Oracle 集群件(集群管理器)操作不需要 hangcheck-timer 模块,但 Oracle 强烈建议使用它。

    hangcheck-timer.ko 模块

    hangcheck-timer 模块使用了一个基于内核的计时器,该计时器周期性地检查系统任务调度程序来捕获延迟,从而确定系统的运行状况。如果系统挂起或暂停,则计时器重置该节点。hangcheck-timer 模块使用时间戳计数器 (TSC) CPU 寄存器,该寄存器每接收到一个时钟信号就将计数加一。由于此寄存器由硬件自动更新,因此 TCS 提供了更精确的时间度量。

    关于 hangcheck-timer 项目的更多信息可在此处找到。

    安装 hangcheck-timer.ko 模块

    hangcheck-timer 最初只由 Oracle 提供;但是,从内核版本 2.4.9-e.12 和更高版本开始,此模块现在包含在 Red Hat Linux 中。如果您按照第 8 节(“获取并安装新的 Linux 内核/FireWire 模块”)中的步骤执行操作,则已经包含了 hangcheck-timer。使用以下命令确认:

    # find /lib/modules -name "hangcheck-timer.ko"
    /lib/modules/2.6.9-11.0.0.10.3.EL/kernel/drivers/char/hangcheck-timer.ko
    /lib/modules/2.6.9-22.EL/kernel/drivers/char/hangcheck-timer.ko
    

    在以上输出中,我们关注的是 /lib/modules/2.6.9-11.0.0.10.3.EL/kernel/drivers/char 目录中的 hangcheck 计时器对象 (hangcheck-timer.ko)。

    配置并加载 hangcheck-timer 模块

    hangcheck-timer 模块有两个关键的参数:

    • hangcheck-tick:此参数定义了系统运行状况检查的间隔时间。默认值为 60 秒;Oracle 建议将它设置为 30 秒。
    • hangcheck-margin:此参数定义了 hangcheck-timer 在重置 RAC 节点前所容许的最大挂起延迟。它定义了以秒为单位的误差幅度。默认值为 180 秒;Oracle 建议将它设置为 180 秒。

    注意:这两个 hangcheck-timer 模块参数表示在该模块重置系统前 RAC 节点必须挂起的时长。当以下条件为真时将会重置节点:

    系统挂起时间 > (hangcheck_tick + hangcheck_margin)
    

    配置 Hangcheck 内核模块参数

    每次加载 hangcheck-timer 内核模块(手动加载或由 Oracle 加载)时,它都需要知道对我们刚刚讨论的两个参数(hangcheck-tickhangcheck-margin) 所使用的值。这些值需要在每次重新启动 Linux 服务器后可用。为此,在 /etc/modprobe.conf 文件中创建一个具有正确值的条目,如下所示:

    # su -
    # echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modprobe.conf
    

    每次加载 hangcheck-timer 内核模块时,它将使用由我在 /etc/modprobe.conf 文件中创建的条目定义的值。

    手动加载 Hangcheck 内核模块以进行测试

    Oracle 负责在需要时加载 hangcheck-timer 内核模块。因此,不必在任何启动文件(如 /etc/rc.local)中执行 hangcheck-timer 内核模块的 modprobeinsmod

    我继续在 /etc/rc.local 文件中包含 hangcheck-timer 内核模块的 modprobe 完全只是出于个人习惯。有朝一日我将戒掉这个习惯,但请注意,启动过程中包含 hangcheck-timer 内核模块的 modprobe 并无害处。

    为了使自己保持清醒并能够在夜晚安睡,我始终按如下所示在每次启动时配置 hangcheck-timer 内核的加载:

    # echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local
    

    (注:您不必在每次重新启动后使用 modprobeinsmod 手动加载 hangcheck-timer 内核模块。Oracle 将在需要时自动加载 hangcheck-timer 模块。)

    现在,为了测试 hangcheck-timer 内核模块以验证它是否选取我们在 /etc/modprobe.conf 文件中定义的正确参数,使用 modprobe 命令。尽管可以通过向其传递相应的参数(如 insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180)加载 hangcheck-timer 内核模块,但我们需要验证它是否选取了我们在 /etc/modprobe.conf 文件中设置的选项。

    要手动加载 hangcheck-timer 内核模块并验证它是否使用在 /etc/modprobe.conf 文件中定义的正确值,运行以下命令:

    # su -
    # modprobe hangcheck-timer
    # grep Hangcheck /var/log/messages | tail -2
    Sep 27 23:11:51 linux2 kernel:Hangcheck:starting hangcheck timer 0.5.0 (tick is 30 seconds, margin is 180 seconds)
    


    13. 配置 RAC 节点以进行远程访问

    在集群中的所有节点上执行下列配置过程!

    在 RAC 节点上运行 Oracle Universal Installer 时,它将使用 rsh(或 ssh)命令将 Oracle 软件复制到 RAC 集群中的所有其他节点上。运行 Oracle Installer (runInstaller) 的节点上的 oracle UNIX 帐户必须为 RAC 集群中的所有其他节点所信任。因此,您应该能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行 r* 命令(如 rshrcprlogin)。rsh 后台程序使用位于用户(oracle 的)主目录中的 /etc/hosts.equiv 文件或 .rhosts 文件验证用户。(正常的 RAC 操作不需要使用 rcprsh。但应为 RAC 和补丁集安装启用 rcprsh。)

    Oracle 在 Oracle RAC 10g 第 1 版中增加了一项支持,即可以将安全 Shell (SSH) 工具套件用于设置用户等效项。但本文使用较旧的方法 rcp 将 Oracle 软件复制到集群中的其他节点上。使用 SSH 工具套件时,可以使用 scp(与 rcp 相反)命令以非常安全的方式复制软件。

    首先,确保在 RAC 集群中的每个节点上都安装了 rsh RPM:

    # rpm -q rsh rsh-server
    rsh-0.17-25.3
    rsh-server-0.17-25.3
    

    根据以上信息,我们可以确认已经安装了 rshrsh-server。如果未安装 rsh,则可以从 RPM 所在的 CD 中运行以下命令:

    # su -
    # rpm -ivh rsh-0.17-25.3.i386.rpm rsh-server-0.17-25.3.i386.rpm
    

    要启用“rsh”和“rlogin”服务,必须将 /etc/xinetd.d/rsh 文件中的“disable”属性设置为“no”并且必须重新加载 xinetd。为此,在集群中的所有节点上运行以下命令:

    # su -
    # chkconfig rsh on
    # chkconfig rlogin on
    # service xinetd reload
    Reloading configuration:[  OK  ]
    

    要使“oracle”UNIX 用户帐户在 RAC 节点中获得信任,在集群中的所有节点上创建 /etc/hosts.equiv 文件:

    # su -
    # touch /etc/hosts.equiv
    # chmod 600 /etc/hosts.equiv
    # chown root.root /etc/hosts.equiv
    

    现在,将所有 RAC 节点添加到集群中类似于以下示例的所有节点/etc/hosts.equiv 文件中:

    # cat /etc/hosts.equiv
    +linux1 oracle
    +linux2 oracle
    +int-linux1 oracle
    +int-linux2 oracle
    

    注意:在以上示例中,第二个字段只允许 oracle 用户帐户在指定节点上运行 rsh 命令。由于安全原因,/etc/hosts.equiv 文件应该由 root 所拥有,并应该将权限设置为 600。实际上,某些系统只有在文件所有者为 root 且权限设置为 600 时,才接受此文件的内容。

    尝试测试 rsh 命令前,确保使用的是正确版本的 rsh。在默认情况下,Red Hat Linux 将 /usr/kerberos/sbin 放在 $PATH 变量的前面。这会导致执行 rsh 的 Kerberos 版本。

    我通常会重命名 rsh 的 Kerberos 版本,以便使用正常的 rsh 命令。使用以下命令:

    # su -
    
    # which rsh
    /usr/kerberos/bin/rsh
    
    # mv /usr/kerberos/bin/rsh /usr/kerberos/bin/rsh.original
    # mv /usr/kerberos/bin/rcp /usr/kerberos/bin/rcp.original
    # mv /usr/kerberos/bin/rlogin /usr/kerberos/bin/rlogin.original
    
    # which rsh
    /usr/bin/rsh
    

    现在,应从将要执行 Oracle 集群件和 10g RAC 安装的节点测试连接并运行 rsh 命令。我将使用节点 linux1 执行所有安装,因此我将从该节点运行以下命令:

    # su - oracle
    
    $ rsh linux1 ls -l /etc/hosts.equiv
    -rw-------  1 root  root  68 Sep 27 23:37 /etc/hosts.equiv
    
    $ rsh int-linux1 ls -l /etc/hosts.equiv
    -rw-------  1 root  root  68 Sep 27 23:37 /etc/hosts.equiv
    
    $ rsh linux2 ls -l /etc/hosts.equiv
    -rw-------  1 root  root  68 Sep 27 23:37 /etc/hosts.equiv
    
    $ rsh int-linux2 ls -l /etc/hosts.equiv
    -rw-------  1 root  root  68 Sep 27 23:37 /etc/hosts.equiv
    


    14. 适用于每个 RAC 节点的所有启动命令

    验证以下启动命令是否包含在集群中的所有节点上!

    至此,您已经详细了解了需要在 Oracle10g RAC 配置的所有节点上配置的参数和资源。在本部分中,我们将稍事调整,简要复述这些参数、命令和条目(在本文前面的章节中已提到过),当引导计算机时需要在每个节点上执行它们。

    对于以下的每个启动文件,都应将灰色的条目包含在每个启动文件中。

    /etc/modprobe.conf

    (所有要由内核模块使用的参数和值。)

    alias eth0 b44
    alias eth1 tulip
    alias snd-card-0 snd-intel8x0
    options snd-card-0 index=0
    alias usb-controller ehci-hcd
    alias usb-controller1 uhci-hcd
    options sbp2 exclusive_login=0
    alias scsi_hostadapter sbp2
    options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
    

    /etc/sysctl.conf

    (我们需要调整互联的默认和最大发送缓冲区大小以及默认和最大的接收缓冲区大小。)该文件还包含那些负责配置由 Oracle 实例使用的共享内存、信号和文件句柄的参数。)

    # Kernel sysctl configuration file for Red Hat Linux
    #
    # For binary values, 0 is disabled, 1 is enabled.See sysctl(8) and
    # sysctl.conf(5) for more details.
    
    # Controls IP packet forwarding
    net.ipv4.ip_forward = 0
    
    # Controls source route verification
    net.ipv4.conf.default.rp_filter = 1
    
    # Controls the System Request debugging functionality of the kernel
    kernel.sysrq = 0
    
    # Controls whether core dumps will append the PID to the core filename.
    # Useful for debugging multi-threaded applications.
    kernel.core_uses_pid = 1
    
    # Default setting in bytes of the socket receive buffer
    net.core.rmem_default=262144
    
    # Default setting in bytes of the socket send buffer
    net.core.wmem_default=262144
    
    # Maximum socket receive buffer size which may be set by using
    # the SO_RCVBUF socket option
    net.core.rmem_max=262144
    
    # Maximum socket send buffer size which may be set by using
    # the SO_SNDBUF socket option
    net.core.wmem_max=262144
    
    # +---------------------------------------------------------+
    # | SHARED MEMORY                                           |
    # +---------------------------------------------------------+
    kernel.shmmax=2147483648
    
    # +---------------------------------------------------------+
    # | SEMAPHORES                                              |
    # | ----------                                              |
    # |                                                         |
    # | SEMMSL_value  SEMMNS_value  SEMOPM_value  SEMMNI_value  |
    # |                                                         |
    # +---------------------------------------------------------+
    kernel.sem=250 32000 100 128
    
    # +---------------------------------------------------------+
    # | FILE HANDLES                                            |
    # ----------------------------------------------------------+
    fs.file-max=65536
    

    /etc/hosts

    (RAC 集群中的节点的所有计算机/IP 条目。)

    # Do not remove the following line, or various programs
    # that require network functionality will fail.
    127.0.0.1        localhost.localdomain   localhost
    # Public Network - (eth0)
    192.168.1.100    linux1
    192.168.1.101   linux2
    # Private Interconnect - (eth1)
    192.168.2.100   int-linux1
    192.168.2.101    int-linux2
    # Public Virtual IP (VIP) addresses for - (eth0)
    192.168.1.200    vip-linux1
    192.168.1.201    vip-linux2
    192.168.1.106    melody
    192.168.1.102    alex
    192.168.1.105    bartman
    

    /etc/hosts.equiv

    (允许以 oracle 用户帐户登录每个节点而不需要口令。)

    +linux1 oracle
    +linux2 oracle
    +int-linux1 oracle
    +int-linux2 oracle
    

    /etc/rc.local

    (加载 hangcheck-timer 内核模块。)

    #!/bin/sh
    #
    # This script will be executed *after* all the other init scripts.
    # You can put your own initialization stuff in here if you don't
    # want to do the full Sys V style init stuff.
    
    touch /var/lock/subsys/local
    
    # +---------------------------------------------------------+
    # | HANGCHECK TIMER                                         |
    # | (I do not believe this is required, but doesn't hurt)   |
    # ----------------------------------------------------------+
    
    /sbin/modprobe hangcheck-timer
    


    15. 检查 Oracle 10g 第 2 版的 RPM 程序包

    在集群中的所有节点上执行以下检查!

    安装 Linux O/S(CentOS Enterprise Linux 或 RHEL4)时,应确保安装了所有必需的 RPM。如果您遵循我所提供的 Linux 安装指导,则已经安装了所有内容,这时您将拥有所有必需的 RPM 程序包。但如果您执行了其他安装类型(例如,高级服务器),则可能缺少某些程序包并需要安装它们。所有必需的 RPM 都位于 Linux CD/ISO 上。

    检查必需的 RPM

    必须安装以下程序包(或更高版本):

    make-3.80-5
    glibc-2.3.4-2.9
    glibc-devel-2.3.4-2.9
    glibc-headers-2.3.4-2.9
    glibc-kernheaders-2.4-9.1.87
    cpp-3.4.3-22.1
    compat-db-4.1.25-9
    compat-gcc-32-3.2.3-47.3
    compat-gcc-32-c++-3.2.3-47.3
    compat-libstdc++-33-3.2.3-47.3
    compat-libstdc++-296-2.96-132.7.2
    openmotif-2.2.3-9.RHEL4.1
    setarch-1.6-1
    

    要查询程序包信息(例如,gcc 和 glibc-devel),使用“rpm -q <程序包名> [, <程序包名>]”命令,如下所示:

    # rpm -q gcc glibc-devel
    gcc-3.4.3-22.1
    glibc-devel-2.3.4-2.9
    

    如果需要安装以上任意程序包,使用“rpm -Uvh <程序包名.rpm>”。例如,要安装 GCC 3.2.3-24 程序包,使用:

    # rpm -Uvh gcc-3.4.3-22.1.i386.rpm
    

    重新启动系统

    如果对 O/S 进行了任何更改,则在尝试安装任何 Oracle 组件之前应重新引导集群中的所有节点。!!!

    # init 6
    


    16. 安装和配置 OCFS2

    应在集群中的所有节点上执行本节中的大多数配置过程!但创建 OCFS2 文件系统应只在集群中的一个节点上执行。

    现在将安装 OCFS2。OCFS2 是一个集群文件系统,它允许集群中的所有节点通过标准文件系统接口并发访问设备。这样便可以对需要在集群中运行的应用程序进行轻松地管理。

    OCFS 第 1 版于 2002 年发布,使 Oracle RAC 用户可以运行集群化数据库而不必处理 RAW 设备。文件系统是为存储数据库相关文件如数据文件、控制文件、重做日志、归档日志等设计的。而 OCFS2 则是作为一个通用集群文件系统而设计的。使用它,用户不但可以在共享磁盘上存储与数据库相关的文件,而且还可以存储 Oracle 二进制文件和配置文件(共享的 Oracle Home),从而使 RAC 的管理变得更简单。

    在本指南中,您将使用 OCFS2 存储需要由 Oracle 集群件软件共享的两个文件。(除了这两个文件以外,您还将使用此空间存储所有 Oracle RAC 实例的共享 SPFILE。)

    有关适用于 Linux 的 OCFS2 的更多信息(包括安装说明),请参见本页面

    下载 OCFS

    首先,下载 OCFS2 发布版本。OCFS2 发布版本包含两组 RPM,即内核模块和工具。内核模块可以从 http://oss.oracle.com/projects/ocfs2/files/ 下载,而工具可以从 http://oss.oracle.com/projects/ocfs2-tools/files/ 下载。

    从关键的 OCFS2 内核模块(驱动程序)开始,下载相应的 RPM。从三个可用的内核模块(如下所示)中,下载与发布版本、平台、内核版本以及内核风格(smp、hugemem、psmp 等)匹配的内核模块。

    ocfs2-2.6.9-11.0.0.10.3.EL-1.0.4-1.i686.rpm -(适用于单处理器)

    ocfs2-2.6.9-11.0.0.10.3.ELsmp-1.0.4-1.i686.rpm -(适用于多处理器)

    ocfs2-2.6.9-11.0.0.10.3.ELhugemem-1.0.4-1.i686.rpm -(适用于 hugemem)

    而工具只需匹配平台和发布版本。您应下载 OCFS2 工具和 OCFS2 控制台应用程序。

    ocfs2-tools-1.0.2-1.i386.rpm -(OCFS2 工具)
    ocfs2console-1.0.2-1.i386.rpm -(OCFS2 控制台)

    尽管 OCFS2 控制台是可选的,但强烈建议使用它。ocfs2console 应用程序需要 e2fsprogs、glib2 2.2.3 或更高版本、vte 0.11.10 或更高版本、pygtk2 (EL4)