当前位置:Linux教程 - Linux资讯 - 在Linux 和FireWire上创建自己的RAC 集群

在Linux 和FireWire上创建自己的RAC 集群

了解如何安装和配置低于 1500 美元的 Oracle 真正应用集群(只用于开发和测试)

概述

熟悉 Oracle 真正应用集群 (RAC) 技术的最高效方法之一是进入实际的 Oracle RAC 集群。在学习这种新技术时,您会很快开始了解到 Oracle RAC 一定能提供的利益,如容错、新的安全级别、负载均衡以及升级功能的便利性。但是,挑战在于典型的产品级 RAC 配置所需硬件的价格。例如,小型的两节点集群可能成本从 $10,000 美元到超过 20,000 美元不等。该成本甚至不包括共享存储器 — 这是产品级 RAC 环境的核心。

对于那些只是希望熟悉 Oracle RAC 的人来说,本文提供了一种低成本的变通方法,使用商品级的现成组件和可下载的软件来配置 Oracle9 i RAC 系统。这种配置的估计成本可能是 1000 美元到 1500 美元。系统包含一个双节点集群,两个节点利用基于 IEEE1394 ( FireWire ) 驱动器技术的共享磁盘阵列,运行 Linux (在本示例中为 Red Hat Linux Fedora Core 1 )。

请注意,这并不是创建低成本 Oracle9 i RAC 系统的唯一方法。我曾见过其他的解决方案,这些解决方案利用了基于 SCSI 的实施而不是基于共享存储器的 FireWire 。在大多数情况下, SCSI 比我们的 FireWire 解决方案的成本高,因为典型 SCSI 卡的价格在 70 美元左右,而 80GB 的外部 SCSI 驱动器将需要 700 到 1000 美元。切记有些主板可能已经包含了内建的 SCSI 控制器。

注意,这种配置 决不 能在生产环境中运行,这很重要。在生产环境中,应选择光纤通道技术,因为它是高速串行传输接口,能够在点到点或交换式拓扑结构中连接系统与存储设备。 FireWire is able to offer a low-cost alternative to fiber channel for testing and development, but it is not ready for prodUCtion.

注意 :在撰写本文时,我尚未验证这些说明是否适用于 Oracle 数据库 10 g 。在以后的几个月时间内,我将撰写另外一篇文章,说明如何使用 10 g 执行类似的安装。

Oracle9 i 真正应用集群 (RAC) 简介

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

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

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

虽然这不是绝对必要的,但 Oracle 建议您安装 Oracle 集群文件系统 (OCFS) 。 OCFS 通过在所有节点上创建相同的文件系统,使您的磁盘管理工作变得容易得多。 x 这并非是必需的,但是如果没有 OCFS ,您必须手动完成所有的分区。 ( 注意: 本文没有详细介绍安装和使用 OCFS 的情况,而是使用所有手动方法来创建分区并将 原始设备 绑定到这些分区。)

我不使用针对 Red Hat Linuxe 的 Oracle 集群文件系统的主要原因之一是 OCFS 是 RPM 形式的。所有的 RPM 模块以及预编译模块都绑定到 Red Hat Enterprise Linux AS ( 1200 美元)内核命名标准,并且不会加载到所提供的 2.4.20 链接内核中。

Oracle RAC 与 OPS 之间的最大区别在于增加了高速缓存合并。使用 OPS 时,从一个节点到另一个节点的数据请求需要首先将数据写到磁盘,然后请求节点才能读取该数据。使用高速缓存合并时,数据与锁一起被传递。

Dell 、 IBM 和 HP 等厂商提供了预先配置的 Oracle9 i RAC 解决方案,用于生产环境。但是,本文集中讨论将您自己的 Oracle9 i RAC 环境组合在一起用于开发和测试,其方法是使用 Linux 服务器和一种低成本的共享磁盘解决方案: FireWire 。

RAC 需要什么软件?它有没有需要定购的单独安装 CD

RAC 包含在 Oracle9 i 数据库企业版中。( Oracle 最近宣布在 Oracle 数据库 10 g 标准版中也提供 RAC 。)如果您在一个集群中安装 Oracle9 i 企业版,并且 Oracle Universal Installer (OUI) 识别该集群,则为您提供安装 RAC 的选项。大部分 UNIX 平台需要为必要的集群件安装 OSD 。对于 Intel 平台( Linux 和 Windows ), Oracle 在 Oracle9 i 企业版中提供 OSD 软件。

共享存储器概述

现在,光纤通道是最流行的共享存储器解决方案之一。前面曾提到,光纤通道是一种高速串行传输接口,用于在点到点或交换式拓扑结构中连接系统与存储设备。光纤通道所支持的协议包括 SCSI 和 IP 。光纤通道配置可以支持多达 127 个节点,其每秒的吞吐量可以高达 2.12 千兆位。但是,光纤通道的价格很昂贵。单是光纤通道交换机就可能需要 1000 美元。这还不包括光纤通道存储阵列和高端驱动器,一个 36GB 驱动器的价格可高达约 300 美元。典型的光纤通道安装包括用于服务器的光纤通道卡,基本安装大约要 5000 美元,这并不包括构成集群的服务器的成本。

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

另一种流行的解决方案是 Sun NFS (网络文件系统)。只有在您使用网络设备或类似的设备时,它才可以用于共享存储器。需要特别指出的是,您需要能够保证通过 NFS 进行直接 I/O 的服务器。

FireWire 技术

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

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

磁盘接口

速度

串行

115 kb/s - (.115 Mb/s)

并行(标准)

115 KB/s - (.115 MB/s)

USB 1.1

12 Mb/s - (1.5 MB/s)

并行 (ECP/EPP)

3.0 MB/s

IDE

3.3 - 16.7 MB/s

ATA

3.3 - 66.6 MB/sec

SCSI-1

5 MB/s

SCSI-2 (快速 SCSI / 快速窄带 SCSI )

10 MB/s

快速宽带 SCSI (宽带 SCSI )

20 MB/s

Ultra SCSI ( SCSI-3 / Fast-20 / Ultra 窄带)

20 MB/s

Ultra IDE

33 MB/s

宽带 Ultra SCSI (快速宽带 20 )

40 MB/s

Ultra2 SCSI

40 MB/s

IEEE1394(b)

100 - 400Mb/s - (12.5 - 50 MB/s)

USB 2.x

480 Mb/s - (60 MB/s)

宽带 Ultra2 SCSI

80 MB/s

Ultra3 SCSI

80 MB/s

宽带 Ultra3 SCSI

160 MB/s

FC-AL 光纤通道

100 - 400 MB/s

硬件及成本

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

服务器 1 (linux1)

Dell Dimension XPS D266 计算机 —266MHz Pentium II —384MB RAM —60GB 内置硬盘 —CDROM 和软盘驱动器

$400

2— 以太网 LAN 卡 — Linksys 10/100 Mpbs — (连接公共网络) — Linksys 10/100 Mpbs — (用于与 linux2 互联)

$20 $20

1—FireWire 卡 — SIIG, Inc. 3 端口 1394 I/O 卡

    

注意:已知那些具有由 VIA 或 TI 所制造芯片集的接口卡可以有效工作。

$30

服务器 2 (linux2)

Pentium IV 计算机 —1.8GHz Pentium IV —300W 电源 —512MB RAM —40GB 内置硬盘 —32MB AGP 视频显示卡 —CDROM 和软盘驱动器

$600

2— 以太网 LAN 卡 — Linksys 10/100 Mpbs — (连接公共网络) — Linksys 10/100 Mpbs — (用于与 linux1 互联)

$20 $20

1—FireWire 卡 — Belkin FireWire 3 端口 1394 PCI 卡

    

注意:已知那些具有由 VIA 或 TI 所制造芯片集的接口卡可以有效工作。

$40

其他组件

FireWire 硬盘驱动器 — Maxtor One Touch 200GB USB 2.0 / Firewire 外部硬盘驱动器

请确保您购买的 FireWire 驱动器支持多次登录。如果驱动器的芯片集不允许对超过一个服务器进行并发访问,则每次只有一台服务器能够看到该磁盘及其分区。已知具有 Oxford 911 芯片集的磁盘可以有效工作。以下是我为本测试所购买的磁盘的详细信息: 供应商: Maxtor 型号: OneTouch Mfg. 部件号或 KIT 号: A 01A 200 或 A 01A 250 容量: 200GB 或 250GB 高速缓存缓冲区: 8MB 转速: 7200 RPM “ 组合 ” 接口:符合 IEEE 1394 和 SPB-2 标准( 100 到 400 Mbits/sec )并兼容 USB 2.0 和 USB 1.1

$270

1 — 额外的 FireWire 电缆 — Belkin 6 针到 6 针的 1394 电缆

$15

1 — 以太网集线器或交换机 — Linksys EtherFast 10/100 5 端口以太网交换机 (用于与 int-linux1 / int-linux2 互联)

$40

4— 网络电缆 — 5e 类连接线 — (连接 linux1 与公共网络) — 5e 类连接线 — (连接 linux2 与公共网络) — 5e 类连接线 — (连接 linux1 与互联以太网交换机) — 5e 类连接线 — (连接 linux2 与互联以太网交换机)

$5 $5 $5 $5

合计

$1,495  

 

简短的过程说明

在对创建 Oracle9 i RAC 系统进行详细说明之前,我认为对创建环境所涉及的步骤进行简短的过程说明会很有益。(参见图 1 。)

我们的实施方案描述了一个双节点集群(每个节点具有单处理器),每台服务器都运行 Red Hat Linux Fedora Core 1 。注意,本文档中的大部分任务都需要在两台服务器上执行。我将在每个部分的开始处提示是否在两个节点上都要执行该任务。

1. 安装 Red Hat Linux / Fedora Core 1 (在两个节点上执行) 对于本示例配置,您将要在构成 RAC 集群的两个节点上都安装 Red Hat Linux (Fedora Core 1) 。

2. 配置网络设置(在两个节点上执行) 在两个节点上安装 Red Hat Linux 软件后,您需要在两个节点上配置网络。这包括配置公共网络以及配置集群的互联。您还应该为互联调整默认的和最大发送缓冲区大小设置,以便当您在实例间使用高速缓存合并缓冲区传输时获得更好的性能。这些设置将会写入到您的 /etc/sysctl.conf 文件中。

3. 获取和安装适当的 Linux 内核(在两个节点上执行) 在本部分中,我们将下载和安装一个新的 Linux 内核 — 它支持对 Fire Wire 存储设备的多次登录。该内核可以从 Oracle 的 Linux 项目开发组 — http://oss.oracle.com 处下载。在安装新内核以后,有几个配置步骤用于加载 FireWire 堆栈。

4. 创建 UNIX oracle 用户帐号( dba 组)(在两个节点上执行) 然后我们将在 RAC 集群的所有节点上创建一个 Oracle UNIX 用户 id 。本部分还提供一个示例登录脚本 ( .bash_profile ) ,可用于设置 oracle 用户需要的所有环境变量。

5. 在共享的 FireWire 存储设备上创建分区(只需从单个节点运行一次) 在本步骤中,我们使用逻辑卷管理器 (LVM) 创建物理卷和逻辑卷。我将说明如何从 FireWire 驱动器上删除所有分区并使用 LVM 创建所有逻辑分区。

6. 创建 RAW 绑定(在两个节点上执行) 在创建逻辑分区后,我们需要配置 FireWire 共享存储器上的原始设备,以便将其用于所有的物理 Oracle 数据库文件。

7. 创建来自 RAW 卷的符号链接(在两个节点上执行)将来自 RAW 卷的符号链接创建为易读的名称是很有益的,以便更易于识别文件。虽然此步骤是可选项,但强烈建议执行该步骤。

8. 配置 Linux 服务器(在两个节点上执行) 本部分将详细介绍配置两台 Linux 机器所涉及的步骤,将它们准备好,以便安装 Oracle9 i RAC 。

9. 配置 hangcheck-timer 内核模块(在两个节点上执行) Oracle9 i RAC 使用一个称为 hangcheck-timer 的模块来监视集群的运行情况,并在出现故障时重新启动 RAC 模式。本部分说明了配置 hangcheck-timer 内核模块所需的步骤。虽然 hangcheck-timer 模块不是 Oracle Cluster Manager 操作所必须的模块,但 Oracle 强烈建议使用此模块。

10. 为远程访问配置 RAC 节点(在两个节点上执行) 在安装 Oracle9 i RAC 时, Oracle Installer 将使用 rsh 命令,把 Oracle 软件复制到 RAC 集群中的所有其他节点。本部分所包括的说明用于配置您的 RAC 集群中的所有节点,以便在一个 RAC 节点上不需要口令而根据其他 RAC 节点来运行 r* 命令,如 rsh 、 rcp 和 rlogin 。

11. 配置机器启动脚本(在两个节点上执行) 到此为止,我们已经非常详细地讨论了在我们的 Oracle9 i RAC 配置的两个节点上需要配置的参数和资源。本部分将暂作休整并扼要重述那些参数和命令(在本文前面的章节中),它们在机器循环运行时需要在每个节点上执行。虽然有好几种方法可以完成此工作,但我只是提供了一个可以放在启动脚本(即 /etc/rc.local )中的命令清单,在每次机器启动时,这些命令建立所有所需的资源(磁盘、内存等)。本部分还包含其他的启动脚本,以便检查当集群中每台机器启动时,您是否已经更新了所有所需的脚本。

12. 更新 Red Hat Linux 系统(在两个节点上执行) 在准备 Oracle 安装时,需要将几个 RPM 应用到 RAC 集群中的所有节点。所有的 RPM 都包含在 Fedora Core 1 的 CD 中,此外我还在本文中提供了与这些文件的链接。在应用了所有的 RPM 之后,您还需要应用 Oracle/Linux 补丁 3006854 。在应用了所有所需补丁之后,您应该重新启动 RAC 集群中的所有节点。

13. 下载 / 解开 Oracle9 i 安装文件(从单个节点执行) 本部分包括了下载和解开 Oracle9 i 软件发布版本的步骤。该软件可以从 http://otn.oracle.com/global/cn/ 下载。

14. 安装 Oracle9 i Cluster Manager (从单个节点执行) 安装 Oracle9 i RAC 的过程分为两步: (1) 安装 Oracle9 i Cluster Manager 以及 (2) 安装 Oracle9 i RDBMS 软件。在本部分中,我们将逐步说明安装、配置和启动 Oracle Cluster Manager 软件的步骤。

切记, Oracle Cluster Manager 的安装只需在某一个节点上执行(安装过程将利用 rsh 命令将文件复制到集群中所包含的所有其他节点),但 Cluster Manager 的配置和启动需要在两个节点上执行。

15. 安装 Oracle9 i RAC (只需从单个节点执行) 在安装 Oracle Cluster Manager 之后,就该安装 RAC 软件了。本部分提供了安装该软件所涉及的很多任务,并提供了在创建 Oracle 集群数据库之前应该执行的很多安装后续任务。

16. 创建 Oracle 数据库(从单个节点执行) 在安装了所有软件后,我们现在将要使用 Oracle 数据库配置助手 (DBCA) 在共享存储器 (FireWire) 设备上创建我们的集群数据库。

17. 创建 TNS 联网文件(在两个节点上执行) 本部分仅仅提供了我的 listener.ora 和 tnsnames.ora 文件的示例清单。需要为 RAC 集群中的每个节点配置这些文件。 Oracle Installer 和 Oracle 数据库配置助手在保持这些文件的更新方面做得很好。但是,我确实喜欢对 tnsnames.ora 文件做一些修改。

18. 验证 RAC 集群 / 数据库配置(在两个节点上执行) 在 Oracle 数据库配置助手完成了集群数据库的创建之后,您应该拥有了正在运行的全功能 Oracle9 i RAC 集群。本部分提供了一些命令 SQL 查询,可用于验证您的 Oracle9 i RAC 配置。

19. 启动和停止集群(从单个节点执行) 本部分将提供如何启动和停止集群的示例。这包括如何完整地启动或停止整个集群,以及如何启动和关闭集群中单个实例的示例。

20. 透明应用程序故障切换 (TAF) (在一个或两个节点上执行) 既然我们已经启动并运行了集群,本部分提供了一个如何测试 Oracle9 i RAC 的透明应用程序故障切换特性的示例。我将演示会话故障如何发生作用以及如何设置您的 TNS 配置,以便利用 TAF 。

安装 Red Hat Linux (Fedora Core 1)

在获得所需的硬件之后,就可以开始配置过程了。过程的第一步是在两台服务器上都安装 Red Hat Linux Fedora Core 1 软件。

注意: 本文没有提供关于安装 Red Hat Linux Fedora Core 1 的详细说明。根据本文的目的,我选择执行自定义安装,当提示安装哪些产品时,选择 “Install Everything” 。安装 Red Hat Linux 的文档可见于 http://www.redhat.com/docs/manuals/ 。

 

配置网络设置

配置公共网络和专用网络 让我们通过确认正确的网络配置,开始配置我们的 Oracle RAC Linux 。在我们的两节点示例中,我们需要在两个节点上配置网络。

在 RedHat Linux 中配置网络设置的最简单方法是通过网络配置程序。此应用程序可以从命令行利用 “root” 用户 id 启动,如下所示:

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

注意: 不要使用 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

192.168.1.100 linux1

192.168.2.100 int-linux1

192.168.1.101 linux2

192.168.2.101 int-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

192.168.1.100 linux1

192.168.2.100 int-linux1

192.168.1.101 linux2

192.168.2.101 int-linux2

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

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

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

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

图 4:Network Configuration 屏幕,/etc/hosts (linux1)

 

调整网络设置 在 Oracle 9.2.0 .1 以及更高的版本中, Oracle 在 Linux 上使用 UDP 作为默认协议进行过程间通信 (IPC) ,如在 RAC 集群中的实例间进行 高速缓存合并 缓冲区传输。

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

接收缓冲区由 TCP 和 UDP 用于保留所接收的数据,直到应用程序读出这些数据为止。接收缓冲区不能溢出,因为不允许对等端发送超过缓冲区大小窗口的数据。这意味着如果数据包不适合于套接字接收缓冲区,它们将会被废弃。这种情况可能导致发送方发送量远远超过接收方的接收能力。

注意: 可以不必重新启动而在 /proc 文件系统中更改默认的和最大的窗口大小:

su - root  

# Default setting in bytes of the socket receive buffer

sysctl -w net.core.rmem_default=262144  

# Default setting in bytes of the socket send buffer

sysctl -w net.core.wmem_default=262144  

# Maximum socket receive buffer size which may be set by using

# the SO_RCVBUF socket option

sysctl -w net.core.rmem_max=262144  

# Maximum socket send buffer size which may be set by using

# the SO_SNDBUF socket option

sysctl -w net.core.wmem_max=262144

您应该通过将以下各行添加到 RAC 集群中每个节点的 /etc/sysctl.conf 文件中,使以上的更改永久有效:

net.core.rmem_default=262144

net.core.wmem_default=262144

net.core.rmem_max=262144

net.core.wmem_max=262144

在 Linux 和 FireWire 上创建自己的 RAC 集群(续)

获取并安装合适的 Linux 内核

概述 接下来的步骤是获取并安装新的 Linux 内核,该内核利用多次登录,支持使用 IEEE1394 设备。在本文先前的版本中,包含有关于下载 Linux 内核的一个补丁版本并对其进行编译的步骤。由于 Oracle 的 Linux 项目开发组 的工作,已经不再需要这些步骤了。他们提供了一个 Red Hat Enterprise Linux 3.0 的预编译内核(它也可以与 Fedora 协同工作),只需下载并安装即可。本部分包含了下载和安装该内核的说明。不过,在开始详细说明如何执行这些操作之前,让我们先用一些时间来讨论在新内核中需要进行的更改。

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

可能我过早地提到了这个问题,但我希望在深入说明新的 Linux 内核安装细节之前先讨论几个主题。当我们安装新的 Linux 内核(支持对 FireWire 驱动器的多次登录)时,系统将会检测 FireWire 相连的驱动器并将其识别为 SCSI 设备。您将能够使用标准的操作系统工具对磁盘进行分区、创建文件系统等。对于 Oracle9 i RAC ,您必须为所有文件建立分区,并将原始设备绑定到这些分区。本文将利用逻辑卷管理器 (LVM) 在 FireWire 共享驱动器上建立所有所需的分区(通常称为 逻辑分区 )。

我们的实施方法描述了一个双节点集群(每个节点具有一个单独的处理器),每个服务器都运行 Red Hat Linux Fedora Core 1 。切记,在 两个 Linux 节点上都需要安装打过补丁的 Linux 内核。 Red Hat Linux Fedora Core 1 包含内核 linux- 2.4.22 -1.2115.nptl ;我们需要从以下 URL 处下载 Oracle 提供的 2.4.21-9.0.1 Linux 内核: http://oss.oracle.com/projects/firewire/files 。

在集群的两个节点上执行以下过程:

•  下载以下的文件之一:

kernel- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于单处理器 — 或者 —

kernel-smp- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于多处理器

•  备份您的 GRUB 配置文件:

在大多数情况下,您要将 GRUB 用于引导加载器。在实际安装新内核之前,请确保备份您的 /etc/grub.conf 文件的一个拷贝:

# cp /etc/grub.conf /etc/grub.conf.original

•  以用户 root 安装新内核:

# rpm -ivh --force kernel- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于单处理器

— 或者 —

# rpm -ivh --force kernel-smp- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于多处理器

注意: 使用 RPM 来安装新内核还会利用合适的片段来更新您的 grub 或 lilo 配置。除非您希望保留旧的内核镜像,否则不需要向您的引导加载器配置中添加任何新的片段。

以下是我的 /etc/grub.conf 文件在内核安装之前和之后的清单。您可以看到,在我的安装中,我在 2.4.21 -9.0.1.ELorafw1 内核中加入了另一个片段。如果您愿意,可以更改新文件中的( default )项,这样新内核将成为启动的默认内核。在默认情况下,安装程序设置 default=1 ,继续将旧内核作为默认内核。

Fedora Core 1 的原始 /etc/grub.conf 文件

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:You have a /boot partition.This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/hda3

# initrd /initrd-version.img

#boot=/dev/hda

default=0

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Fedora Core ( 2.4.22 -1.2115.nptl)

root (hd0,0)

kernel /vmlinuz- 2.4.22 -1.2115.nptl ro root=LABEL=/ rhgb

initrd /initrd- 2.4.22 -1.2115.nptl.img

在安装内核后, Fedora Core 1 的新配置的 /etc/grub.conf 文件

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:You have a /boot partition.This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/hda3

# initrd /initrd-version.img

#boot=/dev/hda

default=0

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Fedora Core ( 2.4.21 -9.0.1.ELorafw1)

root (hd0,0)

kernel /vmlinuz- 2.4.21 -9.0.1.ELorafw1 ro root=LABEL=/ rhgb

initrd /initrd- 2.4.21 -9.0.1.ELorafw1.img

title Fedora Core ( 2.4.22 -1.2115.nptl)

root (hd0,0)

kernel /vmlinuz- 2.4.22 -1.2115.nptl ro root=LABEL=/ rhgb

initrd /initrd- 2.4.22 -1.2115.nptl.img

•  添加模块选项:

将以下各行添加到 /etc/modules.conf 中:

options sbp2 sbp2_exclusive_login=0

post-install sbp2 insmod sd_mod

post-remove sbp2 rmmod sd_mod

将串行总线协议模块 ( sbp2 ) 的参数 sbp2_exclusive_login 设置为零是非常重要的,以便允许多个主机并发地登录和访问 FireWire 磁盘。第二行确保 SCSI 磁盘驱动程序模块 ( sd_mod ) 也会被加载,因为 ( sbp2 ) 需要 SCSI 层。如果 ( sd_mod ) 加载,则会自动加载核心的 SCSI 支持模块 ( scsi_mod ) — 不必为它创建单独的项。

•  重新启动机器

重新启动您的机器,进入新的内核。请确保 firewire (ieee1394) pci 卡已插入到机器中!

•  加载 firewire 堆栈

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

# modprobe ohci1394

# modprobe sbp2

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

•  重新扫描 SCSI 总线

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

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

使用 Fedora Core 1 时,应该可以自动检测到磁盘。

•  检查 SCSI 设备

重新启动机器后,内核应该自动将磁盘检测为 SCSI 设备 ( /dev/sdXX ) 。本部分提供了几个命令,这些命令应该在集群的两个节点上运行,以确保成功地检测到 FireWire 驱动器。

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

 

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

# lspci

00:00.0 Host bridge:Intel Corp. 82845 845 (Brookdale) Chipset Host Bridge (rev 11)

00:01.0 PCI bridge:Intel Corp. 82845 845 (Brookdale) Chipset AGP Bridge (rev 11)

00:1d.0 USB Controller:Intel Corp. 82801DB USB (Hub #1) (rev 01)

00:1d.1 USB Controller:Intel Corp. 82801DB USB (Hub #2) (rev 01)

00:1d.2 USB Controller:Intel Corp. 82801DB USB (Hub #3) (rev 01)

00:1d.7 USB Controller:Intel Corp. 82801DB USB2 (rev 01)

00:1e.0 PCI bridge:Intel Corp. 82801BA/CA/DB/EB PCI Bridge (rev 81)

00: 1f .0 ISA bridge:Intel Corp. 82801DB LPC Interface Controller (rev 01)

00: 1f .1 IDE interface:Intel Corp. 82801DB Ultra ATA Storage Controller (rev 01)

00: 1f .3 SMBus:Intel Corp. 82801DB/DBM SMBus Controller (rev 01)

01:00.0 VGA compatible controller:nVidia Corporation NV34 [GeForce FX 5200] (rev a1)

02:00.0 Ethernet controller:Linksys Network Everywhere Fast Ethernet 10/100 model NC100 (rev 11)

02:01.0 FireWire (IEEE 1394): Texas Instruments TSB12LV26 IEEE-1394 Controller (Link)

02:05.0 Ethernet controller:Realtek Semiconductor Co., Ltd. RTL-8139/ 8139C / 8139C + (rev 10)

02:07.0 Multimedia audio controller:C-Media Electronics Inc CM8738 (rev 10)

第二步,查看这些模块是否已被加载:

# lsmod egrep "ohci1394sbp2ieee1394sd_modscsi_mod"

sd_mod 13808 0

sbp2 20556 0

scsi_mod 109864 3 [sg sd_mod sbp2]

ohci1394 28904 0 (unused)

ieee1394 63652 0 [sbp2 ohci1394]

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

# cat /proc/scsi/scsi

Attached devices:

Host:scsi0 Channel:00 Id:00 Lun: 00

Vendor:Maxtor Model:OneTouch Rev: 0200

Type:Direct-Access

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

# dmesg grep sbp2

ieee1394:sbp2:Query logins to SBP-2 device successful

ieee1394:sbp2:Maximum concurrent logins supported: 3

ieee1394:sbp2:Number of active logins: 2

ieee1394:sbp2:Logged into SBP-2 device

ieee1394:sbp2:Node[01:1023]:Max speed [S400] - Max payload [2048]

ieee1394:sbp2:Reconnected to SBP-2 device

ieee1394:sbp2:Node[01:1023]:Max speed [S400] - Max payload [2048]

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

•  对 SCSI 设备检测的故障诊断

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

# modprobe -r sbp2

# modprobe -r sd_mod

# modprobe -r ohci1394

# modprobe ohci1394

# modprobe sd_mod

# modprobe sbp2

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

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

# mkdir /u01

# mkdir /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

注意: 当您为每个 RAC 节点设置 Oracle 环境变量时,请确保为每个 RAC 节点分配唯一的 Oracle SID !

对于此示例,我使用:

linux1 : ORACLE_SID=orcl1 linux2 : ORACLE_SID=orcl2

注意: Oracle Universal Installer (OUI) 在 /tmp 目录中需要最多 400MB 空闲空间。

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

# df -k /tmp

Filesystem 1K-blocks Used Available Use% Mounted on

/dev/hda3 36384656 6224240 28312140 19% /

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

# su -

# mkdir /<AnotherFilesystem>/tmp

# chown root.root /<AnotherFilesystem>/tmp

# chmod 1777 /<AnotherFilesystem>/tmp

# export TEMP=/<AnotherFilesystem>/tmp # used by Oracle

# export TMPDIR=/<AnotherFilesystem>/tmp # used by Linux programs

# like the linker "ld"

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

# su -

# rmdir /<AnotherFilesystem>/tmp

# unset TEMP

# unset TMPDIR

在两个节点上都创建了 “ 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/ 9.2.0

# 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 ORACLE_TERM=xterm

export TNS_ADMIN=$ORACLE_HOME/network/admin

export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/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

export LD_ASSUME_KERNEL= 2.4.1

在共享的 FireWire 存储设备上创建分区(在一个节点上执行)

概述

现在应该创建由逻辑卷管理器 (LVM) 所使用的物理卷和逻辑卷了。(有关管理 LVM 的更详细观点,请参见我的文章 管理物理卷和逻辑卷 。) 下表列出了逻辑分区到表空间的映射,我们将在本文的这一部分中完成这些映射:

逻辑卷

RAW 卷

符号链接

表空间 / 文件名

表空间 / 文件大小

分区大小

/dev/pv1/lvol1

/dev/raw/raw1

/u01/app/oracle/oradata/orcl/CMQuorumFile

Cluster Manager Quorum File

-

5MB

/dev/pv1/lvol2

/dev/raw/raw2

/u01/app/oracle/oradata/orcl/SharedSrvctlConfigFile

Shared Configuration File

-

100MB

/dev/pv1/lvol3

/dev/raw/raw3

/u01/app/oracle/oradata/orcl/spfileorcl.ora

Server Parameter File

-

10MB

/dev/pv1/lvol4

/dev/raw/raw4

/u01/app/oracle/oradata/orcl/control01.ctl

Control File 1

-

200MB

/dev/pv1/lvol5

/dev/raw/raw5

/u01/app/oracle/oradata/orcl/control02.ctl

Control File 2

-

200MB

/dev/pv1/lvol6

/dev/raw/raw6

/u01/app/oracle/oradata/orcl/control03.ctl

Control File 3

-

200MB

/dev/pv1/lvol7

/dev/raw/raw7

/u01/app/oracle/oradata/orcl/cwmlite01.dbf

CWMLITE

50MB

55MB

/dev/pv1/lvol8

/dev/raw/raw8

/u01/app/oracle/oradata/orcl/drsys01.dbf

DRSYS

20MB

25MB

/dev/pv1/lvol9

/dev/raw/raw9

/u01/app/oracle/oradata/orcl/example01.dbf

EXAMPLE

250MB

255MB

/dev/pv1/lvol10

/dev/raw/raw10

/u01/app/oracle/oradata/orcl/indx01.dbf

INDX

100MB

105MB

/dev/pv1/lvol11

/dev/raw/raw11

/u01/app/oracle/oradata/orcl/odm01.dbf

ODM

50MB

55MB

/dev/pv1/lvol12

/dev/raw/raw12

/u01/app/oracle/oradata/orcl/system01.dbf

SYSTEM

800MB

805MB

/dev/pv1/lvol13

/dev/raw/raw13

/u01/app/oracle/oradata/orcl/temp01.dbf

TEMP

250MB

255MB

/dev/pv1/lvol14

/dev/raw/raw14

/u01/app/oracle/oradata/orcl/tools01.dbf

TOOLS

100MB

105MB

/dev/pv1/lvol15

/dev/raw/raw15

/u01/app/oracle/oradata/orcl/undotbs01.dbf

UNDOTBS1

400MB

405MB

/dev/pv1/lvol16

/dev/raw/raw16

/u01/app/oracle/oradata/orcl/undotbs02.dbf

UNDOTBS2

400MB

405MB

/dev/pv1/lvol17

/dev/raw/raw17

/u01/app/oracle/oradata/orcl/users01.dbf

USERS

100MB

105MB

/dev/pv1/lvol18

/dev/raw/raw18

/u01/app/oracle/oradata/orcl/xdb01.dbf

XDB

150MB

155MB

/dev/pv1/lvol19

/dev/raw/raw19

/u01/app/oracle/oradata/orcl/perfstat01.dbf

PERFSTAT

100MB

105MB

/dev/pv1/lvol20

/dev/raw/raw20

/u01/app/oracle/oradata/orcl/redo01.log

REDO G1 / M1

100MB

105MB

/dev/pv1/lvol21

/dev/raw/raw21

/u01/app/oracle/oradata/orcl/redo02.log

REDO G2 / M1

100MB

105MB

/dev/pv1/lvol22

/dev/raw/raw22

/u01/app/oracle/oradata/orcl/redo03.log

REDO G3 / M1

100MB

105MB

/dev/pv1/lvol23

/dev/raw/raw23

/u01/app/oracle/oradata/orcl/orcl_redo2_2.log

REDO G4 / M1

100MB

105MB

 

 

删除 FireWire 共享存储器上的所有分区

在本示例中,我将使用整个 FireWire 磁盘(没有分区)。在这种情况下,我将使用 /dev/sda 来创建逻辑卷 / 物理卷。这并不是完成创建 LVM 环境任务的唯一方法。我们还可以在磁盘上创建 Linux LVM 分区(其类型为 8e )。让我们假设该 LVM 分区是在磁盘上创建的第一个分区。这样我们需要利用 /dev/sda1 来工作。同样,在本示例中,我将使用整个 FireWire 驱动器(没有分区) , 因此要访问 /dev/sda 。在创建物理卷和逻辑卷之前,通过使用 fdisk 命令删除 FireWire 驱动器上的任何现有分区,这是很重要的(因为我们要使用整个磁盘):

# fdisk /dev/sda

Command (m for help):p

Disk /dev/sda:203.9 GB, 203927060480 bytes

255 heads, 63 sectors/track, 24792 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

/dev/sda1 1 24791 199133676 c Win95 FAT32 (LBA)

Command (m for help):d

Selected partition 1

Command (m for help):p

Disk /dev/sda:203.9 GB, 203927060480 bytes

255 heads, 63 sectors/track, 24792 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System

Command (m for help):w

The partition table has been altered!

Calling ioctl() to re-read partition table.

Syncing disks.

创建逻辑卷

以下的一组命令执行创建逻辑卷所需的步骤:

•  运行 vgscan 命令( 在集群中所有的 RAC 节点上运行 ),以创建 /etc/lvmtab 文件。

•  使用 pvcreate 创建由逻辑卷管理器 (LVM) 所使用的物理卷。

•  使用 vgcreate ,为驱动器或者为您希望用于 RAW 设备的分区创建一个卷组。在这里我们为整个驱动器创建卷。在我们的示例中(如下所示),该命令将允许创建 256 个逻辑分区和 256 个物理分区,范围大小为 128K 。

•  使用 lvcreate 在卷组中创建逻辑卷。

注意: 上文讲到,我需要在所有节点上运行 vgscan 命令,以便该命令能够创建 /etc/lvmtab 文件。应该在运行下列命令之前执行该命令。

将以下命令放在一个 schell 脚本中,更改执行权限,然后以 “root”UNIX 用户 id 来运行该脚本:

vgscan

pvcreate -d /dev/sda

vgcreate -l 256 -p 256 -s 128k /dev/pv1 /dev/sda

lvcreate -L 5m /dev/pv1

lvcreate -L 100m /dev/pv1

lvcreate -L 10m /dev/pv1

lvcreate -L 200m /dev/pv1

lvcreate -L 200m /dev/pv1

lvcreate -L 200m /dev/pv1

lvcreate -L 55m /dev/pv1

lvcreate -L 25m /dev/pv1

lvcreate -L 255m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 55m /dev/pv1

lvcreate -L 805m /dev/pv1

lvcreate -L 255m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 405m /dev/pv1

lvcreate -L 405m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 155m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 105m /dev/pv1

lvcreate -L 105m /dev/pv1

使用该脚本(如上所示)将会创建 /dev/pv1/lvol1 - /dev/pv1/lvol23 。

我通常使用 lvscan 命令来检查逻辑卷的状态:

[root@linux2 root]# lvscan

lvscan -- ACTIVE "/dev/pv1/lvol1" [5 MB]

lvscan -- ACTIVE "/dev/pv1/lvol2" [100 MB]

lvscan -- ACTIVE "/dev/pv1/lvol3" [10 MB]

lvscan -- ACTIVE "/dev/pv1/lvol4" [200 MB]

lvscan -- ACTIVE "/dev/pv1/lvol5" [200 MB]

lvscan -- ACTIVE "/dev/pv1/lvol6" [200 MB]

lvscan -- ACTIVE "/dev/pv1/lvol7" [55 MB]

lvscan -- ACTIVE "/dev/pv1/lvol8" [25 MB]

lvscan -- ACTIVE "/dev/pv1/lvol9" [255 MB]

lvscan -- ACTIVE "/dev/pv1/lvol10" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol11" [55 MB]

lvscan -- ACTIVE "/dev/pv1/lvol12" [805 MB]

lvscan -- ACTIVE "/dev/pv1/lvol13" [255 MB]

lvscan -- ACTIVE "/dev/pv1/lvol14" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol15" [405 MB]

lvscan -- ACTIVE "/dev/pv1/lvol16" [405 MB]

lvscan -- ACTIVE "/dev/pv1/lvol17" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol18" [155 MB]

lvscan -- ACTIVE "/dev/pv1/lvol19" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol20" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol21" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol22" [105 MB]

lvscan -- ACTIVE "/dev/pv1/lvol23" [105 MB]

lvscan -- 23 logical volumes with 3.88 GB total in 1 volume group

lvscan -- 23 active logical volumes

重新启动 RAC 集群中的所有节点

在完成分区的创建之后,建议您重新启动所有 RAC 节点上的内核,以确保所有的新分区被所有 RAC 节点上的内核所识别:

# su -

# reboot

重要声明: 切记,您需要在您的一个启动脚本中添加语句,先调用 vgscan ,然后调用 vgchange -a y ,以便您的 RAC 集群中的每台机器在启动时运行它们。这两个命令在激活所有的卷组之前为您提供一个实际的卷管理器数据库。本文将提供所有应该加入到您的 /etc/rc.local 脚本中的设置,以便对 Oracle9 i RAC 集群中的每个节点进行设定。

创建 RAW 绑定(在两个节点上执行)

注意: 在每次启动机器时 , 需要在集群中的每个节点上执行本部分中的一些命令。这些命令的详细信息以及关于将其加入启动脚本的说明都包含在 用于每个 RAC 节点的所有启动命令 一节中。

在本部分中,我将说明如何在 FireWire 共享存储器上配置原始设备,这些设备将用于所有的物理 Oracle 数据库文件,包括 srvctl 的 Cluster Manager Quorum File 和 Shared Configuration File 。

现在,我们已经在 FireWire 共享存储器上创建了所需的分区。我们现在需要使用 raw 命令将所有卷绑定到原始设备:

usr/bin/raw /dev/raw/raw1 /dev/pv1/lvol1

/usr/bin/raw /dev/raw/raw2 /dev/pv1/lvol2

/usr/bin/raw /dev/raw/raw3 /dev/pv1/lvol3

/usr/bin/raw /dev/raw/raw4 /dev/pv1/lvol4

/usr/bin/raw /dev/raw/raw5 /dev/pv1/lvol5

/usr/bin/raw /dev/raw/raw6 /dev/pv1/lvol6

/usr/bin/raw /dev/raw/raw7 /dev/pv1/lvol7

/usr/bin/raw /dev/raw/raw8 /dev/pv1/lvol8

/usr/bin/raw /dev/raw/raw9 /dev/pv1/lvol9

/usr/bin/raw /dev/raw/raw10 /dev/pv1/lvol10

/usr/bin/raw /dev/raw/raw11 /dev/pv1/lvol11

/usr/bin/raw /dev/raw/raw12 /dev/pv1/lvol12

/usr/bin/raw /dev/raw/raw13 /dev/pv1/lvol13

/usr/bin/raw /dev/raw/raw14 /dev/pv1/lvol14

/usr/bin/raw /dev/raw/raw15 /dev/pv1/lvol15

/usr/bin/raw /dev/raw/raw16 /dev/pv1/lvol16

/usr/bin/raw /dev/raw/raw17 /dev/pv1/lvol17

/usr/bin/raw /dev/raw/raw18 /dev/pv1/lvol18

/usr/bin/raw /dev/raw/raw19 /dev/pv1/lvol19

/usr/bin/raw /dev/raw/raw20 /dev/pv1/lvol20

/usr/bin/raw /dev/raw/raw21 /dev/pv1/lvol21

/usr/bin/raw /dev/raw/raw22 /dev/pv1/lvol22

/usr/bin/raw /dev/raw/raw23 /dev/pv1/lvol23

/bin/chmod 600 /dev/raw/raw1

/bin/chmod 600 /dev/raw/raw2

/bin/chmod 600 /dev/raw/raw3

/bin/chmod 600 /dev/raw/raw4

/bin/chmod 600 /dev/raw/raw5

/bin/chmod 600 /dev/raw/raw6

/bin/chmod 600 /dev/raw/raw7

/bin/chmod 600 /dev/raw/raw8

/bin/chmod 600 /dev/raw/raw9

/bin/chmod 600 /dev/raw/raw10

/bin/chmod 600 /dev/raw/raw11

/bin/chmod 600 /dev/raw/raw12

/bin/chmod 600 /dev/raw/raw13

/bin/chmod 600 /dev/raw/raw14

/bin/chmod 600 /dev/raw/raw15

/bin/chmod 600 /dev/raw/raw16

/bin/chmod 600 /dev/raw/raw17

/bin/chmod 600 /dev/raw/raw18

/bin/chmod 600 /dev/raw/raw19

/bin/chmod 600 /dev/raw/raw20

/bin/chmod 600 /dev/raw/raw21

/bin/chmod 600 /dev/raw/raw22

/bin/chmod 600 /dev/raw/raw23

/bin/chown oracle:dba /dev/raw/raw1

/bin/chown oracle:dba /dev/raw/raw2

/bin/chown oracle:dba /dev/raw/raw3

/bin/chown oracle:dba /dev/raw/raw4

/bin/chown oracle:dba /dev/raw/raw5

/bin/chown oracle:dba /dev/raw/raw6

/bin/chown oracle:dba /dev/raw/raw7

/bin/chown oracle:dba /dev/raw/raw8

/bin/chown oracle:dba /dev/raw/raw9

/bin/chown oracle:dba /dev/raw/raw10

/bin/chown oracle:dba /dev/raw/raw11

/bin/chown oracle:dba /dev/raw/raw12

/bin/chown oracle:dba /dev/raw/raw13

/bin/chown oracle:dba /dev/raw/raw14

/bin/chown oracle:dba /dev/raw/raw15

/bin/chown oracle:dba /dev/raw/raw16

/bin/chown oracle:dba /dev/raw/raw17

/bin/chown oracle:dba /dev/raw/raw18

/bin/chown oracle:dba /dev/raw/raw19

/bin/chown oracle:dba /dev/raw/raw20

/bin/chown oracle:dba /dev/raw/raw21

/bin/chown oracle:dba /dev/raw/raw22

/bin/chown oracle:dba /dev/raw/raw23

注意: 切记,需要在每次启动时为 RAC 集群中的每个节点执行以上的 绑定 步骤。它应该放在类似 /etc/rc.local 的启动脚本中。

您可以使用 raw 命令来验证原始绑定:

# raw -qa

/dev/raw/raw1:bound to major 58, minor 0

/dev/raw/raw2:bound to major 58, minor 1

/dev/raw/raw3:bound to major 58, minor 2

/dev/raw/raw4:bound to major 58, minor 3

/dev/raw/raw5:bound to major 58, minor 4

/dev/raw/raw6:bound to major 58, minor 5

/dev/raw/raw7:bound to major 58, minor 6

/dev/raw/raw8:bound to major 58, minor 7

/dev/raw/raw9:bound to major 58, minor 8

/dev/raw/raw10:bound to major 58, minor 9

/dev/raw/raw11:bound to major 58, minor 10

/dev/raw/raw12:bound to major 58, minor 11

/dev/raw/raw13:bound to major 58, minor 12

/dev/raw/raw14:bound to major 58, minor 13

/dev/raw/raw15:bound to major 58, minor 14

/dev/raw/raw16:bound to major 58, minor 15

/dev/raw/raw17:bound to major 58, minor 16

/dev/raw/raw18:bound to major 58, minor 17

/dev/raw/raw19:bound to major 58, minor 18

/dev/raw/raw20:bound to major 58, minor 19

/dev/raw/raw21:bound to major 58, minor 20

/dev/raw/raw22:bound to major 58, minor 21

/dev/raw/raw23:bound to major 58, minor 22

 

创建来自 RAW 卷的符号链接(在两个节点上执行)

注意: 在每次启动机器时 , 需要在集群中的每个节点上执行本部分中的一些命令。这些命令的详细信息以及关于将其加入启动脚本的说明都包含在 用于每个 RAC 节点的所有启动命令 。

我通常将来自 RAW 卷的符号链接创建为人们易于理解的名称,以便更易于识别文件。如果您决定不使用符号链接,则在创建 / 维护表空间时,您需要为您所定义的 Oracle 文件使用 /dev/pv1/lvol X 标识。对于某些人来说,处理含义隐晦的标识(如 /dev/pv1/lvol21 )实在过于麻烦了 — ,而 使用人们易于理解的名称则要简单得多。这些命令需要在每台 Linux 服务器上执行一次。我通常将它们包含在 /etc/rc.local 启动脚本中。如果您添加了表空间,则应该将新的逻辑卷、 RAW 绑定及链接名称添加到所有节点的多个文件中。

mkdir /u01/app/oracle/oradata

mkdir /u01/app/oracle/oradata/orcl

ln -s /dev/raw/raw1 /u01/app/oracle/oradata/orcl/CMQuorumFile

ln -s /dev/raw/raw2 /u01/app/oracle/oradata/orcl/SharedSrvctlConfigFile

ln -s /dev/raw/raw3 /u01/app/oracle/oradata/orcl/spfileorcl.ora

ln -s /dev/raw/raw4 /u01/app/oracle/oradata/orcl/control01.ctl

ln -s /dev/raw/raw5 /u01/app/oracle/oradata/orcl/control02.ctl

ln -s /dev/raw/raw6 /u01/app/oracle/oradata/orcl/control03.ctl

ln -s /dev/raw/raw7 /u01/app/oracle/oradata/orcl/cwmlite01.dbf

ln -s /dev/raw/raw8 /u01/app/oracle/oradata/orcl/drsys01.dbf

ln -s /dev/raw/raw9 /u01/app/oracle/oradata/orcl/example01.dbf

ln -s /dev/raw/raw10 /u01/app/oracle/oradata/orcl/indx01.dbf

ln -s /dev/raw/raw11 /u01/app/oracle/oradata/orcl/odm01.dbf

ln -s /dev/raw/raw12 /u01/app/oracle/oradata/orcl/system01.dbf

ln -s /dev/raw/raw13 /u01/app/oracle/oradata/orcl/temp01.dbf

ln -s /dev/raw/raw14 /u01/app/oracle/oradata/orcl/tools01.dbf

ln -s /dev/raw/raw15 /u01/app/oracle/oradata/orcl/undotbs01.dbf

ln -s /dev/raw/raw16 /u01/app/oracle/oradata/orcl/undotbs02.dbf

ln -s /dev/raw/raw17 /u01/app/oracle/oradata/orcl/users01.dbf

ln -s /dev/raw/raw18 /u01/app/oracle/oradata/orcl/xdb01.dbf

ln -s /dev/raw/raw19 /u01/app/oracle/oradata/orcl/perfstat01.dbf

ln -s /dev/raw/raw20 /u01/app/oracle/oradata/orcl/redo01.log

ln -s /dev/raw/raw21 /u01/app/oracle/oradata/orcl/redo02.log

ln -s /dev/raw/raw22 /u01/app/oracle/oradata/orcl/redo03.log

ln -s /dev/raw/raw23 /u01/app/oracle/oradata/orcl/orcl_redo2_2.log

chown -R oracle:dba /u01/app/oracle/oradata

配置 Linux 服务器(在两个节点上执行)

注意: 在每次启动机器时 , 需要在集群中的每个节点上执行本部分中的一些命令。这些命令的详细信息以及关于将其加入启动脚本的说明都包含在 用于每个 RAC 节点的所有启动命令 。

本文的这一部分集中讨论了对两台 Linux 服务器的配置 — 使每台服务器都为 Oracle9 i RAC 的安装作好准备。

对交换空间的考虑因素

安装 Oracle9 i 需要最少 512MB 内存。 (在安装期间交换容量不足会导致 Oracle Universal Installer“ 挂起 ” 或 “ 死机 ” ) 要检查您已经分配的内存 / 交换容量,可以键入:

# free

— 或 —

# cat /proc/swaps

— 或 —

# cat /proc/meminfo grep MemTotal

如果您的内存少于 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 文件系统,你不需重新启动机器就可以改变 SHMMAX 的默认设置。我使用的方法是将以下命令放入 /etc/rc.local 启动文件中:

# >echo "2147483648" > /proc/sys/kernel/shmmax

您还可以使用 sysctl 命令来更改 SHMMAX 的值:

# sysctl -w kernel.shmmax=2147483648

最后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:

# echo "kernel.shmmax=2147483648" >> /etc/sysctl.con

设置 SHMMNI

我们现在来看 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改。

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

# cat /proc/sys/kernel/shmmni

4096

设置 SHMALL

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

ceil(SHMMAX/PAGE_SIZE)

SHMALL 的默认大小为 2097152 ,可以使用以下命令进行查询:

# cat /proc/sys/kernel/shmall

2097152

SHMALL 的默认设置对于我们的 Oracle9 i RAC 安装来说应该足够使用。

注意: 在 i386 平台上 Red Hat Linux 的 页面大小 为 4096 字节。但是,您可以使用 bigpages ,它支持配置更大的内存页面尺寸。

设置信号

既然我们已经配置了共享内存设置,现在就该考虑配置我们的 信号 了。对信号的最佳描述是,它是用于在共享资源(如共享内存)的进程(或进程中的线程)之间提供同步的计数器。在系统 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 文件系统,不必重新启动机器而更改所有信号设置的默认设置。我使用的方法是将以下命令放入 /etc/rc.local 启动文件中:

# echo "250 32000 100 128" > /proc/sys/kernel/sem

您还可以使用 sysctl 命令来更改所有信号设置的值:

# 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

32768

Oracle 建议将整个系统的文件句柄值至少设置为 65536 。

通过直接更改 /proc 文件系统,您可以不必重新启动机器而改变文件句柄最大数量的默认设置。我使用的方法是将以下命令置于 /etc/rc.local 启动文件中:

# echo "65536" > /proc/sys/fs/file-max

您还可以使用 sysctl 命令来更改 SHMMAX 的值:

# sysctl -w fs.file-max=65536

最后,您可以通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,使这种更改永久有效:

# echo "fs.file-max=65536" >> /etc/sysctl.conf

注意: 您可以使用以下命令来查询文件句柄的当前使用情况:

# cat /proc/sys/fs/file-nr

613 95 32768

file-nr 文件显示了三个参数:

分配的文件句柄总数 当前使用的文件句柄数 可以分配的最大文件句柄数

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

# ulimit

unlimited

配置 hangcheck-timer 内核模块

Oracle 9.0.1 和 9.2.0.1 使用一个称为 watchdogd 的用户空间监视后台程序来监视集群的状态情况,并在发生故障时重新启动 RAC 模式。但是,从 Oracle 9.2.0.2 开始,一个称为 hangcheck-timer 的 Linux 模块取代了此后台程序,该模块更好地解决了可用性和可靠性的问题。 hangcheck-timer 被加载到内核中并检查系统是否挂起。它将设置一个定时器,并在特定的时间量之后检查该定时器。有一个用于检查挂起情况的可配置阈值,如果超过该值机器将重新启动。虽然 Oracle Cluster Manager 的操作不需要 hangcheck-timer 模块,但 Oracle 高度建议使用它。

hangcheck-timer.o 模块

hangcheck-timer 模块使用了一个基于内核的定时器,该定时器周期性地检查系统任务调度程序,以捕获延迟,从而确定系统的健康情况。如果系统挂起或暂停,则定时器重启该节点。 hangcheck-timer 模块使用了时间标记计数器 (TSC) CPU 寄存器,这是一个在每次时钟信号时递增的计数器。 TCS 提供了更为精确的时间量度,因为该寄存器是由硬件自动更新的。

有关 hangcheck-timer 项目的详细信息,请单击 此处 。

安装 hangcheck-timer.o 模块

hangcheck-timer 通常与 Oracle 一同提供,但是,现在从内核版本 2.4.9 -e.12 起,该模块与 Red Hat Linux AS 包含在一起。如果您按照 “ 获取和安装合适的 Linux 内核 ” 中的步骤执行,则已经包含了 hangcheck-timer 。使用以下命令来确认您已经包含了该模块:

# find /lib/modules -name "hangcheck-timer.o"

/lib/modules/ 2.4.21 -9.0.1.ELorafw1/kernel/drivers/char/hangcheck-timer.o

配置和加载 hangcheck-timer 模块

对于 hangcheck-timer 模块有两个关键的参数。

hangcheck-tick :此参数定义了检查系统健康情况的间隔时段。其默认值为 60 秒。 Oracle 建议将其设置为 30 秒。 hangcheck-margin :此参数定义了 hangcheck-timer 在重启 RAC 节点前所容许的最大挂起延迟。它定义了以秒为单位的错误余量。其默认值为 180 秒。 Oracle 建议将其设置为 180 秒。

这两个参数需要与 Cluster Manager 的 $ORACLE_HOME/oracm/admin/cmcfg.ora 文件中的 MissCount 参数协同使用。

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

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

现在让我们来讨论如何加载该模块。您可以通过使用以下命令,利用正确的参数设置来手动地加载该模块:

# su -

# /sbin/insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

# grep Hangcheck /var/log/messages*

/var/log/messages.1:Apr 30 20:51:47 linux2 kernel:Hangcheck: starting hangcheck timer 0.8.0 (tick is 30 seconds, margin is 180 seconds).

/var/log/messages.1:Apr 30 20:51:47 linux2 kernel:Hangcheck:Using TSC.

将以上的 “ insmod ” 命令放在您的 /etc/rc.local 文件中!

虽然手动加载模块的方法(如上所示)可以有效工作,但我们需要一种在每次重新启动节点时利用正确参数来加载该模块的方法。我们通过在 /etc/modules.conf 文件中创建项目来完成此任务。将以下的行添加到 /etc/modules.conf 文件中:

# su -

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

现在,为测试模块,可使用 modprobe 命令。您可以运行 modprobe 命令,利用在 /etc/modules.conf 文件中定义的、经过配置的参数来手动加载 hangcheck-timer 模块:

# su -

# modprobe hangcheck-timer

# grep Hangcheck /var/log/messages*

/var/log/messages.1:Apr 30 20:51:47 linux2 kernel: Hangcheck:starting hangcheck timer 0.8.0 (tick is 30 seconds, margin is 180 seconds).

/var/log/messages.1:Apr 30 20:51:47 linux2 kernel: Hangcheck:Using TSC.

注意: 您不必在每次重新启动后都运行 modprobe 。 hangcheck-timer 模块将会在需要时由内核加载(自动进行)。

为远程访问配置 RAC 节点

当在一个 RAC 节点上运行 Oracle Installer 时,它将使用 rsh 命令把 Oracle 软件复制到 RAC 集群中的所有其他节点。在运行 Oracle Installer 的节点上的 oracle UNIX 帐号 ( runIntaller ) 必须为您 RAC 集群中的所有其他节点所信任。这意味着您应该能够在此 RAC 节点上不需要口令而根据其他 RAC 节点来运行 r* 命令,如 rsh 、 rcp 和 rlogin 等。 rsh 后台程序使用在用户 (oracle) 的主目录中所找到的 /etc/hosts.equiv 文件和 .rhosts 文件来验证用户。不幸的是,它不支持 SSH 。

首先,让我们确认已经在 RAC 集群中的每个节点上安装了 rsh RPM :

# rpm -q rsh rsh-server

rsh-0.17-19

rsh-server-0.17-19

根据以上情况,我们可以了解到已经安装了 rsh 和 rsh-server 。

注意: 如果没有安装 rsh ,则运行以下命令:

# su -

# rpm -ivh rsh-0.17-5.i386.rpm rsh-server-0.17-5.i386.rpm

要启动 “rsh” 服务,必须将 /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

请确保您的 RAC 集群中的所有节点上都存在 /etc/hosts.equiv 文件!

注意: 在以上示例中,第二个字段只允许 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

# cd /usr/kerberos/bin

# mv rsh rsh.original

# which rsh

/usr/bin/rsh

您现在应该测试您的连接并根据每个 RAC 来运行 rsh 命令。我使用节点 linux1 来执行安装。

# su - oracle

$ rsh int-linux1 ls -l /etc/hosts.equiv

-rw------- 1 root root 68 May 2 14:45 /etc/hosts.equiv

$ rsh int-linux2 ls -l /etc/hosts.equiv

-rw------- 1 root root 68 May 2 14:45 /etc/hosts.equiv

用于每个 RAC 节点的所有启动命令(用于两个节点)

到现在为止,我们已经详细讨论了在我们的 Oracle9 i RAC 配置中需要在两个节点上进行配置的参数和资源。在本部分中,我们将稍事调整,简要复述这些参数、命令和项目(在本文前面的章节中已出现),当启动机器时需要在每个节点上执行它们。

在本部分中,我提供了到目前为止我们已经讨论过的所有命令、参数和项目,它们需要被包括在 RAC 集群中每个 Linux 节点的所有启动脚本中。以下的每个启动文件中,对于那些为建立成功运行的 RAC 节点而应当在每个文件中包含的项目,都用粗体显示。

文件: /etc/modules.conf —

需要配置的所有内核参数和模块。

alias eth0 tulip

alias usb-controller usb-uhci

alias usb-controller1 ehci-hcd

alias ieee1394-controller ohci1394

alias sound-slot-0 cmpci

options sbp2 sbp2_exclusive_login=0

post-install sbp2 insmod sd_mod

post-remove sbp2 rmmod sd_mod

post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 :

pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 :

alias eth1 8139too

options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

文件: /etc/sysctl.conf

我们希望为互联而调整默认的和最大的发送缓冲区大小以及默认的和最大的接收缓冲区大小。

# 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

文件: /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

192.168.1.100 linux1

192.168.2.100 int-linux1

192.168.1.101 linux2

192.168.2.101 int-linux2

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/grub.conf

确定在启动节点时使用哪个内核。

# grub.conf generated by anaconda

#

# Note that you do not have to rerun grub after making changes to this file

# NOTICE:You have a /boot partition.This means that

# all kernel and initrd paths are relative to /boot/, eg.

# root (hd0,0)

# kernel /vmlinuz-version ro root=/dev/hda3

# initrd /initrd-version.img

#boot=/dev/hda

default=0

timeout=10

splashimage=(hd0,0)/grub/splash.xpm.gz

title Fedora Core ( 2.4.21 -9.0.1.ELorafw1)

root (hd0,0)

kernel /vmlinuz- 2.4.21 -9.0.1.ELorafw1 ro root=LABEL=/ rhgb

initrd /initrd- 2.4.21 -9.0.1.ELorafw1.img

title Fedora Core ( 2.4.22 -1.2115.nptl)

root (hd0,0)

kernel /vmlinuz- 2.4.22 -1.2115.nptl ro root=LABEL=/ rhgb

initrd /initrd- 2.4.22 -1.2115.nptl.img

文件: /etc/rc.local

这些命令负责将卷绑定到原始设备、内核设定点、激活卷组、创建符号链接 — 所有这些都是为了准备每个节点的共享存储器。

#!/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

vgscan

vgchange -a y

 

 

# +---------------------------------------------------------+

# SHARED MEMORY

# +---------------------------------------------------------+

 

echo "2147483648" > /proc/sys/kernel/shmmax

echo "4096" > /proc/sys/kernel/shmmni

 

 

# +---------------------------------------------------------+

# SEMAPHORES

# ----------

#

# SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value

#

# +---------------------------------------------------------+

 

echo "256 32000 100 128" > /proc/sys/kernel/sem

 

 

# +---------------------------------------------------------+

# FILE HANDLES

# ----------------------------------------------------------+

 

echo "65536" > /proc/sys/fs/file-max

 

 

# +---------------------------------------------------------+

# BIND ALL RAW DEVICES

# +---------------------------------------------------------+

 

/usr/bin/raw /dev/raw/raw1 /dev/pv1/lvol1

/usr/bin/raw /dev/raw/raw2 /dev/pv1/lvol2

/usr/bin/raw /dev/raw/raw3 /dev/pv1/lvol3

/usr/bin/raw /dev/raw/raw4 /dev/pv1/lvol4

/usr/bin/raw /dev/raw/raw5 /dev/pv1/lvol5

/usr/bin/raw /dev/raw/raw6 /dev/pv1/lvol6

/usr/bin/raw /dev/raw/raw7 /dev/pv1/lvol7

/usr/bin/raw /dev/raw/raw8 /dev/pv1/lvol8

/usr/bin/raw /dev/raw/raw9 /dev/pv1/lvol9

/usr/bin/raw /dev/raw/raw10 /dev/pv1/lvol10

/usr/bin/raw /dev/raw/raw11 /dev/pv1/lvol11

/usr/bin/raw /dev/raw/raw12 /dev/pv1/lvol12

/usr/bin/raw /dev/raw/raw13 /dev/pv1/lvol13

/usr/bin/raw /dev/raw/raw14 /dev/pv1/lvol14

/usr/bin/raw /dev/raw/raw15 /dev/pv1/lvol15

/usr/bin/raw /dev/raw/raw16 /dev/pv1/lvol16

/usr/bin/raw /dev/raw/raw17 /dev/pv1/lvol17

/usr/bin/raw /dev/raw/raw18 /dev/pv1/lvol18

/usr/bin/raw /dev/raw/raw19 /dev/pv1/lvol19

/usr/bin/raw /dev/raw/raw20 /dev/pv1/lvol20

/usr/bin/raw /dev/raw/raw21 /dev/pv1/lvol21

/usr/bin/raw /dev/raw/raw22 /dev/pv1/lvol22

/usr/bin/raw /dev/raw/raw23 /dev/pv1/lvol23

/bin/chmod 600 /dev/raw/raw1

/bin/chmod 600 /dev/raw/raw2

/bin/chmod 600 /dev/raw/raw3

/bin/chmod 600 /dev/raw/raw4

/bin/chmod 600 /dev/raw/raw5

/bin/chmod 600 /dev/raw/raw6

/bin/chmod 600 /dev/raw/raw7

/bin/chmod 600 /dev/raw/raw8

/bin/chmod 600 /dev/raw/raw9

/bin/chmod 600 /dev/raw/raw10

/bin/chmod 600 /dev/raw/raw11

/bin/chmod 600 /dev/raw/raw12

/bin/chmod 600 /dev/raw/raw13

/bin/chmod 600 /dev/raw/raw14

/bin/chmod 600 /dev/raw/raw15

/bin/chmod 600 /dev/raw/raw16

/bin/chmod 600 /dev/raw/raw17

/bin/chmod 600 /dev/raw/raw18

/bin/chmod 600 /dev/raw/raw19

/bin/chmod 600 /dev/raw/raw20

/bin/chmod 600 /dev/raw/raw21

/bin/chmod 600 /dev/raw/raw22

/bin/chmod 600 /dev/raw/raw23

/bin/chown oracle:dba /dev/raw/raw1

/bin/chown oracle:dba /dev/raw/raw2

/bin/chown oracle:dba /dev/raw/raw3

/bin/chown oracle:dba /dev/raw/raw4

/bin/chown oracle:dba /dev/raw/raw5

/bin/chown oracle:dba /dev/raw/raw6

/bin/chown oracle:dba /dev/raw/raw7

/bin/chown oracle:dba /dev/raw/raw8

/bin/chown oracle:dba /dev/raw/raw9

/bin/chown oracle:dba /dev/raw/raw10

/bin/chown oracle:dba /dev/raw/raw11

/bin/chown oracle:dba /dev/raw/raw12

/bin/chown oracle:dba /dev/raw/raw13

/bin/chown oracle:dba /dev/raw/raw14

/bin/chown oracle:dba /dev/raw/raw15

/bin/chown oracle:dba /dev/raw/raw16

/bin/chown oracle:dba /dev/raw/raw17

/bin/chown oracle:dba /dev/raw/raw18

/bin/chown oracle:dba /dev/raw/raw19

/bin/chown oracle:dba /dev/raw/raw20

/bin/chown oracle:dba /dev/raw/raw21

/bin/chown oracle:dba /dev/raw/raw22

/bin/chown oracle:dba /dev/raw/raw23

 

# +---------------------------------------------------------+

# CREATE SYMBOLIC LINKS

# +---------------------------------------------------------+

 

mkdir /u01/app/oracle/oradata

mkdir /u01/app/oracle/oradata/orcl

 

ln -s /dev/raw/raw1 /u01/app/oracle/oradata/orcl/CMQuorumFile

ln -s /dev/raw/raw2 /u01/app/oracle/oradata/orcl/SharedSrvctlConfigFile

ln -s /dev/raw/raw3 /u01/app/oracle/oradata/orcl/spfileorcl.ora

ln -s /dev/raw/raw4 /u01/app/oracle/oradata/orcl/control01.ctl

ln -s /dev/raw/raw5 /u01/app/oracle/oradata/orcl/control02.ctl

ln -s /dev/raw/raw6 /u01/app/oracle/oradata/orcl/control03.ctl

ln -s /dev/raw/raw7 /u01/app/oracle/oradata/orcl/cwmlite01.dbf

ln -s /dev/raw/raw8 /u01/app/oracle/oradata/orcl/drsys01.dbf

ln -s /dev/raw/raw9 /u01/app/oracle/oradata/orcl/example01.dbf

ln -s /dev/raw/raw10 /u01/app/oracle/oradata/orcl/indx01.dbf

ln -s /dev/raw/raw11 /u01/app/oracle/oradata/orcl/odm01.dbf

ln -s /dev/raw/raw12 /u01/app/oracle/oradata/orcl/system01.dbf

ln -s /dev/raw/raw13 /u01/app/oracle/oradata/orcl/temp01.dbf

ln -s /dev/raw/raw14 /u01/app/oracle/oradata/orcl/tools01.dbf

ln -s /dev/raw/raw15 /u01/app/oracle/oradata/orcl/undotbs01.dbf

ln -s /dev/raw/raw16 /u01/app/oracle/oradata/orcl/undotbs02.dbf

ln -s /dev/raw/raw17 /u01/app/oracle/oradata/orcl/users01.dbf

ln -s /dev/raw/raw18 /u01/app/oracle/oradata/orcl/xdb01.dbf

ln -s /dev/raw/raw19 /u01/app/oracle/oradata/orcl/perfstat01.dbf

ln -s /dev/raw/raw20 /u01/app/oracle/oradata/orcl/redo01.log

ln -s /dev/raw/raw21 /u01/app/oracle/oradata/orcl/redo02.log

ln -s /dev/raw/raw22 /u01/app/oracle/oradata/orcl/redo03.log

ln -s /dev/raw/raw23 /u01/app/oracle/oradata/orcl/orcl_redo2_2.log

 

chown -R oracle:dba /u01/app/oracle/oradata

 

/sbin/insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

更新 Red Hat Linux 系统( Oracle Metalink 注释 #252217.1 )(在两个节点上执行)

以下的 RPM 均在 Red Hat Fedora Core 1 CD 中提供,它们需要进行更新,方法使用在 Metalink 注释 #252217.1“ 在 RHEL3 上安装 Oracle9 i R2 的需求 ” 中说明的步骤。

所有这些程序包都需要以 root 用户安装。

在 Fedora Core 1 / 1 号盘上

# cd /mnt/cdrom/Fedora/RPMS

# rpm -Uvh libpng10- 1.0.13 -9.i386.rpm

在 Fedora Core 1 / 2 号盘上

# cd /mnt/cdrom/Fedora/RPMS

# rpm -Uvh gnome-libs- 1.4.1 .2.90-35.i386.rpm

在 Fedora Core 1 / 3 号盘上

# cd /mnt/cdrom/Fedora/RPMS

# rpm -Uvh compat-libstdc++-7.3-2.96.118.i386.rpm

# rpm -Uvh compat-libstdc++-devel-7.3-2.96.118.i386.rpm

# rpm -Uvh compat-db- 4.0.14 -2.i386.rpm

# rpm -Uvh compat-gcc-7.3-2.96.118.i386.rpm

# rpm -Uvh compat-gcc-c++-7.3-2.96.118.i386.rpm

# rpm -Uvh sysstat- 4.0.7 -5.i386.rpm

# rpm -Uvh openmotif21- 2.1.30 -8.i386.rpm

# rpm -Uvh pdksh- 5.2.14 -23.i386.rpm

在 PATH 中设置 gcc296 和 g++296

首先通过创建以下的符号链接,将 gcc296 和 g++296 加入到 $PATH 变量中:

# mv /usr/bin/gcc /usr/bin/gcc323

# mv /usr/bin/g++ /usr/bin/g++323

# ln -s /usr/bin/gcc296 /usr/bin/gcc

# ln -s /usr/bin/g++296 /usr/bin/g++

检查主机名

如有必要,可对修改 /etc/hosts 文件,以确保 hostname 命令返回完全合格的主机名:

# hostname

安装 3006854 补丁: Oracle/Linux 补丁 3006854

# unzip p3006854_9204_LINUX.zip

# cd 3006854

# sh rhel3_pre_install.sh

重新启动系统

此时,在准备安装 Oracle 软件之前,重新启动 RAC 集群中的所有节点。

# init 6

(出处:http://www.sheup.com)