UML软件工程组织
北京火龙果软件工程技术中心

在 Linux 和 iSCSI 上构建您自己的 Oracle RAC 10g 第 2 版集群

 

作者:不详   出处:敏思博客

 

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

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

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

对于那些没有大笔现金但希望熟悉 Oracle RAC 10g 的人而言,本指南提供了一种低成本的替代方法来配置 Oracle RAC 10g 第 2 版系统,它使用现成的商用组件和可下载的软件,估计成本在 2,200 美元到 2,500 美元之间。该系统包括一个双节点集群(每个节点有一个处理器),这两个节点均运行 Linux(CentOS 4.4 或 Red Hat Enterprise Linux 4 Update 4)、Oracle10g 第 2 版、OCFS2 和 ASMLib 2.0。Oracle RAC 的所有共享磁盘存储将基于使用网络存储服务器(即 Openfiler 2.1 版)的 iSCSI。(当然,您还可以考虑在 VMware 虚拟机上构建一个虚拟集群,但是其体验将不尽相同!)

注意,本文的未来版本将基于 Oracle 的 Enterprise Linux,以取代 CentOS 和 Red Hat Linux。Enterprise Linux 将提供相同甚至更好的稳定性,并包含 OCFS2 和 ASMLib 软件程序包。要了解有关 Enterprise Linux 的更多信息,请访问 http://www.oracle.com/linux。尽管此配置尚未在 Enterprise Linux 上测试,但经过少量更改应该可以使用。

由 rPath Linux 驱动的 Openfiler 是一个基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接存储 (NAS) 和基于块的存储区域网 (SAN)。Openfiler 支持 CIFS、NFS、HTTP/DAV 和 FTP,但是,我们仅使用它的 iSCSI 功能为 Oracle10g RAC 需要的共享存储组件实现低成本的 SAN。我们通过它的 USB 2.0 接口将一个 500GB 的外置硬盘驱动器连接到网络存储服务器(在本文中,有时称为 Openfiler 服务器)。Openfiler 服务器将配置为使用该磁盘进行基于 iSCSI 的存储,并且将在 Oracle10g RAC 配置中用于存储 Oracle 集群件所需的共享文件以及所有 Oracle ASM 卷。

注意:本文仅供教学使用,因此设置很简单,仅用于演示想法和概念。例如,仅在一个物理磁盘上设置了磁盘镜像,而实际上,至少应该在两个物理驱动器上设置磁盘镜像。

这不是构建低成本 Oracle RAC 10g 系统的唯一方法。我曾使用过其他解决方案,这些解决方案将基于 SCSI 的实现用于共享存储组件。在某些情况下,SCSI 的成本会高于本文所描述的实现的成本,低成本 SCSI 配置将包括:

  • SCSI 控制器:两个 SCSI 控制器,单价从 20 美元 (Adaptec AHA-2940UW) 到 220 美元 (Adaptec 39320A-R)
  • 内含 SCSI:70 美元(包含 1 个 Bay 3.5" U320 SCSI 插槽)
  • SCSI 硬盘驱动器:140 美元(36GB 15K 68p U320 SCSI 硬盘驱动器)
  • SCSI 电缆:两根 SCSI 电缆,每根 20 美元(3ft External HD68 到 HD68 U320 Cable)

注意,某些主板可能已包含内置的 SCSI 控制器。

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

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

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

自 Oracle 数据库 10g 第 2 版 (10.2) 开始,Oracle 集群件应安装在单独的 Oracle 集群件主目录中,该目录不是特定于版本的。这是对最佳灵活体系结构 (OFA) 规则所作的更改。您不应该将 Oracle 集群件安装到特定于版本的 Oracle 主目录挂载点(如 /u01/app/oracle/product/10.2.0/...),因为 Oracle 集群件的后续版本将覆盖同一路径中的 Oracle 集群件安装。此外,如果 Oracle 集群件 10g 第 2 版 (10.2) 检测到现有的 Oracle 集群就绪服务安装,就会覆盖同一路径中的现有安装。

Oracle 集群件软件将安装到构成该 RAC 集群的两个节点的 /u01/app/oracle/product/crs 中。但是,集群件软件需要将两个文件(“Oracle 集群注册表 (OCR)”文件和“表决磁盘”(Voting Disk) 文件)与集群中的这两个节点共享。这两个文件将安装到使用 Oracle 集群文件系统第 2 版 (OCFS2) 的共享存储中。可以(但 Oracle 不建议)使用 RAW 设备存储这些文件,但不能使用 ASM 存储这两个集群件文件。

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

注意:本文仅作为绝对不可替代的文档。此处唯一的例外是供应商硬件的选择(即:计算机、网络设备和外置硬盘驱动器)。确保您从供应商处购买的硬件在 Red Hat Linux 4 上受支持。

如果您要寻找一个使用 FireWire 利用 RHEL 4 上的 Oracle RAC 10g 第 2 版的示例,请单击此处

如果要寻找一个利用 RHEL 3 上的 Oracle RAC 10g 第 1 版的示例,请单击此处

要获得以前发布的本指南的 Oracle9i RAC 版本,请单击此处

返回首页

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

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

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

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

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

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

返回首页

3. 共享存储概述
 现在,光纤通道是最流行的共享存储解决方案之一。前面曾提到过,光纤通道是一种高速串行传输接口,用于在点到点 (FC-P2P)、仲裁环路 (FC-AL) 或交换式拓扑结构 (FC-SW) 中连接系统与存储设备。光纤通道支持的协议包括 SCSI 和 IP。光纤通道配置可以支持多达 127 个节点,它在每个方向上的每秒吞吐量可以高达 2.12 千兆位,将来预期可达到 4.25 Gbps。

但是,光纤通道的价格很昂贵。单是光纤通道交换机就可能需要 1,000 美元。这还不包括光纤通道存储阵列和高端驱动器,一个 36GB 驱动器的价格可高达约 300 美元。典型的光纤通道安装包括用于服务器的光纤通道卡,基本安装大约要 10,000 美元,这还不包括构成集群的服务器的成本。

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

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

本文将使用的共享存储基于使用网络存储服务器(随 Openfiler 安装)的 iSCSI 技术。该解决方案为测试和教学目的提供了光纤通道的低成本替代方法,但由于使用的是低端硬件,因此不能用于生产环境。

返回首页

4. iSCSI 技术
 多年以来,一直用于构建基于网络的存储解决方案的唯一技术就是光纤通道存储区域网 (FC SAN)。基于以前的一组 ANSI 协议(称为光纤分布式数据接口 (FDDI)),开发光纤通道的目的是在存储网络上移动 SCSI 命令。

FC SAN 的优势包括提高了性能、磁盘利用率、可用性以及可伸缩性等,但最重要的是支持服务器集群!但是,FC SAN 现在仍受三个主要缺点的限制。首先是价格。尽管构建 FC SAN 的成本在最近几年有所下降,但进入成本对于 IT 预算有限的小公司来说仍然是高的惊人。第二个缺点是硬件组件不兼容。采用 FC SAN 之后,许多产品制造商对光纤通道规范的解释各不相同,从而导致许多互连问题。如果从公共制造商购买光纤通道组件,这通常不是一个问题。第三个缺点是光纤通道网络不是以太网!它需要一种单独的网络技术,并要求数据中心人员具备另外一组技能。

随着千兆位以太网的普及以及对降低成本的需要,基于 iSCSI 的存储系统逐渐成为光纤通道的有力竞争对手。现在,iSCSI SAN 仍然是 FC SAN 的最大竞争者。

2003 年 2 月 11 日,经过 Internet 工程任务组 (IETF) 的批准,Internet 小型计算机系统接口(一般称为 iSCSI)成为一个基于 Internet 协议 (IP) 的存储网络标准,用于建立和管理基于 IP 的存储设备、主机和客户端之间的连接。iSCSI 是 SCSI-3 规范框架中定义的数据传输协议,它与光纤通道的类似之处在于其也负责在存储网络上运送块级数据。块级通信意味着数据以“块”的形式在主机和客户端之间传输。数据库服务器依赖这种类型的通信(而不是大多数 NAS 系统使用的文件级通信)以便正常工作。与 FC SAN 一样,iSCSI SAN 应该是一个专用于存储的单独物理网络,但其组件与典型 IP 网络 (LAN) 中的组件基本相同。

尽管 iSCSI 的未来前景广阔,但对其的早期批评很快指出其与性能有关的固有缺陷。iSCSI 的优势是能够利用大家熟悉的 IP 网络作为传输机制。但是,TCP/IP 协议非常复杂并且占用 CPU 资源过多。使用 iSCSI,大部分数据处理(TCP 和 iSCSI)都在软件中执行,这比完全在硬件中处理的光纤通道慢得多。将每个 SCSI 命令映射到等价 iSCSI 事务所带来的开销过大。对许多公司来说,解决方案是消除 iSCSI 软件启动器,并投资能够从服务器 CPU 中卸载 TCP/IP 和 iSCSI 处理的专用卡。这些专用卡有时称为 iSCSI 主机总线适配器 (HBA) 或 TCP 卸载引擎 (TOE) 卡。还要考虑到目前 10 GB 以太网是主流!

与其他新技术一样,iSCSI 具有一组自己的缩写词和术语。对于本文来说,只需要了解 iSCSI 启动器与 iSCSI 目标之间的区别。

iSCSI 启动器。从本质上说,iSCSI 启动器是一个客户端设备,用于将请求连接并启动到服务器(在本例中是 iSCSI 目标)提供的某个服务。iSCSI 启动器软件需要位于每个 Oracle RAC 节点(linux1 和 linux2)上。

iSCSI 启动器可以使用软件实现,也可以使用硬件实现。软件 iSCSI 启动器可用于大部分主要操作系统平台。对于本文,我们将使用免费的 Linux iscsi-sfnet 软件驱动程序,该程序位于作为 Linux-iSCSI 项目的一部分而开发的 iscsi-initiator-utils RPM 中。iSCSI 软件启动器通常与标准网络接口卡 (NIC)(大多数情况下是千兆位以太网卡)配合使用。硬件启动器是一个 iSCSI HBA(或 TCP 卸载引擎 (TOE) 卡),它在本质上只是一个专用以太网卡,其上的 SCSI ASIC 可以从系统 CPU 内卸载所有工作(TCP 和 SCSI 命令)。iSCSI HBA 可以从许多供应商处购买,包括 Adaptec、Alacritech、Intel 和 QLogic。

iSCSI 目标。iSCSI 目标是 iSCSI 网络的“服务器”组件。它通常是一个存储设备,用于包含您所需的信息并回应来自启动器(一个或多个)的请求。考虑到本文目的,节点 openfiler1 将是 iSCSI 目标。

因此,根据有关 iSCSI 的所有这些讨论,是否意味着光纤通道很快就会消失?可能不是这样。多年以来,光纤通道通过其极快的速度、灵活性和强健的可靠性,为自己的能力提供了有力的证据。对高性能存储、大型复杂连接以及关键任务可靠性有严格要求的客户将毫不犹豫地继续选择光纤通道。

在结束本部分之前,我认为应该提供一个列表,以对各种类型的磁盘接口和网络技术的速度进行一番比较。对于每种接口,我提供了每秒千位 (kb)、千字节 (KB)、兆位 (Mb)、兆字节 (MB) 以及千兆位 (Gb) 的最大传输速率,较常用的以灰色突出显示。

磁盘接口 / 网络
速度
Kb
KB
Mb
MB
Gb
串行 115 14.375 0.115 0.014  
并行(标准) 920 115 0.92 0.115  
10Base-T 以太网     10 1.25  
IEEE 802.11b 无线 Wi-Fi(2.4 GHz 频带)     11 1.375  
USB 1.1     12 1.5  
并行 (ECP/EPP)     24 3  
SCSI-1     40 5  
IEEE 802.11g 无线 WLAN(2.4 GHz 频带)     54 6.75  
SCSI-2(快速 SCSI/快速窄带 SCSI)     80 10  
100Base-T 以太网(高速以太网)     100 12.5  
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     320 40  
FireWire 400 - (IEEE1394a)
    400 50
 
USB 2.0     480 60  
宽带 Ultra2 SCSI
    640 80
 
Ultra3 SCSI     640 80  
FireWire 800 - (IEEE1394b)
    800 100  
千兆位以太网     1000 125 1
串行 ATA I - (SATA I)     1200 150 1.2
宽带 Ultra3 SCSI
    1280 160 1.28
Ultra160 SCSI     1280 160 1.28
串行 ATA II - (SATA II)
    2400 300 2.4
Ultra320 SCSI     2560 320 2.56
FC-AL 光纤通道     3200 400 3.2
串行 ATA III - (SATA III)     4800 600 4.8
10G 以太网 (IEEE 802.3ae)     10000 1250 10

返回首页

5. 硬件及成本
 用于构建示例 Oracle10g RAC 环境的硬件包括三个 Linux 服务器(两个 Oracle RAC 节点和一个网络存储服务器),以及可以在许多本地计算机商店或互联网上购买到的组件。

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

用于 linux2 与 Openfiler 网络存储的 RAC 互连。

Oracle RAC 的每个 Linux 服务器应该包含两个 NIC 适配器。Dell Dimension 包含一个集成的 10/100 以太网适配器,它将用于连接公共网络。第二个 NIC 适配器将用于专用网络(RAC 互连和 Openfiler 网络存储)。选择与要用于专用网络的网络交换机的最大数据传输速度兼容且合适的 NIC 适配器。

10/100 以太网

千兆位以太网

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

用于 linux1 与 Openfiler 网络存储的 RAC 互连。

Oracle RAC 的每个 Linux 服务器应该包含两个 NIC 适配器。Dell Dimension 包含一个集成的 10/100 以太网适配器,它将用于连接公共网络。第二个 NIC 适配器将用于专用网络(RAC 互连和 Openfiler 网络存储)。选择与要用于专用网络的网络交换机的最大数据传输速度兼容且合适的 NIC 适配器。

10/100 以太网

千兆位以太网

20美元
网络存储服务器 - (openfiler1)
Clone / Pentium 4
  • Intel(R) Pentium(R) 4 CPU 1.80GHz
  • 1GB DDR SDRAM (333MHz)
  • 40GB 7200 RPM 内置硬盘驱动器
  • NVIDIA GeForce FX 5200 / AGP 图形卡
  • 集成的 10/100 以太网卡
  • 4 个 USB 2.0 集成端口
  • CDROM(48X 倍速)
  • 3.5" 软盘驱动器
  • 无监视器(已经有一台)
  • USB 鼠标和键盘
500美元
1 - 以太网 LAN 卡

用于专用网络上的网络存储。

网络存储服务器(Openfiler 服务器)应包含两个 NIC 适配器。Clone / Pentium 4 计算机包含一个集成的 10/100 以太网适配器,它将用于连接公共网络。第二个 NIC 适配器将用于专用网络(Openfiler 网络存储)。选择与要用于专用网络的网络交换机的最大数据传输速度兼容且合适的 NIC 适配器。

10/100 以太网

千兆位以太网

20美元
其他组件
存储设备 - 外置硬盘驱动器

对于数据库存储,我使用了一个外置 Maxtor OneTouch III (500GB) 驱动器,并通过 USB 2.0 接口将其连接到 Openfiler 服务器。Openfiler 服务器将配置为使用该磁盘进行基于 iSCSI 的存储,并且将在 Oracle10g RAC 配置中用于存储 Oracle 集群件所需的共享文件以及所有 Oracle ASM 卷。注意,只要能够被网络存储服务器识别并具有充足的空间,任何类型的硬盘(内置或外置)都应该正常工作。

Maxtor OneTouch III - 500GB FireWire 800/FireWire 400/USB 2.0 驱动器 - (F01W500)

以下是我为本测试所购买的磁盘的详细信息:

  • 厂商:Maxtor
  • 型号:OneTouch III
  • Mfg.部件号或 KIT 号:F01W500
  • 容量:500 GB
  • 高速缓存缓冲区:16 MB
  • 转速 (rpm):7200 RPM
  • 接口传输速率:
  • FireWire 800 - 800 Mbits/sec
  • FireWire 400 - 400 Mbits/sec
  • USB 2.0 - 480 Mbits/sec
  • “组合”接口:
  • IEEE 1394b - FireWire 800
  • IEEE 1394a - FireWire 400
  • USB 2.0 / USB 1.1
320美元
1 - 以太网交换机

用于 linux1-priv 和 linux2-priv 之间的互连。该交换机还用于 Openfiler 的网络存储流量。为了降低成本,我在专用网络中使用了 10/100 Mb 以太网交换机(以及 10/100 Mb 以太网卡),但强烈建议您使用千兆位以太网交换机(以及 1Gb 的以太网卡)。

10/100 以太网

千兆位以太网

25美元

6 - 网络电缆

  • 5e 类接线电缆 -(将 linux1 连接到公共网络)
  • 5e 类接线电缆 -(将 linux2 连接到公共网络)
  • 5e 类接线电缆 -(将 openfiler1 连接到公共网络)
  • 5e 类接线电缆 -(将 linux1 与以太网交换机互连)
  • 5e 类接线电缆 -(将 linux2 与以太网交换机互连)
  • 5e 类接线电缆 -(将 openfiler1 与以太网交换机互连)


5 美元
5 美元
5 美元
5 美元
5 美元
5 美元
总计
2,175 美元

下面,我们将开始安装过程。既然已经讨论了将在本示例中使用的硬件,下面我们来对环境进行概念性的了解(单击下面的图形查看大图像):


 在开始详细说明安装过程之前,应该注意本文中的大部分任务都需要在这两个 Oracle RAC 节点(linux1 和 linux2)上执行。我将在每个部分的开始处指出是应该在这两个 Oracle RAC 节点上还是在网络存储服务器 (openfiler1) 上执行该任务。

返回首页

 6. 安装 Linux 操作系统

在集群中的两个 Oracle RAC 节点上执行下列安装步骤!
本节总结了用于安装 Linux 操作系统的各个屏幕。本指南原定使用 Red Hat Enterprise Linux 4 AS/ES (RHEL4) 操作环境。作为替代方法,我在本文中使用了 CentOS 4.4:RHEL4 操作环境的一个免费且稳定的版本。

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

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

下载 CentOS 4.4 的以下 ISO 镜像:

  • CentOS-4.4-i386-bin1of4.iso (622 MB)
  • CentOS-4.4-i386-bin2of4.iso (636 MB)
  • CentOS-4.4-i386-bin3of4.iso (638 MB)
  • CentOS-4.4-i386-bin4of4.iso (313 MB)

如果您将以上 ISO 文件下载到 MS Windows 计算机,可以使用多种方法将这些镜像(ISO 文件)刻录到 CD。您可能很熟悉这个过程,甚至已经拥有合适的软件可以将镜像刻录到 CD。如果您不熟悉这个过程,并且没有将镜像刻录到 CD 所需的软件,这里提供了两个软件程序包(实际上有许多个):

  • UltraISO
  • Magic ISO Maker

在下载并将 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 安装所需的重要程序包的详细说明,请参见第 19 节(“Oracle10g 第 2 版的安装前任务”)。

请注意,在使用某些 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
 本屏幕主要是一个确认屏幕。单击 [Continue] 开始安装。在安装过程中,会依次要求您将盘切换到 2 号盘、3 号盘和 4 号盘。

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

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

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

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

Perform the same installation on the second node
 在第一个节点上完成 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. 网络配置

在集群中的两个 Oracle RAC 节点上执行下列网络配置!
 注意:虽然我们在 Linux 安装过程中配置了几个网络设置,但千万不要跳过本节,因为它包含了 RAC 环境所需的关键步骤。

网络设置简介

在 Linux O/S 安装过程中,我们已经为这两个 Oracle RAC 节点配置了 IP 地址和主机名。现在,我们需要配置 /etc/hosts 文件,并调整几个用于互连的网络设置。

这两个 Oracle RAC 节点均应有一个用于公共网络的静态 IP 地址和一个用于专用集群互连的静态 IP 地址。不要为公共 IP 地址或互连使用 DHCP 命名;您需要静态 IP 地址!专用互连应该仅由 Oracle 用于传输与集群管理器和高速缓存融合相关的数据以及用于网络存储服务器 (Openfiler) 的数据。虽然可以将公共网络用于互连,但由于它可能导致数据库性能降低(会减少高速缓存融合和集群管理器流量的带宽),因此不建议使用这种方法。对于生产 RAC 实现,互连应该至少有千兆位(或更多)且仅由 Oracle 使用,并且在单独的千兆位网络上具有网络存储服务器 (Openfiler)。

配置公共网络和专用网络

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

在 Red Hat Linux 中配置网络设置的最简单方法是通过“网络配置”程序。该应用程序能够以“root”用户帐户从命令行启动,如下所示:

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

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

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

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

图 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.0inet6 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 将被自动故障切换到另外某个节点上。当出现这种情况时,会发生两件事。

新的节点重新进行地址解析,显示该地址的一个新的 MAC 地址。对于直接连接的客户端,这通常使它们在连接旧地址时出现错误。
随后发送到 VIP 的数据包前往新的节点,该节点将把错误的 RST 数据包返回客户端。这导致客户端立即收到错误信息。
这意味着,当客户端向现在已经停机的节点发出 SQL 时,或者在连接状态下遍历地址列表时,客户端不会等待很长的 TCP/IP 超时(大约 10 分钟),而是接收到一个 TCP 重置信息。就 SQL 来说,该信息为 ORA-3113。对于连接,使用 tnsname 中的下一个地址。

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

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

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

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

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

 检查并关闭 UDP ICMP 拒绝

在 Linux 安装期间,我指出不配置防火墙选项。默认情况下,配置防火墙的选项由安装程序选择。这使我吃了好几次苦头,因此我要仔细检查防火墙选项是否未配置,并确保 udp ICMP 过滤已关闭。

如果 UDP ICMP 被防火墙阻塞或拒绝,Oracle 集群件软件将在运行几分钟之后崩溃。如果 Oracle 集群件进程出现故障,您的 <machine_name>_evmocr.log 文件中将出现以下类似内容:

08/29/2005 22:17:19
 oac_init:2: Could not connect to server, clsc retcode = 9
 08/29/2005 22:17:19
 a_init:12!: Client init unsuccessful : [32]
 ibctx:1:ERROR: INVALID FORMAT
 proprinit:problem reading the bootblock or superbloc 22

 如果遇到此类错误,解决方法是移除 udp ICMP (iptables) 拒绝规则,或者只需关闭防火墙选项。之后,Oracle 集群件软件将开始正常工作,而不会崩溃。以下命令应该以 root 用户帐户的身份执行:

  1. 检查以确保防火墙选项关闭。如果防火墙选项已停用(如下面的示例所示),则不必继续执行以下步骤。
    # /etc/rc.d/init.d/iptables statusFirewall is stopped
    .
  2. 如果防火墙选项已启用,您首先需要手动停用 UDP ICMP 拒绝:
    # /etc/rc.d/init.d/iptables stopFlushing firewall rules: [ OK ]Setting chains to policy ACCEPT: filter [ OK ]Unloading iptables modules: [ OK ]
  3. 然后,针对下一次服务器重启关闭 UDP ICMP 拒绝(应该始终被关闭):
    # chkconfig iptables off

返回首页

 8. 安装 Openfiler
 在网络存储服务器 (openfiler1) 上执行以下安装!

在两个 Oracle RAC 节点上进行网络配置之后,下一步是将 Openfiler 软件安装到网络存储服务器 (openfiler1)。在本文的后面部分,会将网络存储服务器配置为 iSCSI 存储设备,以满足所有 Oracle10g RAC 共享存储要求。

Openfiler 由 rPath Linux 驱动,它是一个基于浏览器的免费网络存储管理实用程序,可以在单一框架中提供基于文件的网络连接存储 (NAS) 和基于块的存储区域网 (SAN)。整个软件包与开放源代码应用程序(例如 Apache、Samba、LVM2、ext3、Linux NFS 和 iSCSI Enterprise Target)连接。Openfiler 将这些随处可见的技术组合到一个易于使用的小型管理解决方案中,该解决方案通过一个基于 Web 且功能强大的管理界面实现。

Openfiler 支持 CIFS、NFS、HTTP/DAV 和 FTP,但是,我仅使用它的 iSCSI 功能为 Oracle10g RAC 需要的共享存储组件实现低成本的 SAN。我们将通过 USB 2.0 接口将一个 500GB 的外置硬盘驱动器连接到 Openfiler 服务器。Openfiler 服务器将配置为使用该磁盘进行基于 iSCSI 的存储,并且将在 Oracle10g RAC 配置中用于存储 Oracle 集群件所需的共享文件以及所有 Oracle ASM 卷。

要了解有关 Openfiler 的更多信息,请访问其网站 http://www.openfiler.com/

下载 Openfiler

请使用下面的链接下载 Openfiler 2.1 x86(最终版)。下载 Openfiler 之后,需要将 ISO 镜像刻录到 CD。

  • Openfiler
    • openfiler-2.1-x86-disc1.iso (302 MB)

如果您将以上 ISO 文件下载到 MS Windows 计算机,可以使用多种方法将这些镜像(ISO 文件)刻录到 CD。您可能很熟悉这个过程,甚至已经拥有合适的软件,可以将镜像刻录到 CD。如果您不熟悉这个过程,并且没有将镜像刻录到 CD 所需的软件,这里提供了两个软件程序包(实际上有许多个):

  • UltraISO
  • Magic ISO Maker

安装 Openfiler

本部分概述了用于安装 Openfiler 软件的各个屏幕。就本文而言,我选择了使用所有默认选项安装 Openfiler。所需的唯一手动更改是为了配置本地网络设置。

安装完成之后,服务器将重新引导以确保启动并识别所需的所有组件、服务和驱动程序。重新引导之后,Openfiler 服务器应该将外置 Maxtor 硬盘驱动器识别为设备 /dev/sda。

有关更详细的安装说明,请访问 http://www.openfiler.com/docs/。但是,我建议使用下面提供的说明对该 Oracle10g RAC 进行配置。

将 Openfiler 软件安装到网络存储服务器之前,应该先安装两个 NIC 接口(卡),并连接和打开所有外置硬盘驱动器。

在下载并将 Openfiler ISO 镜像(ISO 文件)刻录到 CD 之后,将该 CD 插入网络存储服务器(在本例中是 openfiler1),启动其电源,并按照以下说明来回应安装屏幕的提示。

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

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

Welcome to Openfiler NAS/SAN Appliance
 在欢迎屏幕上,单击 [Next] 继续。

Keyboard Configuration
 下一个屏幕将提示您进行键盘设置。为您的配置作出合适的选择。

Disk Partitioning Setup
 下一个屏幕将询问使用“Automatic Partitioning”还是“Manual Partitioning with Disk Druid”执行磁盘分区。这里,您选择哪种方法都可以,尽管官方 Openfiler 文档建议使用手动分区。由于用于此安装的内置硬盘驱动器很小,并且该驱动器将仅用于存储 Openfiler 软件(我不会将内置 40GB 硬盘驱动器上的任何空间用于 iSCSI 存储),因此我选择使用“Automatic Partitioning”。

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

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

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

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

Network Configuration
 在启动 Openfiler 安装之前,我已确认在网络存储服务器上安装了两个 NIC 接口(卡)。本屏幕应该已经成功地检测到每个网络设备。

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

第二步,按照以下方法对 eth0 和 eth1 进行 [Edit] 操作。您可能要为 eth0 和 eth1 使用不同的 IP 地址,没问题。但是,您必须将 eth1(存储网络)配置为与 linux1 和 linux2 上的 eth1 位于同一子网中:

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

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

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

Time Zone Selection
 下一个屏幕将允许您配置时区信息。为您的位置作出合适的选择。

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

About to Install
 本屏幕主要是一个确认屏幕。单击 [Next] 开始安装。

Congratulations
 大功告成。您已经成功地在网络存储服务器上安装了 Openfiler。安装程序将从 CD-ROM 驱动器中弹出 CD。取出 CD,单击 [Reboot] 重新引导系统。

如果在重新引导后一切都已成功,您现在应该看到文本登录屏幕和用于管理 Openfiler 服务器的 URL。

返回首页

9. 使用 Openfiler 配置 iSCSI 卷

 在网络存储服务器 (openfiler1) 上执行以下配置任务!

可以使用 Openfiler Storage Control Center(一个基于浏览器的工具,通过端口 446 上的 https 连接实现)执行 Openfiler 管理。例如:

https://openfiler1:446/

 从 Openfiler Storage Control Center 主页,以管理员身份登录。Openfiler 的默认管理员登录凭证为:

  • Username: openfiler
  • Password: password

管理员看到的第一个页面是 [Accounts] / [Authentication] 屏幕。配置用户帐户和组对本文不是十分重要,因此对此不进行讨论。

要将 Openfiler 用作 iSCSI 存储服务器,我们需要执行三个主要任务:设置 iSCSI 服务、配置网络访问以及创建物理存储。

 服务

要控制服务,我们使用 Openfiler Storage Control Center 并导航到 [Services] / [Enable/Disable]:


 图 6 启用 iSCSI Openfiler 服务

要启用 iSCSI 服务,单击“iSCSI target”服务名称下面的“Enable”。之后,“iSCSI target”状态应更改为“Enabled”。

ietd 程序将实现 iSCSI Enterprise Target 软件的用户级部分,以便在 Linux 上构建 iSCSI 存储系统。启用 iSCSI 目标之后,我们应该能够通过 SSH 进入 Openfiler 服务器,并看到 iscsi-target 服务正在运行:

[root@openfiler1 ~]# service iscsi-target status
 ietd (pid 3784) is running...

 网络访问限制

下一步是配置 Openfiler 中的网络访问,使两个 Oracle RAC 节点(linux1 和 linux2)都有权通过存储(专用)网络访问我们的 iSCSI 卷。(我们将在下一部分中创建 iSCSI 卷!)

此外,该任务还可以使用 Openfiler Storage Control Center 通过导航到 [General] / [Local Networks] 来完成。利用 Local Networks 屏幕,管理员可以设置允许其访问 Openfiler 设备导出的资源的网络和/或主机。就本文而言,我们希望单独添加两个 Oracle RAC 节点,而不是允许整个 192.168.2.0 网络访问 Openfiler 资源。

输入每个 Oracle RAC 节点时,请注意“Name”字段只是一个逻辑名称,仅供参考。根据输入节点的惯例,我仅使用了为该 IP 地址定义的节点名称。接下来,在“Network/Host”字段中输入实际节点时,始终使用其 IP 地址,即使其主机名已经在 /etc/hosts 文件或 DNS 中定义。最后,在我们的 Class C 网络中输入实际主机时,应使用子网掩码 255.255.255.255。

记住,您要为集群中的每个 RAC 节点输入专用 网络 (eth1) 的 IP 地址,这一点很重要。

下图显示了添加两个 Oracle RAC 节点后的结果:

图 7 为 Oracle RAC 节点配置 Openfiler 主机访问

物理存储

在本部分中,我们将创建五个 iSCSI 卷,以供集群中的两个 Oracle RAC 节点用作共享存储。这将在连接到 Openfiler 服务器的外置 USB 硬盘驱动器上执行多个步骤。

存储设备(如内置 IDE/SATA/SCSI 磁盘、外置 USB 或 FireWire 驱动器或者任何其他存储设备)可以连接到 Openfiler 服务器,并供客户端使用。如果在 OS 级发现这些设备,就可以使用 Openfiler Storage Control Center 设置和管理所有这些存储设备。

在本例中,我们将一个 500GB 的外置 USB 硬盘驱动器用于存储。在 Openfiler 服务器上,该驱动器显示为 /dev/sda(外置 Maxtor OneTouch III 驱动器)。要看到该驱动器并启动 iSCSI 卷的创建过程,请从 Openfiler Storage Control Center 导航到 [Volumes] / [Physical Storage Mgmt.]:

图 8 Openfiler 物理存储

对物理磁盘进行分区

我们将执行的第一步是在 /dev/sda 外置 USB 硬盘驱动器上创建一个主分区。通过单击 /dev/sda 链接,我们可以看到“Edit”或“Create”分区的选项。由于我们将创建一个跨整个磁盘的主分区,因此可以将大多数选项保留为默认设置,唯一的修改是将“Partition Type”由“Extended partition”更改为“Physical volume”。下面是我为了在 /dev/sda 上创建主分区而指定的值:

Mode: Primary
 Partition Type:Physical volume
 Starting Cylinder:1
 Ending Cylinder: 60801

现在,大小将显示 465.76 GB。要接受该设置,单击 Create 按钮。这将在我们的外置硬盘驱动器上生成一个新的分区 (/dev/sda1):

图 9 对物理卷进行分区

卷分组管理

下一步是创建卷分组。我们将创建一个名为 rac1 的卷分组,其中包含新创建的主分区。

从 Openfiler Storage Control Center 中,导航到 [Volumes] / [Volume Group Mgmt.]。我们将看到所有现有的卷分组,或者什么也看不到(我们的情况就是这样)。使用 Volume Group Management 屏幕,输入新卷分组的名称 (rac1),单击 /dev/sda1 前面的复选框以选择该分区,最后单击“Add volume group”按钮。之后,我们会看到一个列表,其中将显示我们新创建的名为“rac1”的卷分组:


 图 10 创建的新卷分组

逻辑卷

现在,我们可以在新创建的卷分组 (rac1) 中创建五个逻辑卷。

从 Openfiler Storage Control Center 中,导航到 [Volumes] / [Create New Volume]。我们将看到新创建的卷分组 (rac1) 及其块存储统计信息。该屏幕底部还提供了用于在选定的卷分组中创建新卷的选项。使用该屏幕创建以下五个逻辑 (iSCSI) 卷。在创建每个逻辑卷之后,应用程序将转至“List of Existing Volumes”屏幕。然后,您需要单击后退到“Create New Volume”选项卡以创建下一个逻辑卷,直至五个 iSCSI 卷全部创建完毕:


 实际上,我们已经创建了五个 iSCSI 磁盘,现在可以将它们呈现给网络上的 iSCSI 客户端(linux1 和 linux2)。“List of Existing Volumes”屏幕看起来应如下所示:

图 11 新的逻辑 (iSCSI) 卷

为新的逻辑卷授予访问权限

需要先授予 iSCSI 客户端相应的权限,它才能访问新创建的 iSCSI 卷。在前面,我们将 Openfiler 配置为具有两个主机(Oracle RAC 节点),这两个主机可以配置为具有访问资源的权限。现在,我们需要授予这两个 Oracle RAC 节点访问每个新创建的 iSCSI 卷的权限。

从 Openfiler Storage Control Center 中,导航到 [Volumes] / [List of Existing Volumes]。这将显示上一部分中显示的屏幕。对于每个逻辑卷,单击“Edit”链接(在 Properties 列下)。这将显示该卷的“Edit properties”屏幕。滚动到该屏幕的底部,将两个主机由“Deny”更改为“Allow”,然后单击“Update”按钮:


 图 12 为主机授予逻辑 (iSCSI) 卷的访问权限

针对全部五个逻辑卷执行该任务。

使 iSCSI 目标可供客户端使用

每次添加新的逻辑卷之后,我们都需要在 Openfiler 服务器上重新启动相关服务。在本例中,我们创建了 iSCSI 逻辑卷,因此需要重新启动 iSCSI 目标 (iscsi-target) 服务。这将使新的 iSCSI 目标可供网络上有权访问它们的所有客户端使用。

要重新启动 iSCSI 目标服务,请使用 Openfiler Storage Control Center 并导航到 [Services] / [Enable/Disable]。iSCSI 目标服务应该已经启用(几部分以前)。如果是这样,应禁用该服务,然后再启用它。(参见图 6)

通过 Openfiler 服务器上的 SSH 会话也可以完成该任务:

[root@openfiler1 ~]# service iscsi-target restart
 Stopping iSCSI target service: [ OK ]
 Starting iSCSI target service: [ OK ]

 返回首页

 10. 在 Oracle RAC 节点上配置 iSCSI 卷


 在集群中的两个 Oracle RAC 节点上配置 iSCSI 启动器!但是,创建分区应该只在 RAC 集群的一个节点上执行。

iSCSI 客户端可以是提供 iSCSI 支持(驱动程序)的任何系统(Linux、Unix、MS Windows、Apple Mac 等)。在我们的示例中,客户端是两个 Linux 服务器(linux1 和 linux2),它们运行的是 Red Hat 4。

在本部分中,我们将在两个 Oracle RAC 节点上配置 iSCSI 启动器。这包括在两个 Oracle RAC 节点上配置 /etc/iscsi.conf 文件,使其包含网络存储服务器名称 (openfiler1),以便它们能够发现在前一部分中创建的 iSCSI 卷。然后,我们将执行一项艰巨任务,即:将从 Openfiler 中发现的 iSCSI 目标名称映射到其中一个节点(即 linux1,我们将在该节点上对 iSCSI 卷进行分区)的本地 SCSI 设备名称。通常,大家认为这是一项耗时的任务,但是仅在本部分以及使用 Oracle 集群文件系统 (OCFS2) 和自动存储管理 (ASM) 对 iSCSI 卷进行格式化时才需要执行该任务。您需要知道本地 SCSI 设备名称及其映射到的 iSCSI 目标,才能了解要用于 OCFS2 的卷(设备)和属于 ASM 的卷。注意,每次重新引导其中一个 Oracle RAC 节点时,映射都可能不同。例如,在配置卷的过程中,可能将 iSCSI 目标名称“iqn.2006-01.com.openfiler:rac1.crs”识别为 linux1 上的 /dev/sdd(正如我编写的本部分中的情况)。但是,重新引导该节点后,可能会将“iqn.2006-01.com.openfiler:rac1.crs”识别为 /dev/sde。这不会成为一个问题,因为所有磁盘都由 OCFS2 或 ASM 标记(本文稍后将对此进行讨论)。当其中一个服务尝试挂载卷时,它会使用其标签,而不是使用其本地 SCSI 设备名称。

iSCSI(启动器)服务

在每个 Oracle RAC 节点上,我们都需要确保 iSCSI(启动器)服务状态良好且在运行。如果 iscsi-initiator-utils RPM(即 iscsi-initiator-utils-4.0.3.0-4.i386.rpm)没有作为操作系统安装的一部分安装,则应该将其下载并安装到每个 Oracle RAC 节点上。

要确定是否已安装了该程序包,请在两个 Oracle RAC 节点上执行以下操作:

# rpm -qa | grep iscsi
iscsi-initiator-utils-4.0.3.0-4

 如果未安装,可以从 RHEL4 Update 4 发行版本的第 3 张磁盘(共 4 张)上找到 iscsi-initiator-utils RPM 程序包,也可以从其中一个 Internet RPM 资源下载。

如果 iscsi-initiator-utils RPM 程序包未安装,请使用以下命令进行安装:

# rpm -Uvh iscsi-initiator-utils-4.0.3.0-4.i386.rpm
 warning: iscsi-initiator-utils-4.0.3.0-4.i386.rpm:
  V3 DSA signature: NOKEY, key ID 443e1821
 Preparing...         ########################################### [100%]
   1:iscsi-initiator-utils ########################################### [100%]

验证 iscsi-initiator-utils RPM 已安装之后,需要在 Oracle RAC 节点(iSCSI 客户端)上执行的唯一配置步骤是在 /etc/iscsi.conf 文件中指定网络存储服务器(iSCSI 服务器)。编辑 /etc/iscsi.conf 文件,以包含指定 Openfiler 网络存储服务器主机名的 DiscoveryAddress 项。在我们的示例中,该项是:
  ...
 DiscoveryAddress=openfiler1-priv
 ...

在两个 Oracle RAC 节点上更改 /etc/iscsi.conf 文件之后,我们就可以在两个节点上启动(或重新启动)iscsi 启动器服务:

# service iscsi restart
 Searching for iscsi-based multipath maps
 Found 0 maps
 Stopping iscsid: iscsid not running

Checking iscsi config: [ OK ]
 Loading iscsi driver: [ OK ]
 Starting iscsid: [ OK ]

我们还应该将两个 Oracle RAC 节点的 iSCSI 服务配置为在计算机重新引导后保持活动状态。您可以使用 Linux 命令 chkconfig 达到此目的,如下所示:

# chkconfig --level 345 iscsi on

发现 iSCSI 目标

尽管已经在两个 Oracle RAC 节点上配置了 iSCSI 启动器服务并且在运行该服务,但本部分中的发现指令只能从我们将对其进行分区并标记卷的节点(即 linux1)运行。

当 Openfiler 服务器发布可用 iSCSI 目标(当 iscsi-target 服务在 Openfiler 服务器上启动/重新启动时发生)或者当 iSCSI 启动器服务在客户端上启动/重新启动时,经过配置的客户端将收到表明新的 iSCSI 磁盘现在可用的消息。我们会在客户端的 /var/log/messages 文件中看到类似下面的内容:
...
Oct 10 19:55:39 linux1 iscsi: iscsid startup succeeded
Oct 10 19:55:39 linux1 iscsid[3073]: Connected to Discovery Address 192.168.2.195
Oct 10 19:55:39 linux1 kernel: iscsi-sfnet:host1: Session established
Oct 10 19:55:39 linux1 kernel: iscsi-sfnet:host0: Session established
Oct 10 19:55:39 linux1 kernel: scsi1 : SFNet iSCSI driver
Oct 10 19:55:39 linux1 kernel: scsi0 : SFNet iSCSI driver
Oct 10 19:55:39 linux1 kernel: iscsi-sfnet:host2: Session established
Oct 10 19:55:39 linux1 kernel: Vendor: Openfile Model: Virtual disk Rev: 0
Oct 10 19:55:39 linux1 kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 10 19:55:39 linux1 kernel: iscsi-sfnet:host3: Session established
Oct 10 19:55:39 linux1 kernel: Vendor: Openfile Model: Virtual disk Rev: 0
Oct 10 19:55:39 linux1 kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 10 19:55:39 linux1 kernel: scsi3 : SFNet iSCSI driver
Oct 10 19:55:39 linux1 kernel: SCSI device sda: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:39 linux1 kernel: Vendor: Openfile Model: Virtual disk Rev: 0
Oct 10 19:55:39 linux1 kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 10 19:55:39 linux1 kernel: iscsi-sfnet:host4: Session established
Oct 10 19:55:39 linux1 kernel: scsi4 : SFNet iSCSI driver
Oct 10 19:55:39 linux1 kernel: scsi2 : SFNet iSCSI driver
Oct 10 19:55:39 linux1 kernel: Vendor: Openfile Model: Virtual disk Rev: 0
Oct 10 19:55:39 linux1 kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 10 19:55:39 linux1 kernel: SCSI device sda: drive cache: write through
Oct 10 19:55:39 linux1 kernel: Vendor: Openfile Model: Virtual disk Rev: 0
Oct 10 19:55:39 linux1 kernel: Type: Direct-Access ANSI SCSI revision: 04
Oct 10 19:55:39 linux1 kernel: SCSI device sda: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:39 linux1 kernel: SCSI device sda: drive cache: write through
Oct 10 19:55:39 linux1 kernel: sda: unknown partition table
Oct 10 19:55:39 linux1 kernel: Attached scsi disk sda at scsi1, channel 0, id 0, lun 0
Oct 10 19:55:39 linux1 kernel: SCSI device sdb: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:39 linux1 kernel: SCSI device sdb: drive cache: write through
Oct 10 19:55:39 linux1 kernel: SCSI device sdb: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:39 linux1 scsi.agent[3222]: disk at /devices/platform/host0/target0:0:0/0:0:0:0
Oct 10 19:55:39 linux1 scsi.agent[3237]: disk at /devices/platform/host3/target3:0:0/3:0:0:0
Oct 10 19:55:39 linux1 scsi.agent[3208]: disk at /devices/platform/host1/target1:0:0/1:0:0:0
Oct 10 19:55:39 linux1 kernel: SCSI device sdb: drive cache: write through
Oct 10 19:55:39 linux1 scsi.agent[3283]: disk at /devices/platform/host4/target4:0:0/4:0:0:0
Oct 10 19:55:39 linux1 scsi.agent[3311]: disk at /devices/platform/host2/target2:0:0/2:0:0:0
Oct 10 19:55:40 linux1 kernel: sdb: unknown partition table
Oct 10 19:55:40 linux1 kernel: Attached scsi disk sdb at scsi0, channel 0, id 0, lun 0
Oct 10 19:55:40 linux1 kernel: SCSI device sdc: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:40 linux1 kernel: SCSI device sdc: drive cache: write through
Oct 10 19:55:40 linux1 kernel: SCSI device sdc: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:40 linux1 kernel: SCSI device sdc: drive cache: write through
Oct 10 19:55:40 linux1 kernel: sdc: unknown partition table
Oct 10 19:55:40 linux1 kernel: Attached scsi disk sdc at scsi3, channel 0, id 0, lun 0
Oct 10 19:55:40 linux1 kernel: SCSI device sdd: 4194304 512-byte hdwr sectors (2147 MB)
Oct 10 19:55:40 linux1 kernel: SCSI device sdd: drive cache: write through
Oct 10 19:55:40 linux1 kernel: SCSI device sdd: 4194304 512-byte hdwr sectors (2147 MB)
Oct 10 19:55:40 linux1 kernel: SCSI device sdd: drive cache: write through
Oct 10 19:55:40 linux1 kernel: sdd: unknown partition table
Oct 10 19:55:40 linux1 kernel: Attached scsi disk sdd at scsi4, channel 0, id 0, lun 0
Oct 10 19:55:40 linux1 kernel: SCSI device sde: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:40 linux1 kernel: SCSI device sde: drive cache: write through
Oct 10 19:55:40 linux1 kernel: SCSI device sde: 243138560 512-byte hdwr sectors (124487 MB)
Oct 10 19:55:40 linux1 kernel: SCSI device sde: drive cache: write through
Oct 10 19:55:40 linux1 kernel: sde: unknown partition table
Oct 10 19:55:40 linux1 kernel: Attached scsi disk sde at scsi2, channel 0, id 0, lun 0
Oct 10 19:56:09 linux1 portmap: portmap startup succeeded
...

上面的各项显示客户端 (linux1) 能够通过 iSCSI 存储服务器(位于 192.168.2.195 的 openfiler1-priv)建立 iSCSI 会话。

我们还可以看到本地 SCSI 设备名称如何映射到 iSCSI 目标的主机 ID 和 LUN:

Attached scsi disk sda at scsi1, channel 0, id 0, lun 0
 Attached scsi disk sdb at scsi0, channel 0, id 0, lun 0
 Attached scsi disk sdc at scsi3, channel 0, id 0, lun 0
 Attached scsi disk sdd at scsi4, channel 0, id 0, lun 0
 Attached scsi disk sde at scsi2, channel 0, id 0, lun 0

还可以通过 dmesg 命令确定本地 SCSI 设备名称如何映射到 iSCSI 目标的主机 ID 和 LUN:

# dmesg | sort | grep '^Attached scsi disk'
 Attached scsi disk sda at scsi1, channel 0, id 0, lun 0
 Attached scsi disk sdb at scsi0, channel 0, id 0, lun 0
 Attached scsi disk sdc at scsi3, channel 0, id 0, lun 0
 Attached scsi disk sdd at scsi4, channel 0, id 0, lun 0
 Attached scsi disk sde at scsi2, channel 0, id 0, lun 0

现在,我们需要在客户端 (linux1) 上运行 iscsi-ls 命令,将 iSCSI 目标名称映射到本地 SCSI ID(在下面显示为 HOST ID):

# iscsi-ls
*********************************************************************
SFNet iSCSI Driver Version ...4:0.1.11-3(02-May-2006)
*********************************************************************
TARGET NAME     : iqn.2006-01.com.openfiler:rac1.asm4
TARGET ALIAS    :
HOST ID       : 0
BUS ID       : 0
TARGET ID      : 0
TARGET ADDRESS   : 192.168.2.195:3260,1
SESSION STATUS   : ESTABLISHED AT Tue Oct 10 19:55:40 EDT 2006
SESSION ID     : ISID 00023d000001 TSIH c00
*********************************************************************
TARGET NAME     : iqn.2006-01.com.openfiler:rac1.asm3
TARGET ALIAS    :
HOST ID       : 1
BUS ID       : 0
TARGET ID       : 0
TARGET ADDRESS   : 192.168.2.195:3260,1
SESSION STATUS   : ESTABLISHED AT Tue Oct 10 19:55:40 EDT 2006
SESSION ID     : ISID 00023d000001 TSIH b00
*********************************************************************
TARGET NAME     : iqn.2006-01.com.openfiler:rac1.asm2
TARGET ALIAS    :
HOST ID       : 2
BUS ID       : 0
TARGET ID       : 0
TARGET ADDRESS   : 192.168.2.195:3260,1
SESSION STATUS   : ESTABLISHED AT Tue Oct 10 19:55:40 EDT 2006
SESSION ID     : ISID 00023d000001 TSIH d00
*********************************************************************
TARGET NAME     : iqn.2006-01.com.openfiler:rac1.asm1
TARGET ALIAS    :
HOST ID       : 3
BUS ID       : 0
TARGET ID       : 0
TARGET ADDRESS   : 192.168.2.195:3260,1
SESSION STATUS   : ESTABLISHED AT Tue Oct 10 19:55:40 EDT 2006
SESSION ID     : ISID 00023d000001 TSIH e00
*********************************************************************
TARGET NAME     : iqn.2006-01.com.openfiler:rac1.crs
TARGET ALIAS    :
HOST ID       : 4
BUS ID       : 0
TARGET ID       : 0
TARGET ADDRESS   : 192.168.2.195:3260,1
SESSION STATUS   : ESTABLISHED AT Tue Oct 10 19:55:40 EDT 2006
SESSION ID     : ISID 00023d000001 TSIH f00
*********************************************************************

使用从本地 SCSI ID 到 iSCSI 目标的主机 ID / LUN 以及 iSCSI 目标名称到 SCSI ID 的映射信息,我们可以为主机 linux1 生成从 SCSI 目标名称到本地 SCSI 设备名称的完整映射:

在 iSCSI 卷上创建分区

接下来的步骤是在每个 iSCSI 卷上创建一个跨整个卷大小的主分区。正如本文前面提到的那样,我将使用 Oracle 的集群文件系统第 2 版 (OCFS2) 存储供 Oracle 集群件软件共享的两个文件。然后,我们将使用自动存储管理 (ASM) 创建四个 ASM 卷;其中,两个用于所有物理数据库文件(数据/索引文件、联机重做日志文件和控制文件),另两个用于闪回恢复区(RMAN 备份和归档重做日志文件)。

下表列出了五个 iSCSI 卷及其支持的文件系统:

如上表所示,我们需要在每个 iSCSI 卷上创建一个 Linux 主分区。fdisk 命令在 Linux 中用于创建(和删除)分区。对于每个 iSCSI 卷,您都可以在创建主分区时使用默认值,因为默认操作是使用整个磁盘。您可以安全地忽略指出设备未包含有效 DOS 分区(或 Sun、SGI 或 OSF 磁盘标签)的任何警告。

就本示例而言,我将从 linux1 运行 fdisk 命令,以便为上一部分中标识的每个本地 SCSI 设备创建一个主分区:

  • /dev/sda
  • /dev/sdb
  • /dev/sdc
  • /dev/sdd
  • /dev/sde

请注意,要在每个 iSCSI 卷上创建分区,只能从 Oracle RAC 集群中的一个节点上运行!

# ---------------------------------------

# fdisk /dev/sda
Command (m for help): n
Command action
  e extended
  p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-15134, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134

Command (m for help): p

Disk /dev/sda: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot  Start   End   Blocks    Id   System
 /dev/sda1    1    15134  121563823+  83    Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# ---------------------------------------

# fdisk /dev/sdb
Command (m for help): n
Command action
  e extended
  p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-15134, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134

Command (m for help): p

Disk /dev/sdb: 124.4 GB, 124486942720 bytes
 255 heads, 63 sectors/track, 15134 cylinders
 Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
 /dev/sdb1 1 15134 121563823+ 83 Linux

Command (m for help): w
 The partition table has been altered!

Calling ioctl() to re-read partition table.
 Syncing disks.

# ---------------------------------------

# fdisk /dev/sdc
Command (m for help): n
Command action
  e extended
  p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-15134, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134

Command (m for help): p

Disk /dev/sdc: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdc1 1 15134 121563823+ 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# ---------------------------------------

# fdisk /dev/sdd
Command (m for help): n
Command action
  e extended
  p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-1009, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-1009, default 1009): 1009

Command (m for help): p

Disk /dev/sdd: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = cylinders of 4154 * 512 = 2126848 bytes

Device Boot Start End Blocks Id System
/dev/sdd1 1 1009 2095662 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# ---------------------------------------

# fdisk /dev/sde
Command (m for help): n
Command action
  e extended
  p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-15134, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134

Command (m for help): p

Disk /dev/sde: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 15134 121563823+ 83 Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

# ---------------------------------------

在创建所有必要分区之后,现在应以“root”用户帐户从集群的两个 Oracle RAC 节点使用以下命令将分区的更改情况通知给内核:

# partprobe

# 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: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 15134 121563823+ 83 Linux

Disk /dev/sdb: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 15134 121563823+ 83 Linux

Disk /dev/sdc: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sdc1 1 15134 121563823+ 83 Linux

Disk /dev/sdd: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = cylinders of 4154 * 512 = 2126848 bytes

Device Boot Start End Blocks Id System
/dev/sdd1 1 1009 2095662 83 Linux

Disk /dev/sde: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sde1 1 15134 121563823+ 83 Linux

 返回首页

11. 创建“oracle”用户和目录

 在集群中的两个 Oracle RAC 节点上执行以下任务!

您将使用 OCFS2 存储 Oracle 集群件软件需要共享的文件。在使用 OCFS2 时,集群中的两个 Oracle RAC 节点上的 UNIX 用户 oracle 的 UID 和 UNIX 组 dba 的 GID 必须相同。如果 UID 或 GID 不同,则 OCFS2 文件系统中的文件将显示为“unowned”,甚至可能由其他用户所拥有。对于本文而言,oracle UID 使用 175,dba GID 使用 115。

创建 Oracle 的组和用户

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

# mkdir -p /u01/app
# groupadd -g 115 dba
# groupadd -g 116 oinstall
# 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

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

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

为 oracle 用户帐户创建登录脚本

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

 返回首页

12. 为 Oracle 配置 Linux 服务器

 在集群中的两个 Oracle RAC 节点上执行以下配置过程!

每次引导算机时,都需要在集群中的两个 Oracle RAC 节点上定义本节讨论的内核参数。本节提供了设置 Oracle 必需的那些内核参数的详细信息。第 15 节(“用于所有 Oracle RAC 节点的所有启动命令”)中包含有关如何将这些命令置于启动脚本 (/etc/sysctl.conf) 中的说明。

概述

本节集中讨论了针对 Oracle10g RAC 安装配置两台 Oracle RAC Linux 服务器的步骤。这包括验证足够的交换空间、设置共享内存和信号、设置文件句柄的最大数量、设置 IP 本地端口范围、设置对 oracle 用户的 shell 限制、激活系统的所有内核参数,以及如何验证两个集群节点的日期和时间是否正确。

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

对交换空间的考虑因素

  • 安装 Oracle10g 第 2 版至少需要 512MB 内存。(注意:安装期间交换容量不足会导致 Oracle Universal Installer“挂起”或“死机”)
  • 要检查您已经具有的内存容量,键入:
    # cat /proc/meminfo | grep MemTotalMemTotal: 1034180 kB
  • 要检查您已经分配的交换容量,键入:
    # cat /proc/meminfo | grep SwapTotalSwapTotal: 2031608 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/shmmax33554432
  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/shmmni4096
  SHMMNI 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。

  设置 SHMALL

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

 ceil(SHMMAX/PAGE_SIZE)
  SHMALL 的默认大小为 2097152,并可以使用以下命令进行查询:
  # cat /proc/sys/kernel/shmall2097152
  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/sem250 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 -or- (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-max102563
 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-nr825 0 65536
 file-nr 文件显示了三个参数:分配的文件句柄总数、当前使用的文件句柄数以及可以分配的最大文件句柄数。
 (注意:如果需要增大 /proc/sys/fs/file-max 中的值,请确保正确设置 ulimit。对于 2.4.20,通常将其设置为 unlimited。使用 ulimit 命令验证 ulimit 设置:

# ulimitunlimited

 设置 IP 本地端口范围

配置系统,使本地端口范围为 1024 至 65000。

使用以下命令确定 ip_local_port_range 的值:

# cat /proc/sys/net/ipv4/ip_local_port_range32768 61000
 ip_local_port_range 的默认值是从 32768 到 61000 的端口。Oracle 建议的本地端口范围是 1024 到 65000。

可以通过使用以下命令直接修改 /proc 文件系统 (/proc/sys/net/ipv4/ip_local_port_range),以更改本地端口范围的默认设置,而不必重新引导计算机:
 # sysctl -w net.ipv4.ip_local_port_range="1024 65000"
 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
 # echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf

 为 Oracle 用户设置 Shell 限制

要改善 Linux 系统上的软件性能,Oracle 建议您提高 oracle 用户的 shell 限制:

Shell 限制
limits.conf 中的条目 硬限制
最大打开文件描述符数 nofile 65536
可用于单个用户的最大进程数 nproc 16384

要进行这些更改,以 root 用户身份运行以下命令:

cat >> /etc/security/limits.conf <<EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF

cat >> /etc/pam.d/login <<EOF
session required /lib/security/pam_limits.so
EOF

为“oracle”UNIX 帐户更新默认的 shell 启动文件。

对于 Bourne、Bash 或 Korn shell,通过运行以下命令将以下行添加到 /etc/profile 文件:
 cat >> /etc/profile <<EOF
 if [ \$USER = "oracle" ]; then
 if [ \$SHELL = "/bin/ksh" ]; then
 ulimit -p 16384 ulimit -n 65536
 else ulimit -u 16384 -n 65536
 fi
 umask 022
 fi
 EOF


 对于 C shell(csh 或 tcsh),通过运行以下命令将以下行添加到 /etc/csh.login 文件:
 cat >> /etc/csh.login <<EOF
 if ( \$USER == "oracle" ) then
  limit maxproc 16384
  limit descriptors 65536
 endif
 EOF


 激活系统的所有内核参数

此时,我们已经包含了成功进行 Oracle 安装和配置所需的所有 Linux 内核参数。在以上每一部分中,我们对 Linux 系统进行了配置,将所有内核参数置于 /etc/sysctl.conf 文件中以将其保存在系统启动上。

现在,我们可以重新启动以确保所有这些参数在内核中进行设置,或者,我们只需通过以 root 用户身份运行以下命令来“运行”/etc/sysctl.conf 文件。请在集群的每一个节点上执行该操作!

# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_max = 262144
kernel.shmmax = 2147483648
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

 在所有的集群节点上设置正确的日期和时间

在安装 Oracle 集群件、数据库以及随附 CD 期间,Oracle Universal Installer (OUI) 将首先安装运行该安装程序的本地节点(即 linux1)的软件。然后,将该软件以远程方式复制到集群中的其余节点(即 linux2)。在远程复制过程中,OUI 将在每个远程节点上执行 UNIX“tar”命令,以提取进行了存档和复制的文件。如果执行安装的节点上的日期和时间大于其要进行复制的节点上的日期和时间,那么 OUI 将在“tar”中引发一个错误,以指示其在试图提取带有时间戳的文件时失败。

Error while copying directory
  /u01/app/oracle/product/crs with exclude file list 'null' to nodes 'linux2'.
 [PRKC-1002 : All the submitted commands did not execute successfully]
---------------------------------------------
 linux2:
  /bin/tar: ./bin/lsnodes: time stamp 2006-09-13 09:21:34 is 735 s in the future
  /bin/tar: ./bin/olsnodes: time stamp 2006-09-13 09:21:34 is 735 s in the future
  ...(more errors on this node)

请注意,尽管这看起来像 OUI 中一个严重的错误,但您完全可以将其看作是一个警告而忽略。“tar”命令 DOES 确实提取了文件;然而,当您在远程节点上执行文件列表时(使用 ls -l),它们将缺少时间字段,直到服务器上的时间大于该文件的时间戳。

在启动以上任何一个所述安装之前,确保尽可能将集群的每个成员节点设置为相同的时间和日期。由于两个 Oracle RAC 节点使用相同的参考 Network Time Protocol 服务器,因此 Oracle 强烈建议使用多数操作系统的 Network Time Protocol 功能来执行该操作。

然而,访问 Network Time Protocol 服务器并非始终可用。在这种情况下,为集群中的节点手动设置日期和时间,确保要从其中执行软件安装的节点 (linux1) 的时间和日期小于集群中所有其他节点 (linux2)。我一般使二者之间相差 20 秒,如以下示例所示:

设置 linux1 的日期和时间:

# date -s "9/13/2006 23:00:00"

设置 linux2 的日期和时间:

# date -s "9/13/2006 23:00:20"

本文中所述的双节点 RAC 配置没有使用 Network Time Protocol 服务器。

 返回首页

 13. 配置 hangcheck-timer 内核模块
 在集群中的两个 Oracle RAC 节点上执行以下配置过程!

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 AS 包含在一起。hangcheck-timer 应当已包含在内。使用以下命令来确认您已经包含了该模块:

# find /lib/modules -name "hangcheck-timer.ko"/lib/modules/2.6.9-42.EL/kernel/drivers/char/hangcheck-timer.ko
在以上输出中,我们关注的是 /lib/modules/2.6.9-42.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 节点必须挂起的时长。当以下条件为真时将会重置节点:
system hang time > (hangcheck_tick + hangcheck_margin)

 配置 Hangcheck 内核模块参数

 每次加载 hangcheck-timer 内核模块(手动加载或由 Oracle 加载)时,它都需要知道对我们刚刚讨论的两个参数(hangcheck-tick 和 hangcheck-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 内核模块的 modprobe 或 insmod。

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

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

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

(注意:您不必在每次重新引导后使用 modprobe 或 insmod 手动加载 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
Oct 10 19:56:24 linux1 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds).Oct 10 19:56:24 linux1 kernel: Hangcheck: Using monotonic_clock().

 返回首页

14. 为远程访问配置 RAC 节点

 在集群中的两个 Oracle RAC 节点上执行以下配置过程!

在可以安装并使用 Oracle 真正应用集群之前,您必须为所有集群节点上的“oracle”UNIX 用户帐户配置安全 shell (RSH) 或远程 shell (RSH)。此处的目的是为“oracle”UNIX 用户帐户设置用户等效性。利用用户等效性 (User equivalence),“oracle”UNIX 用户帐户无需口令就可访问集群中的所有其他节点(运行命令和复制文件)。使用 SSH 或 RSH(其中 SSH 是首选方法)都可实现此配置。Oracle 在 10g 第 1 版中增加了将 SSH 工具套件用于设置用户等效项的支持。在 Oracle10g 之前,用户等效性必须使用远程 shell 进行配置。

注意,如果 10g 中的 Oracle Universal Installer 没有检测出存在安全 shell 工具(ssh 和 scp),那么它将尝试使用远程 shell 工具(rsh 和 rcp)。

那么,我们为什么必须设置用户等效性?安装 Oracle 集群件和 Oracle 数据库软件只在 RAC 集群中的一个节点上进行。在特定节点上运行 Oracle Universal Installer (OUI) 时,它将使用 ssh 和 scp 命令(如果使用远程 shell,则用 rsh 和 rcp 命令)在集群内的所有其他节点上运行远程命令并向这些节点复制文件(Oracle 软件)。运行 OUI (runInstaller) 的节点上的“oracle”UNIX 用户帐户必须受到您的 RAC 集群中其他所有节点的信任。这意味着,相对于集群中的所有其他 Linux 服务器,您必须能够在要从其中运行 OUI 的 Linux 服务器上运行安全 shell 命令(ssh 或 scp)或远程 shell 命令(rsh 和 rcp),而不会收到输入口令的提示。

注意,普通 RAC 操作无需使用安全 shell 或远程 shell。然而,对于 RAC 和补丁集安装以及创建集群数据库时,必须启用该配置。

第一步是确定使用哪种远程访问方法 — 安全 shell 还是远程 shell。二者各有利弊。例如,远程 shell 非常易于安装和配置。它的构造只需很少的几步,并当登录到受信任的节点(要从其中执行安装的节点)后,其在终端会话中始终可用。然而,在安装和任何修补过程中,到远程节点的连接不安全。另一方面,安全 shell 可在安装和修补时提供安全连接,但是设置步骤繁琐。此外,每次 oracle 用户登录到受信任的节点后,都需要在终端会话中启用该方法。官方 Oracle 文档仅给出了设置安全 shell 的步骤,并将其作为首选方法。

在以下两个部分对于配置用户等效性的这两种方法进行了介绍:

使用安全 Shell 方法
 使用远程 Shell 方法

使用安全 Shell 方法

  本部分将介绍如何配置 OpenSSH 版本 3。
  要确定是否 SSH 已安装并运行,可输入以下命令:

 # pgrep sshd2808
  如果 SSH 正在运行,那么该命令的响应将是一个进程 ID 编号(一个或多个)列表。请在集群中的两个 Oracle RAC 节点上运行该命令,以验证 SSH 后台程序已安装并正在运行!

 要了解更多有关 SSH 的信息,请参阅以下 man 页:
  # man ssh

在两个 Oracle RAC 节点上创建 RSA 和 DSA 密钥

  配置 SSH 的第一步是在集群中的两个 Oracle RAC 节点上创建 RSA 和 DSA 密钥对。执行该操作的命令将为 RSA 和 DSA 各创建一个公共密钥和一个私有密钥(每个节点总共 4 个密钥)。然后,需要将 RSA 和 DSA 公共密钥的内容复制到一个授权密钥文件 中,之后将该文件分发到集群中的两个 Oracle RAC 节点。

  使用以下步骤创建 RSA 和 DSA 密钥对。请注意,集群中的两个 Oracle RAC 节点上均需要完成这些步骤:

1.以“oracle”UNIX 用户帐号进行登录。
  # su - oracle

2.如果必要,在“oracle”用户的主目录中创建 .ssh 目录,并在其上设置正确的权限:
  $ mkdir -p ~/.ssh
  $ chmod 700 ~/.ssh

3.输入以下命令,为版本 3 的 SSH 协议生成 RSA 密钥对(公共密钥和私有密钥):
  $ /usr/bin/ssh-keygen -t rsa

在提示符下:

  接受针对密钥文件的默认位置。
  输入并确认口令短语。该口令应当与“oracle”UNIX 用户帐户口令不同,但这不是必需的。

该命令会将公共密钥写入 ~/.ssh/id_rsa.pub 文件,将私有密钥写入 ~/.ssh/id_rsa 文件。注意,始终不要将密钥分发给任何人!


4.输入以下命令,为版本 3 的 SSH 协议生成 DSA 密钥对(公共密钥和私有密钥):
$ /usr/bin/ssh-keygen -t dsa
在提示符下:
接受针对密钥文件的默认位置。
输入并确认口令短语。该口令应当与“oracle”UNIX 用户帐户口令不同,但这不是必需的。
该命令会将公共密钥写入 ~/.ssh/id_dsa.pub 文件,将私有密钥写入 ~/.ssh/id_dsa 文件。注意,始终不要将密钥分发给任何人!

5.为集群中的两个 Oracle RAC 节点重复以上步骤。
现在,每个 Oracle RAC 节点都包含用于 RSA 和 DSA 的公共和私有密钥,您需要在其中一个节点上创建一个授权密钥文件。授权密钥文件只是一个包含每个人(每个节点)的 RSA 和 DSA 公共密钥的文件。在授权密钥文件包含了所有公共密钥后,将其分发至集群中的所有其他节点。

在集群中的其中一个节点上完成以下步骤,然后分发授权密钥文件。考虑到本文的目的,我将使用 linux1:

1.首先,确定该节点上是否已经存在授权密钥文件 (~/.ssh/authorized_keys)。在多数情况下,该文件是不存在的,因为本文假设您使用的是新安装。如果该文件不存在,那么现在开始创建:
$ touch ~/.ssh/authorized_keys$ cd ~/.ssh$ ls -l *.pub-rw-r--r-- 1 oracle dba 603 Aug 31 23:40 id_dsa.pub-rw-r--r-- 1 oracle dba 223 Aug 31 23:36 id_rsa.pub
以上的列表应当显示前一部分中创建的 id_rsa.pub 和 id_dsa.pub 公共密钥。

2.在该步骤中,使用 SSH 将 ~/.ssh/id_rsa.pub 和 ~/.ssh/id_dsa.pub 公共密钥的内容从集群中的两个 Oracle RAC 节点复制到刚才创建的授权密钥文件中 (~/.ssh/authorized_keys)。同样,我将通过 linux1 进行操作。系统将提示您为每个访问的 Oracle RAC 节点输入“oracle”UNIX 用户帐户口令。注意,在使用 SSH 访问您所在的节点 (linux1) 时,第一次将提示输入“oracle”UNIX 用户帐户口令。第二次尝试访问该节点时,将提示输入用于解锁私有密钥的口令短语。对于任何其他节点,系统将始终询问“oracle”UNIX 用户帐户口令。
以下示例将从 linux1 运行,假设这是个双节点集群,即节点 linux1 和 linux2:

$ ssh linux1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keysThe authenticity of host 'linux1 (192.168.1.100)' can't be established.RSA key fingerprint is 61:8a:f9:9e:28:a2:b7:d3:70:8d:dc:76:ca:d9:23:43.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 'linux1,192.168.1.100' (RSA) to the list of known hosts.oracle@linux1's password: xxxxx$ ssh linux1 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keysEnter passphrase for key '/u01/app/oracle/.ssh/id_rsa': xxxxx$ ssh linux2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keysThe authenticity of host 'linux2 (192.168.1.101)' can't be established.RSA key fingerprint is 84:2b:bd:eb:31:2c:23:36:55:c2:ee:54:d2:23:6a:e4.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added 'linux2,192.168.1.101' (RSA) to the list of known hosts.oracle@linux2's password: xxxxx$ ssh linux2 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keysoracle@linux2's password: xxxxx
注意:第一次使用 SSH 从特定系统连接到节点时,您可能会看见一条类似下面的消息:
The authenticity of host 'linux1 (192.168.1.100)' can't be established.RSA key fingerprint is 61:8a:f9:9e:28:a2:b7:d3:70:8d:dc:76:ca:d9:23:43.Are you sure you want to continue connecting (yes/no)? yes
在提示符下输入 yes 进行确认。如果从该系统连接到相同的节点,您将不会再次看到该消息。

3.此时,在 linux1 上,我们在授权密钥文件 (~/.ssh/authorized_keys) 中获得了来自集群中各个节点的 RSA 和 DSA 公共密钥内容。我们现在将其复制到集群中的其余节点。在这个双节点集群示例中,唯一剩下的节点就是 linux2。使用 scp 命令将授权密钥文件复制到集群中的其余所有节点:
$ scp ~/.ssh/authorized_keys linux2:.ssh/authorized_keysoracle@linux2's password: xxxxxauthorized_keys 100% 1652 1.6KB/s 00:00

4.通过登录到节点并运行以下命令,为集群中的两个 Oracle RAC 节点更改授权密钥文件的权限:
$ chmod 600 ~/.ssh/authorized_keys

5.此时,如果在另一个节点上使用 ssh 登录或运行命令,则会提示您输入在创建 DSA 密钥时指定的口令短语。例如,在 linux1 中测试以下内容:
$ ssh linux1 hostnameEnter passphrase for key '/u01/app/oracle/.ssh/id_rsa': xxxxxlinux1$ ssh linux2 hostnameEnter passphrase for key '/u01/app/oracle/.ssh/id_rsa': xxxxxlinux2
注意:如果除主机名外,您还看到任何其他消息或文本,则 Oracle 安装可能失败了。进行必要的更改,以确保您在输入这些命令时只有主机名显示。您应当确保修改生成任何输出或询问任何问题的登录脚本(一个或多个)的任何部分,以便它们仅当 shell 是交互式 shell 时生效。

为当前 Shell 会话启用 SSH 用户等效性

 运行 OUI 时,需要不用提示输入口令短语就可运行安全 shell 工具命令(ssh 和 scp)。尽管集群中的两个 Oracle RAC 节点上都配置了 SSH,使用安全 shell 工具命令时仍会提示输入口令短语。因此,在运行 OUI 之前,您需要为打算从其中运行 OUI 的终端会话启用用户等效性。考虑到本文目的,所有 Oracle 安装都将在 linux1 中进行。

在尝试运行 OUI 之前,需要在任何新的终端 shell 会话中启用用户等效性。如果您注销并又重新登录将从其中执行 Oracle 安装的节点,那么您必须为终端 shell 会话启用启用用户等效性,因为这不是默认设置。

要为当前终端 shell 会话启用用户等效性,执行以下步骤:

1.以“oracle”UNIX 用户帐户登录希望从其中运行 OUI 的节点 (linux1)。
# su - oracle

2.输入以下命令:
$ exec /usr/bin/ssh-agent $SHELL$ /usr/bin/ssh-addEnter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxxIdentity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)
在提示符下,为生成的每个密钥输入口令短语。

3.如果 SSH 配置正确,您将能够从该终端对话使用 ssh 和 scp 命令,而无需提供口令或口令短语。
$ ssh linux1 "date;hostname"Wed Sep 13 17:35:30 EDT 2006linux1$ ssh linux2 "date;hostname"Wed Sep 13 17:36:14 EDT 2006linux2
注意:以上命令应显示两个 Oracle RAC 节点上设置的日期及其主机名。如果任何节点提示输入口令或口令短语,则验证位于该节点上的 ~/.ssh/authorized_keys 文件是否包含正确的公共密钥。此外,如果除日期和主机名外,您还看到其他任何消息或文本,则 Oracle 安装可能失败了。进行必要的更改,以确保您在输入这些命令时只有日期显示。您应当确保修改生成任何输出或询问任何问题的登录脚本(一个或多个)的任何部分,以便它们仅当 shell 是交互式 shell 时生效。

4.Oracle Universal Installer 是一个 GUI 接口,要求使用 X 服务器。在启用了用户等效性的终端会话中(您将从其中执行 Oracle 安装的节点),将环境变量 DISPLAY 设置为有效的 X 窗口显示:
Bourne、Korn 和 Bash shell:

$ DISPLAY=<Any X-Windows Host>:0$ export DISPLAY
C shell:
$ setenv DISPLAY <Any X-Windows Host>:0
将 DISPLAY 变量设置为有效的 X 窗口显示后,您应当执行当前终端会话的另一个测试,以确保 X11 forwarding 没有启用:
$ ssh linux1 hostnamelinux1$ ssh linux2 hostnamelinux2
注意:如果您使用远程客户端来连接到执行安装的节点,则会看到类似下面的消息:"Warning:No xauth data; using fake authentication data for X11 forwarding.”,这意味着您的授权密钥文件配置正确,但是,您的 SSH 配置启用了 X11 forwarding。例如:
$ export DISPLAY=melody:0$ ssh linux2 hostnameWarning: No xauth data; using fake authentication data for X11 forwarding.linux2
注意,启用 X11 Forwarding 将导致 Oracle 安装失败。要纠正这个问题,需为禁用 X11 Forwarding 的“oracle”UNIX 用户帐户创建一个用户级 SSH 客户端配置文件:

使用文本编辑器,编辑或创建文件 ~/.ssh/config
确保 ForwardX11 属性设为 no。例如,将以下内容插入 ~/.ssh/config file:
Host * ForwardX11 no

5.您必须从该终端会话运行 Oracle Universal Installer,或记住在从不同终端会话启动 Oracle Universal Installer 之前,重复这些步骤(该部分的步骤 2、3 和 4)以启用用户等效性。

移除所有 stty 命令
 在安装 Oracle 软件时,系统上任何包含 stty 命令的隐藏文件(即 .bashrc、.cshrc、.profile)都将导致安装过程失败。
要避免该问题,您必须修改这些文件以取消所有关于 STDERR 的输出,如下所示:

Bourne、Bash 或 Korn shell:
if [ -t 0 ]; then stty intr ^Cfi

C shell:
test -t 0if ($status == 0) then stty intr ^Cendif
注意:如果由远程 shell 加载的隐藏文件包含 stty 命令,则 OUI 将指示错误并停止安装。

 使用远程 Shell 方法


 在多数 Linux 系统上,远程 shell 提供的服务默认为禁用。本部分将介绍启用并配置用户等效性所需的任务,以供 Oracle Universal Installer、运行命令时以及使用远程 shell 工具复制到集群中远程节点的文件使用。目的是使 Oracle Universal Installer 能够使用 rsh 和 rcp 来运行命令,以及不用提供口令就可将文件复制到远程节点。请注意,使用远程 shell 方法来配置用户等效性不安全。
rsh 后台程序使用位于用户(oracle 的)主目录中的 /etc/hosts.equiv 文件或 .rhosts 文件验证用户。

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

# rpm -q rsh rsh-serverrsh-0.17-25.4rsh-server-0.17-25.4
根据以上信息,我们可以确认已经安装了 rsh 和 rsh-server。如果未安装 rsh,则可以从 RPM 所在的 CD 中运行以下命令:
# su -# rpm -ivh rsh-0.17-25.4.i386.rpm rsh-server-0.17-25.4.i386.rpm
要启用“rsh”和“rlogin”服务,必须将 /etc/xinetd.d/rsh 文件中的“disable”属性设置为“no”并且必须重新加载 xinetd。这可通过在集群中的所有节点上运行以下命令来完成:

# su -# chkconfig rsh on# chkconfig rlogin on# service xinetd reloadReloading 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 节点添加到集群中类似于以下示例的两个 Oracle RAC 节点的 /etc/hosts.equiv 文件中:
# cat /etc/hosts.equiv+linux1 oracle+linux2 oracle+linux1-priv oracle+linux2-priv 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 linux1-priv 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:45 /etc/hosts.equiv$ rsh linux2-priv ls -l /etc/hosts.equiv-rw------- 1 root root 68 Sep 27 23:45 /etc/hosts.equiv
与使用安全 shell 不同,不需要用其他操作或命令来启用用户等效性以使用远程 shell。在成功登录终端会话后,用户等效性将针对“oracle”UNIX 用户帐户启用。

 返回首页

  15. 适用于这两个 Oracle RAC 节点的所有启动命令


 验证以下启动命令都包含在集群中的两个 Oracle RAC 节点上!

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

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

/etc/modprobe.conf

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

alias eth0 b44alias eth1 tulipalias snd-card-0 snd-intel8x0options snd-card-0 index=0alias usb-controller ehci-hcdalias usb-controller1 uhci-hcdoptions hangcheck-timer hangcheck_tick=30 hangcheck_margin=180

/etc/sysctl.conf

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

# 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

# +---------------------------------------------------------+
# | LOCAL IP RANGE |
# ----------------------------------------------------------+
net.ipv4.ip_local_port_range=1024 65000
/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 linux1192.168.1.101 linux2# Private Interconnect - (eth1)192.168.2.100 linux1-priv192.168.2.101 linux2-priv# Public Virtual IP (VIP) addresses for - (eth0)192.168.1.200 linux1-vip192.168.1.201 linux2-vip192.168.1.106 melody192.168.1.102 alex192.168.1.105 bartman
/etc/hosts.equiv

(/etc/hosts.equiv 文件仅在使用远程 shell 方法建立远程访问和用户等效性时需要。使用远程 shell 方法启用用户等效性后,无需提供口令就可以 oracle 用户帐户登录各个 Oracle RAC 节点。)

+linux1 oracle+linux2 oracle+linux1-priv oracle+linux2-priv 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

 返回首页

 16. 安装和配置 Oracle 集群文件系统 (OCFS2)
 应在集群中的这两个 Oracle RAC 节点上执行本节中的大多数配置过程!但创建 OCFS2 文件系统应只在 RAC 集群中的一个节点上执行。

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

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

在本指南中,您将使用最新版本的 OCFS2(截至本文发稿时止,最新版本为 OCFS2 1.2.3-1 版)来存储 Oracle Clusterware 软件共享所需的两个文件。除了这两个文件以外,您还将使用此空间存储所有 Oracle RAC 实例的共享 SPFILE。

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

下载 OCFS2

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

从最新的 OCFS2 内核模块(驱动程序)开始,下载相应的 RPM。对于 CentOS 4.4 Enterprise Linux,我使用的是内核版本 2.6.9-42.EL。相应的 OCFS2 内核模块位于截至本文发稿时止的最新发布的 OCFS2 中(OCFS2 1.2.3-1 版)。适用于 Linux 内核 2.6.9-42.EL 的 OCFS2 内核模块如下所列。始终下载与发布版本、平台、内核版本以及内核风格(smp、hugemem、psmp 等)相匹配的最新 OCFS2 内核模块。

ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm —(适用于单处理器)

ocfs2-2.6.9-42.ELsmp-1.2.3-1.i686.rpm —(适用于多处理器)

ocfs2-2.6.9-42.ELhugemem-1.2.3-1.i686.rpm —(适用于 hugemem)

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

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

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

如果您不确定所需的 OCFS2 驱动程序版本,则使用与您的内核版本匹配的 OCFS2 版本。要确定您的内核版本,执行以下命令:

$ uname -aLinux linux1 2.6.9-42.EL #1 Sat Aug 12 09:17:58 CDT 2006 i686 i686 i386 GNU/Linux
如果字符串“EL”之后不存在字符串“smp”,则表示您正在单处理器 (Uniprocessor) 计算机上运行。如果显示字符串“smp”,则表示您正在多处理

计算机上运行。
安装 OCFS2

我将把 OCFS2 文件安装到两台单处理器计算机中。安装过程只需要您以 root 用户帐户在集群中的所有 Oracle RAC 节点上运行以下命令即可:

$ su -
# rpm -Uvh ocfs2-2.6.9-42.EL-1.2.3-1.i686.rpm \
ocfs2console-1.2.1-1.i386.rpm \
ocfs2-tools-1.2.1-1.i386.rpm
Preparing... ########################################### [100%]
1:ocfs2-tools ########################################### [ 33%]
2:ocfs2-2.6.9-42.EL ########################################### [ 67%]
3:ocfs2console ########################################### [100%]
禁用 SELinux(RHEL4 U2 以及更高版本)

向 RHEL4 U2 以及更高版本(CentOS 4.4 基于 RHEL4 U2)的用户提供一个建议,即 OCFS2 当前无法在启用 SELinux 的情况下运行。如果您使用的是 RHEL4 U2 或更高版本(由于我们使用的是 CentOS 4.4,因此我们也包括在内),则您需要禁用 SELinux(使用工具 system-config-securitylevel)才能执行 O2CB 服务。

要禁用 SELinux,运行“Security Level Configuration”GUI 实用程序:

# /usr/bin/system-config-securitylevel &

这将显示以下屏幕:

图 13 Security Level Configuration 打开屏幕

现在,单击 SELinux 选项卡并取消选中“Enabled”复选框。单击 [OK] 后,将显示一个警告对话框。只需单击“Yes”确认该警告。禁用 SELinux 选项后,屏幕现在应如下所示:


  图 14 SELinux 禁用

在集群中的两个 Oracle RAC 节点上进行此更改后,将需要重新引导每个节点以实施更改:在继续配置 OCFS2 之前,必须禁用 SELinux!

# init 6
配置 OCFS2

下一步是在集群中的两个 Oracle RAC 节点上生成和配置 /etc/ocfs2/cluster.conf 文件。完成此操作最简单的方法是运行 GUI 工具 ocfs2console。在本节中,我们不但使用 ocfs2console 创建和配置 /etc/ocfs2/cluster.conf 文件,而且还创建和启动集群堆栈 O2CB。如果 /etc/ocfs2/cluster.conf 文件不存在(本示例中便是这种情况),ocfs2console 工具将创建该文件以及一个默认集群名为 ocfs2 的新集群堆栈服务 (O2CB)。您将需要以 root 用户帐户在集群中的两个 Oracle RAC 节点上执行该操作:

$ su -# ocfs2console &

这将显示如下所示的 GUI:

图 15 ocfs2console GUI

使用 ocfs2console GUI 工具执行以下步骤:

选择 [Cluster] -> [Configure Nodes...]。这将启动 OCFS2 集群堆栈(图 16)并显示“Node Configuration”对话框。
在“Node Configuration”对话框上,单击 [Add] 按钮。
这将显示“Add Node”对话框。
在“Add Node”对话框中,输入集群中第一个节点的 Host name 和 IP address。将 IP Port 设置为默认值 7777。在我的示例中,我添加了两个节点,即使用 linux1 / 192.168.1.100 表示第一个节点,并使用 linux2 / 192.168.1.101 表示第二个节点。
单击“Node Configuration”对话框上的 [Apply] — 所有节点现在将处于“Active”状态,如图 17 所示。
单击“Node Configuration”对话框上的 [Close]。
确认所有值均正确后,使用 [File] -> [Quit] 退出应用程序。需要在集群的两个 Oracle RAC 节点上执行该操作。

图 16 启动 OCFS2 集群堆栈

以下对话框显示了节点 linux1 和 linux2 的 OCFS2 设置:

图 17 为 OCFS2 配置节点

退出 ocfs2console 后,将获得一个类似如下所示的 /etc/ocfs2/cluster.conf。需要在集群中的两个 Oracle RAC 节点上完成该过程,并且所有节点的 OCFS2 配置文件必须完全相同:

node: ip_port = 7777 ip_address = 192.168.1.100 number = 0 name = linux1 cluster = ocfs2node: ip_port = 7777 ip_address = 192.168.1.101 number = 1 name = linux2 cluster = ocfs2cluster: node_count = 2 name = ocfs2
O2CB 集群服务

在使用 OCFS2 执行任何操作(如格式化或挂载文件系统)之前,我们需要先运行 OCFS2 的集群堆栈 O2CB(它将是以上执行的配置过程的结果)。此堆栈包含以下服务:

NM:用于跟踪 cluster.conf 中的所有节点的节点管理器
HB:当节点加入或离开集群时向上/向下发出通知的心跳服务
TCP:处理节点之间的通信
DLM:用于跟踪所有锁、这些锁的所有者和状态的分布式锁管理器
CONFIGFS:在 /config 中挂载的用户空间驱动的配置文件系统
DLMFS:用户空间与内核空间 DLM 的接口
已将以上所有集群服务打包到 o2cb 系统服务 (/etc/init.d/o2cb) 中。以下是 o2cb 系统服务的某些更有用的命令和选项的简要列表。

注意:以下命令仅用于演示目的,不应在安装和配置 OCFS2 时运行!

/etc/init.d/o2cb status
Module "configfs": Not loadedFilesystem "configfs": Not mountedModule "ocfs2_nodemanager": Not loadedModule "ocfs2_dlm": Not loadedModule "ocfs2_dlmfs": Not loadedFilesystem "ocfs2_dlmfs": Not mounted
注意,本示例未加载所有服务。我在执行“status”选项之前执行了“unload”。如果要在使用 ocfs2console 实用程序配置 OCFS2 后立即检查 o2cb 服务的状态,则将加载所有这些服务。

/etc/init.d/o2cb load
Loading module "configfs": OKMounting configfs filesystem at /config: OKLoading module "ocfs2_nodemanager": OKLoading module "ocfs2_dlm": OKLoading module "ocfs2_dlmfs": OKMounting ocfs2_dlmfs filesystem at /dlm: OK
加载所有 OCFS2 模块。

/etc/init.d/o2cb online ocfs2
Starting cluster ocfs2: OK
以上命令将使我们创建的集群 ocfs2 处于联机状态。

/etc/init.d/o2cb offline ocfs2
Unmounting ocfs2_dlmfs filesystem: OKUnloading module "ocfs2_dlmfs": OKUnmounting configfs filesystem: OKUnloading module "configfs": OK
以上命令将使我们创建的集群 ocfs2 处于脱机状态。

/etc/init.d/o2cb unload
Cleaning heartbeat on ocfs2: OKStopping cluster ocfs2: OK
以上命令将卸载所有 OCFS2 模块。
将 O2CB 配置为在引导时启动

您现在需要配置 OC2B 驱动程序的引导属性,以便在每次引导时将启动集群堆栈服务。需要在集群的所有节点上执行本节中的所有任务。


注意:OCFS2 1.2.1 之前的版本中 包含一个错误,即不会在每次引导时加载驱动程序,即使将引导属性配置为执行此操作后也是如此。OCFS2 1.2.1 版中已经修复了该错误,本文不再赘述。然而,如果您使用的是 OCFS2 1.2.1 之前的版本,请参阅疑难解答一节以获取有关该错误的变通方法。
按如下所示设置引导属性:

# /etc/init.d/o2cb offline ocfs2# /etc/init.d/o2cb unload# /etc/init.d/o2cb configureConfiguring the O2CB driver.This will configure the on-boot properties of the O2CB driver.The following questions will determine whether the driver is loaded onboot. The current values will be shown in brackets ('[]'). Hitting<ENTER> without typing an answer will keep that current value. Ctrl-Cwill abort.Load O2CB driver on boot (y/n) [n]: yCluster to start on boot (Enter "none" to clear) [ocfs2]: ocfs2Writing O2CB configuration: OKLoading module "configfs": OKMounting configfs filesystem at /config: OKLoading module "ocfs2_nodemanager": OKLoading module "ocfs2_dlm": OKLoading module "ocfs2_dlmfs": OKMounting ocfs2_dlmfs filesystem at /dlm: OKStarting cluster ocfs2: OK
格式化 OCFS2 文件系统

注意:与本节中其他任务不同,只能在 RAC 集群中的一个节点上创建 OCFS2 文件系统。我将只从 linux1 执行本节中的所有命令。

现在,我们开始使用“在 iSCSI 卷上创建分区”一节中针对 OCFS2 分区的 iSCSI 卷。

需要格外重点注意的是,此时在本文中,在对 iSCSI 卷进行分区以用于 OCFS2(如 /dev/sdd1)后,您可能已经重新引导 linux1 若干次。这意味着从 Openfiler 发现的 iSCSI 目标名映射可能与 linux1 上的本地 SCSI 设备名不同。请重复“发现 iSCSI 目标”一节中所述的过程,以确定重新引导之后是否发现 iSCSI 目标名与 linux1 上的本地 SCSI 设备名不同。

例如,在要用于 OCFS2 的 iSCSI 卷上创建主分区时,我指定 iSCSI 目标名“iqn.2006-01.com.openfiler:rac1.crs”映射到本地 SCSI 设备名 /dev/sdd。然后,在本节前面部分,我必须在禁用 SELinux 后重新引导两个节点。执行完“发现 iSCSI 目标”一节中所述的过程后,我确定“iqn.2006-01.com.openfiler:rac1.crs”现已映射到本地 SCSI 设备名 /dev/sde。这意味着我将在本节中在分区 /dev/sde1 上创建 OCFS2 文件系统!请注意,您计算机上的本地 SCSI 设备名很有可能不同。

如果 O2CB 集群处于脱机状态,则启动它。格式化操作要求集群处于联机状态,这是因为它需要确保在集群的某个节点上未挂载该卷。

在本文档的前面部分中,我们在为 OCFS2/集群件创建挂载点一节中创建了目录 /u02/oradata/orcl。本节包含用于创建和安装集群管理器 使用的文件系统 (/u02/oradata/orcl) 的命令。

注意,可以使用 GUI 工具 ocfs2console 或命令行工具 mkfs.ocfs2 创建和安装 OCFS2 文件系统。在 ocfs2console 实用程序中,使用菜单 [Tasks] - [Format]。

参见下面有关如何使用命令行工具 mkfs.ocfs2 创建 OCFS2 文件系统的说明。

为创建文件系统,我们使用 Oracle 可执行文件 mkfs.ocfs2。考虑到本示例的目的,我使用映射到 crs 的 iSCSI 卷 /dev/sde1 的本地 iSCSI 设备名,以 root 用户帐户仅从 linux1 运行以下命令。另请注意,我还指定了一个名为“oracrsfiles”的标签,可在挂载或取消挂载卷时引用:

$ su -
# mkfs.ocfs2 -b 4K -C 32K -N 4 -L oracrsfiles /dev/sde1

mkfs.ocfs2 1.2.1
Filesystem label=oracrsfiles
Block size=4096 (bits=12)
Cluster size=32768 (bits=15)
Volume size=2145943552 (65489 clusters) (523912 blocks)
3 cluster groups (tail covers 977 clusters, rest cover 32256 clusters)
Journal size=67108864
Initial number of node slots: 4
Creating bitmaps: done
Initializing superblock: done
Writing system files: done
Writing superblock: done
Formatting Journals: done
Writing lost+found: done
mkfs.ocfs2 successful
挂载 OCFS2 文件系统

现在已经创建了此文件系统,接下来我们便可以载入它了。首先,使用命令行进行挂载,然后我将介绍如何将它包含在 /etc/fstab 中以在每次引导时挂载它。

注意:需要使用 OCFS2 标签 oracrsfiles 以 root 用户帐户在 Oracle RAC 集群中的两个节点上执行文件系统挂载!

首先,此处介绍了如何从命令行手动挂载 OCFS2 文件。注意,需要以 root 用户帐户执行该操作:

$ su -# mount -t ocfs2 -o datavolume,nointr -L "oracrsfiles" /u02/oradata/orcl
如果挂载成功,您将只是获得提示。但我们应运行以下检查来确保文件系统挂载正确。

首先,使用 mount 命令确保成功挂载了新文件系统。应在 RAC 集群的两个节点上执行该操作:

# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
cartman:SHARE2 on /cartman type nfs (rw,addr=192.168.1.120)
configfs on /config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sde1 on /u02/oradata/orcl type ocfs2 (rw,_netdev,datavolume,nointr,heartbeat=local)
注意:请记下我挂载新文件系统所使用的 datavolume 选项。Oracle 数据库用户必须使用 datavolume 挂载选项安装任何将包含表决磁盘文件、集群注册表 (OCR)、数据文件、重做日志、归档日志以及控制文件的卷,以确保 Oracle 进程打开包含 o_direct 标志的文件。nointr 选项确保 I/O 不会由于信号而中断。

不应使用该挂载选项挂载任何其他类型的卷,其中包括 Oracle 主目录(本指南未使用它)。

为什么挂载卷需要花费这么长的时间?挂载一个卷大约需要 5 秒钟。它这样做是为了使心跳线程保持稳定。在以后的版本中,Oracle 计划增加对全局心跳(这将使大多数挂载瞬间完成)的支持。

将 OCFS2 配置为在启动时自动挂载

让我们了解一下到目前为止已经执行的操作。您下载并安装了 OCFS2,它将用于存储集群管理器 文件所需的文件。安装后,您将 OCFS2 模块加载到内核中,然后对集群文件系统进行了格式化。最后,您使用 OCFS2 标签“oracrsfiles”挂载了新建的文件系统。本节将逐步完成在每次使用 OCFS2 标签引导计算机时负责挂载新 OCFS2 文件系统的步骤。

首先将以下行添加到集群中两个 Oracle RAC 节点上的 /etc/fstab 文件中:

LABEL=oracrsfiles /u02/oradata/orcl ocfs2 _netdev,datavolume,nointr 0 0
注意用于挂载此文件系统的“_netdev”选项。OCFS2 卷必须使用 _netdev 挂载选项。该挂载选项指示将在网络启动后挂载该卷,在关闭网络前卸载该卷。

现在,让我们确保已经加载了 ocfs2.ko 内核模块,并确保将在引导过程中安装文件系统。

如果您遵循了本指南中的示例,则应已经启用了用于加载内核模块并安装 OCFS2 文件系统的操作。但您将仍以 root 用户帐户在集群的两个 Oracle RAC 节点上运行以下命令来检查这些选项:

$ su -# chkconfig --list o2cbo2cb 0:off 1:off 2:on 3:on 4:on 5:on 6:off
应把我以粗体标记的标志设置为“on”。
检查新 OCFS2 文件系统的权限

使用 ls 命令检查所有权。应把权限设置为 0775,并将所有者设置为“oracle”、将组设置为“dba”。

我们来先检查权限:

# ls -ld /u02/oradata/orcldrwxr-xr-x 3 root root 4096 Sep 29 12:11 /u02/oradata/orcl
正如在以上列表中所看到的,oracle 用户帐户(以及 dba 组)将无法写入此目录。我们来解决此问题:
# chown oracle.dba /u02/oradata/orcl# chmod 775 /u02/oradata/orcl
我们回过头来再次检查集群中两个 Oracle RAC 节点的权限是否正确:
# ls -ld /u02/oradata/orcldrwxrwxr-x 3 oracle dba 4096 Sep 29 12:11 /u02/oradata/orcl
调整 O2CB 心跳阈值

该部分对于配置 OCFS2 以供 Oracle 集群件的两个共享文件使用非常重要。在本文之前的版本中(将 FireWire 而不是 iSCSI 用作共享存储),我能够安装和配置 OCFS2、格式化新卷并最后安装位于新 OCFS2 卷上的 Oracle 集群件(及其所需的两个共享文件,即表决磁盘和 OCR 文件)。我能够使用 FireWire 安装 Oracle 集群件并可以看到共享驱动器,但当集群件软件在两个节点上运行大约 15 分钟后,我收到了许多锁定和挂起。挂起的节点总是变化不定(在我的示例中为 linux1 或 linux2)。此外,无论是 I/O 负载较高还是根本没有,对该节点崩溃(挂起)都没有影响。

查看 OCFS2 的跟踪文件后,对表决磁盘的访问显然太慢(超过了 O2CB 心跳阈值)并导致 Oracle 集群件软件(以及节点)崩溃。

我所使用的解决方案只是将 O2CB 心跳阈值从其默认设置 7 增大为 61。在某些情况下可能需要更高的设置。这是一个可配置参数,用于计算节点“隔离”自身所用的时间。

无论是将 FireWire 还是 iSCSI 用作共享存储,应牢记的一点就是,我正在创建的配置只是一个用于教学目的的低端设置。这绝不是一个高端设置并可能易受虚假超时的影响。因此,强烈建议使用本节中的任务来提高 O2CB 心跳阈值,以解决我们共享驱动器访问速度慢的问题。注意,我无需提高 O2CB 心跳阈值就能够创建本文中的配置(使用 iSCSI)。然而,本文之所以将该节包含在本文中,是为了使那些可能在给定硬件的情况下经历同样情形的人受益。

首先,我们了解一下如何确定 O2CB 心跳阈值的当前设置。为此,可以查询 /proc 文件系统,如下所示:

# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold7
值为 7,但该值表示什么呢?其实,它用在以下公式中确定隔离时间(秒):
[fence time in seconds] = (O2CB_HEARTBEAT_THRESHOLD - 1) * 2
因此,如果 O2CB 心跳阈值为 7,则隔离时间将为:
(7 - 1) * 2 = 12 seconds
如果使用的是慢速网络和外部磁盘,您可能需要更大的阈值(确切的说是 120 秒)。对于 120 秒,您将需要一个值为 61 的 O2CB_HEARTBEAT_THRESHOLD,如下所示:

(61 - 1) * 2 = 120 seconds
现在我们了解一下如何将 O2CB 心跳阈值从 7 增大为 61。这需要在集群的两个 Oracle RAC 节点上执行以下操作。首先需要修改文件 /etc/sysconfig/o2cb 并将 O2CB_HEARTBEAT_THRESHOLD 设置为 61:

# O2CB_ENABELED: 'true' means to load the driver on boot.O2CB_ENABLED=true# O2CB_BOOTCLUSTER: If not empty, the name of a cluster to start.O2CB_BOOTCLUSTER=ocfs2# O2CB_HEARTBEAT_THRESHOLD: Iterations before a node is considered dead.O2CB_HEARTBEAT_THRESHOLD=61
修改文件 /etc/sysconfig/o2cb 后,您需要更改 o2cb 配置。同样,需要在集群的两个 Oracle RAC 节点上执行该操作。

# umount /u02/oradata/orcl/# /etc/init.d/o2cb unload# /etc/init.d/o2cb configureLoad O2CB driver on boot (y/n) [y]: yCluster to start on boot (Enter "none" to clear) [ocfs2]: ocfs2Writing O2CB configuration: OKLoading module "configfs": OKMounting configfs filesystem at /config: OKLoading module "ocfs2_nodemanager": OKLoading module "ocfs2_dlm": OKLoading module "ocfs2_dlmfs": OKMounting ocfs2_dlmfs filesystem at /dlm: OKStarting cluster ocfs2: OK
您现在可以再次检查以确保这些设置应用于 o2cb 集群堆栈:
# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold61
必须注意,用作 O2CB 心跳阈值的 61 并不适用于所有配置。在某些情况下,O2CB 心跳阈值必须增加到 601 以防止 OCFS2 惊扰内核。

重新引导两个节点

开始介绍下一节之前,最好在此时重新引导 RAC 集群的两个节点。当计算机启动时,确保加载了集群堆栈服务并安装了新的 OCFS2 文件系统:

# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
configfs on /config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
cartman:SHARE2 on /cartman type nfs (rw,addr=192.168.1.120)
/dev/sdd1 on /u02/oradata/orcl type ocfs2 (rw,_netdev,datavolume,nointr,heartbeat=local)
如果修改了 O2CB 心跳阈值,则应验证其是否设置正确:

# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold61
如何确定 OCFS2 版本

要确定正在运行的 OCFS2 版本,使用:

# cat /proc/fs/ocfs2/versionOCFS2 1.2.3 Thu Aug 10 18:16:03 PDT 2006 (build 6b798aaadf626d3b137c3952809b2f38)

返回首页

17. 安装和配置自动存储管理 (ASMLib 2.0)

 应在集群中的两个 Oracle RAC 节点上执行大多数安装和配置过程!但创建 ASM 磁盘将只需在集群中的单个节点上执行。

在本节中,我们将配置自动存储管理 (ASM),以将其用作所有 Oracle 物理数据库文件(数据、联机重做日志、控制文件、归档重做日志)以及闪回恢复区的文件系统/卷管理器。

Oracle10g 第 1 版中引入了 ASM,用于使管理员不必再管理单个文件和驱动器。ASM 内置在 Oracle 内核中。通过它,DBA 可以全天候管理 Oracle 集群实例的单个实例以集群实例的数千个磁盘驱动器。将把所有要用于 Oracle 的文件和目录包含在磁盘组 中。ASM 跨所有可用磁盘驱动器并行执行负载平衡,以防止热点并最大限度地提高性能(甚至对于快速更改数据使用模式也是如此)。

有两个不同方法可在 Linux 上配置 ASM:

使用 ASMLib I/O 的 ASM:此方法使用 ASMLib 调用在由 ASM 管理的原始块设备 上创建所有 Oracle 数据库文件。由于 ASMLib 使用块设备,因此该方法不需要原始设备。

使用标准 Linux I/O 的 ASM:此方法使用标准 Linux I/O 系统调用在 ASM 管理的原始字符设备 上创建所有 Oracle 数据库文件。您将需要为 ASM 使用的所有磁盘分区创建原始设备。
在本文中,我将使用“使用 ASMLib I/O 的 ASM”方法。Oracle 指出(在Metalink 说明 275315.1 中)“提供的 ASMLib 支持 ASM I/O 用于 Linux 磁盘,无需考虑标准 UNIX I/O API 的限制”。我计划将来执行几个测试以确定使用 ASMLib 会获得的性能增益。这些性能度量和测试细节超出了本文的范围,因此将不予讨论。

在本节中,我们首先下载特定于我们 Linux 内核的 ASMLib 驱动程序(ASMLib 2.0 版)。然后,我们将安装和配置 ASMLib 2.0 驱动程序,同时以一个如何创建 ASM 磁盘的演示结束本节。

如果要了解有关 Oracle ASMLib 2.0 的详细信息,请访问 http://www.oracle.com/technology/tech/linux/asmlib/

下载 ASMLib 2.0 程序包

在本节中,我们首先从 OTN 下载最新的 ASMLib 2.0 库和驱动程序。截至本文撰写之日,最新版本的 ASMLib 驱动程序是 2.0.3-1。与 Oracle 集群文件系统一样,我们需要下载 Linux 内核的版本以及计算机上的处理器数。我们使用的是内核 2.6.9-42.EL #1,且我使用的计算机都是单处理器计算机:

# uname -a
Linux linux1 2.6.9-42.EL #1 Sat Aug 12 09:17:58 CDT 2006 i686 i686 i386 GNU/Linux

用于 Red Hat Enterprise Linux 4 AS 的 Oracle ASMLib 下载
oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm —(适用于单处理器)
— 或 —

oracleasm-2.6.9-42.ELsmp-2.0.3-1.i686.rpm —(适用于多处理器)
— 或 —

oracleasm-2.6.9-42.ELhugemem-2.0.3-1.i686.rpm —(适用于 hugemem)
还需要下载以下 ASMLib 工具:

oracleasmlib-2.00.2-1.i386.rpm —(用户空间库)
oracleasm-support-2.00.3-1.i386.rpm —(驱动程序支持文件)
安装 ASMLib 2.0 程序包

您需要以 root 用户帐户在 RAC 集群中的两个节点上执行该操作:

$ su -
# rpm -Uvh oracleasm-2.6.9-42.EL-2.0.3-1.i686.rpm \
oracleasmlib-2.0.2-1.i386.rpm \
oracleasm-support-2.0.3-1.i386.rpm
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.9-42.EL ########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
配置和加载 ASMLib 2.0 程序包

现在,您下载并安装了用于 Linux 的 ASMLib 程序包,接下来您需要配置并加载 ASM 内核模块。需要在两个 Oracle RAC 节点上以 root 运行此任务:

$ su -
# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.

This will configure the on-boot properties of the Oracle ASM library
driver. The following questions will determine whether the driver is
loaded on boot and what permissions it will have. The current values
will be shown in brackets ('[]'). Hitting <ENTER> without typing an
answer will keep that current value. Ctrl-C will abort.

Default user to own the driver interface []: oracle
Default group to own the driver interface []: dba
Start Oracle ASM library driver on boot (y/n) [n]: y
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: [ OK ]
Creating /dev/oracleasm mount point: [ OK ]
Loading module "oracleasm": [ OK ]
Mounting ASMlib driver filesystem: [ OK ]
Scanning system for ASM disks: [ OK ]
为 Oracle 创建 ASM 磁盘

创建 ASM 磁盘只需要在 RAC 集群中的一个节点上以 root 用户帐户执行。我将在 linux1 上运行这些命令。在另一个 Oracle RAC 节点上,您将需要执行 scandisk 以识别新卷。该操作完成时,应在两个 Oracle RAC 节点上运行 oracleasm listdisks 命令以验证是否创建了所有 ASM 磁盘以及它们是否可用。

在“在 iSCSI 卷上创建分区”一节中,我们对 ASM 要使用的四个 iSCSI 卷进行了配置(分区)。ASM 将用于存储 Oracle 数据库文件,如联机重做日志、数据库文件、控制文件、归档重做日志以及闪回恢复区。

需要格外重点注意的是,此时在本文中,在对 iSCSI 卷进行分区以用于 ASM(如 /dev/sda、/dev/sdb、/dev/sdc 和 /dev/sde)后,您可能已经重新引导 linux1 若干次。这意味着从 Openfiler 发现的 iSCSI 目标名映射可能与 linux1 上的本地 SCSI 设备名不同。请重复“发现 iSCSI 目标”一节中所述的过程,以确定重新引导之后是否发现所有四个 ASM 卷的 iSCSI 目标名与 linux1 上的本地 SCSI 设备名不同。

例如,我在配置了 OCFS2 后(前一部分)重新引导了两个 Oracle RAC 节点。我适用于 linux1 的 ASM iSCSI 目标名映射发生了变化,如下所示:

使用上述 iSCSI 目标名映射创建 ASM 磁盘时要使用的本地 SCSI 设备名。

注意:如果使用相同硬件(实际上是相同的共享逻辑驱动器)重复本文,则在尝试创建 ASM 磁盘时可能会出现故障。如果确实遇到故障,则尝试使用以下命令列出所有 ASM 磁盘:
# /etc/init.d/oracleasm listdisksVOL1VOL2VOL3VOL4
您可以看到,结果表明我定义了四个 ASM 卷。如果您在之前的运行中已经定义了四个卷,那么使用以下命令将其删除。删除之前创建的卷后,使用“oracleasm createdisk”命令(如下所示)创建新卷。
# /etc/init.d/oracleasm deletedisk VOL1
Removing ASM disk "VOL1" [ OK ]
# /etc/init.d/oracleasm deletedisk VOL2
Removing ASM disk "VOL2" [ OK ]
# /etc/init.d/oracleasm deletedisk VOL3
Removing ASM disk "VOL3" [ OK ]
# /etc/init.d/oracleasm deletedisk VOL4
Removing ASM disk "VOL4" [ OK ]
要使用 iSCSI 目标名到 SCSI 本地设备名映射(如上所述)创建 ASM 磁盘,键入以下内容:

$ su -
# /etc/init.d/oracleasm createdisk VOL1 /dev/sdc1
Marking disk "/dev/sdc1" as an ASM disk [ OK ]

# /etc/init.d/oracleasm createdisk VOL2 /dev/sde1
Marking disk "/dev/sde1" as an ASM disk [ OK ]

# /etc/init.d/oracleasm createdisk VOL3 /dev/sdb1
Marking disk "/dev/sdb1" as an ASM disk [ OK ]

# /etc/init.d/oracleasm createdisk VOL4 /dev/sda1
Marking disk "/dev/sda1" as an ASM disk [ OK ]
在 RAC 集群中的所有其他节点上,您必须执行磁盘扫描程序 以识别新卷:
# /etc/init.d/oracleasm scandisks
Scanning system for ASM disks [ OK ]

现在,我们可以使用以下命令在 RAC 集群中的两个节点上以 root 用户帐户的身份测试是否成功创建了 ASM 磁盘:

# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
VOL4

返回首页

18. 下载 Oracle RAC 10g 软件

只需要在集群中的一个节点上执行以下下载过程!

下一个逻辑步骤是安装 Oracle 集群件第 2 版 (10.2.0.1.0)、Oracle 数据库 10g 第 2 版 (10.2.0.1.0) 以及最终用于 Linux x86 软件的 Oracle 数据库 10g 随附 CD 第 2 版 (10.2.0.1.0)。但您必须先从 OTN 下载并提取所需的 Oracle 软件程序包。

您将从 Oracle 下载所需的软件并将其提取到集群的一个 Linux 节点(即 linux1)上。您将从此计算机执行所有安装。Oracle 安装程序将把所需的软件程序包复制到我们在第 14 节(为远程访问配置 RAC 节点)中设置的 RAC 配置中的所有其他节点上。

登录到您将从其中以“oracle”用户帐户执行所有 Oracle 安装的节点 (linux1)。在该示例中,您将把所需的 Oracle 软件下载到 linux1 并将其保存到 /u01/app/oracle/orainstall。

下载并提取软件

首先,下载 Oracle 集群件第 2 版 (10.2.0.1.0)、Oracle 数据库 10g 第 2 版 (10.2.0.1.0) 以及用于 Linux x86 的 Oracle 数据库 10g 随附 CD 第 2 版 (10.2.0.1.0) 软件。所有下载均在同一页面中提供。

以 oracle 用户帐户将下载的三个程序包提取到临时目录。在该示例中,我将使用 /u01/app/oracle/orainstall。

按如下所示提取 Oracle 集群件程序包:

# su - oracle$ cd ~oracle/orainstall$ unzip 10201_clusterware_linux32.zip

然后提取 Oracle 数据库软件:
$ cd ~oracle/orainstall$ unzip 10201_database_linux32.zip

最后,提取 Oracle 随附 CD 软件:
$ cd ~oracle/orainstall$ unzip 10201_companion_linux32.zip

返回首页

19. Oracle10g 第 2 版安装前的准备工作
在集群中的两个 Oracle RAC 节点上执行以下检查!

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

下一个安装前步骤是运行集群验证实用程序 (CVU)。CVU 是 Oracle 集群件安装介质上提供的一个命令行实用程序。它负责执行各种系统检查,以协助您确认 Oracle RAC 节点针对 Oracle 集群件和 Oracle 真正应用集群安装进行了正确的配置。CVU 只需从您将从其中执行 Oracle 安装的节点(本文中为 linux1)运行即可。

检查必需的 RPM

以下是必须安装的程序包(请记住您的 Linux 版本号可能略有不同):

binutils-2.15.92.0.2-21
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-libgcc-296-2.96-132.7.2
control-center-2.8.0-12.rhel4.5
cpp-3.4.6-3
gcc-3.4.6-3
gcc-c++-3.4.6-3
glibc-2.3.4-2.25
glibc-common-2.3.4-2.25
glibc-devel-2.3.4-2.25
glibc-headers-2.3.4-2.25
glibc-kernheaders-2.4-9.1.98.EL
gnome-libs-1.4.1.2.90-44.1
libaio-0.3.105-2
libstdc++-3.4.6-3
libstdc++-devel-3.4.6-3
make-3.80-6.EL4
openmotif-2.2.3-10.RHEL4.5
openmotif21-2.1.30-11.RHEL4.6
pdksh-5.2.14-30.3
setarch-1.6-1
sysstat-5.0.5-11.rhel4
xscreensaver-4.18-5.rhel4.11
注意,openmotif RPM 程序包只在安装 Oracle 演示时需要。本文不包括 Oracle 演示的安装。

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

# rpm -q gcc glibc-devel
gcc-3.4.6-3
glibc-devel-2.3.4-2.25
如果需要安装以上任意程序包,使用“rpm -Uvh <程序包名.rpm>”。例如,要安装 GCC gcc-3.4.6-3 程序包,使用:
# rpm -Uvh gcc-3.4.6-3.i386.rpm

使用集群验证实用程序的先决条件

JDK 1.4.2
必须先在系统上安装 JDK 1.4.2,然后才可以运行 CVU。如果系统上没有安装 JDK 1.4.2,则在尝试运行 CVU 时,您将收到一个类似下面的错误消息:

ERROR. Either CV_JDKHOME environment variable should be set
or /stagepath/cluvfy/jrepack.zip should exist.
如果没有安装 JDK 1.4.2,请从 Sun 网站下载该软件并使用 Sun 的说明进行安装。以下网站提供有 JDK 1.4.2 下载:http://www.sun.com/java。

如果安装了 JDK 1.4.2,那么您必须定义到 JDK 的路径的用户环境变量 CV_JDKHOME。例如,如果 JDK 1.4.2 安装在 /usr/local/j2re1.4.2_08 中,那么以您计划用于运行 CVU 的用户身份登录并输入以下命令:

CV_JDKHOME=/usr/local/j2re1.4.2_08
export CV_JDKHOME

安装 cvuqdisk RPM(仅适用于 RHEL 用户)
运行 CVU 的第二个先决条件是针对 Red Hat Linux 用户的。如果运行的是 Red Hat Linux,则必须下载 Red Hat 操作系统程序包 cvuqdisk 并将其安装到集群中的两个 Oracle RAC 节点上。这意味着您将需要在 linux1 和 linux2 上安装 cvuqdisk RPM。如果没有 cvuqdisk,CVU 将无法发现共享磁盘,您在运行 CVU 时会收到错误消息“Package cvuqdisk not installed(程序包 cvuqdisk 未安装)”。

cvuqdisk RPM 可在 rpm 目录中的 Oracle 集群件安装介质中找到。考虑到本文的目的,将 Oracle 集群件介质解压缩到 linux1 上的 /u01/app/oracle/orainstall/clusterware 目录。注意,在安装 cvuqdisk RPM 之前,我们需要设置名为 CVUQDISK_GRP 的环境变量,使其指向将要拥有 cvuqdisk 实用程序的组。默认的组是 oinstall,这不是本文中我们用于 oracle UNIX 用户帐户的组。因为我们使用的是 dba 组,所以需要在尝试安装 cvuqdisk RPM 之前设置 CVUQDISK_GRP=dba。

在 linux1 中找到 cvuqdisk RPM 并将其复制到 linux2,然后在两个 Oracle RAC 节点上执行以下步骤进行安装:

$ su -
# cd /u01/app/oracle/orainstall/clusterware/rpm
# CVUQDISK_GRP=dba; export CVUQDISK_GRP

# rpm -iv cvuqdisk-1.0.1-1.rpm
Preparing packages for installation...
cvuqdisk-1.0.1-1

# ls -l /usr/sbin/cvuqdisk
-rwsr-x--- 1 root dba 4168 Jun 2 2005 /usr/sbin/cvuqdisk

验证远程访问/用户等效性
应该从 linux1(我们将在该节点运行所有的 Oracle 安装)运行 CVU。运行 CVU 之前,以 oracle 用户帐户登录并验证已针对集群中的所有节点配置了远程访问/用户等效性。使用安全 shell 方法时,需要首先在终端 shell 会话上启用用户等效性然后再尝试运行 CVU。要为当前的终端 shell 会话启用用户等效性,请执行以下步骤(记住为每个键输入在提示时生成的口令短语):

# su - oracle
$ exec /usr/bin/ssh-agent $SHELL
$ /usr/bin/ssh-add
Enter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxx
Identity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)
Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)

在使用远程 shell 方法时,一般在 oracle 用户帐户的 /etc/hosts.equiv 文件中定义用户等效性,并在所有新终端 shell 会话上进行启用。

利用 CVU 检查 CRS 的安装前任务

满足了所有使用 CVU 的先决条件后,我们首先以“oracle”用户帐户(启用了用户等效性)从 linux1 运行以下命令,以检查 Oracle 集群件 (CRS) 的所有安装前任务是否完成:

$ cd /u01/app/oracle/orainstall/clusterware/cluvfy
$ ./runcluvfy.sh stage -pre crsinst -n linux1,linux2 -verbose

查看 CVU 报告。注意,报告中几个可以忽略的错误。

第一个错误有关“oinstall”组 [作为基本组] 中的用户“oracle”的成员资格。考虑到本文的目的,“oracle”用户帐户只能分配给“dba”组,因此可以忽略该错误,没什么问题。

第二个错误与为 VIP 查找一组适合的接口有关。这是 Metalink 说明 338924.1 中的一个错误文件:

Suitable interfaces for the private interconnect on subnet "192.168.2.0":
linux2 eth1:192.168.2.101
linux1 eth1:192.168.2.100

ERROR:
Could not find a suitable set of interfaces for VIPs.

Result: Node connectivity check failed.
如说明中所述,可以忽略该错误,没什么问题。

最后一组可忽略的错误与处理 RHEL4 Update 4 中不存在的特定 RPM 程序包版本有关。例如:
compat-gcc-7.3-2.96.128
compat-gcc-c++-7.3-2.96.128
compat-libstdc++-7.3-2.96.128
compat-libstdc++-devel-7.3-2.96.128

这些特定的程序包在 CVU 报告中列为缺少,请确保在集群中的两个 Oracle RAC 节点上安装了正确版本的 compat-* 程序包。例如,在 RHEL4 Update 4 中,这些程序包应为:
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

利用 CVU 检查硬件和操作系统设置

接下来要运行的 CVU 检查将验证硬件和操作系统设置。同样,从 linux1 以“oracle”UNIX 用户帐户运行以下命令:

$ cd /u01/app/oracle/orainstall/clusterware/cluvfy
$ ./runcluvfy.sh stage -post hwos -n linux1,linux2 -verbose
查看 CVU 报告。与之前的检查(CRS 的安装前任务)一样,为 VIP 查找一组合适的接口将失败,可将其忽略,没什么问题。

另请注意,检查共享存储可访问性将失败。

Checking shared storage accessibility...

WARNING:
Unable to determine the sharedness of /dev/sde on nodes:
linux2,linux2,linux2,linux2,linux2,linux1,linux1,linux1,linux1,linux1

Shared storage check failed on nodes "linux2,linux1".
该警告也可忽略,没什么问题。虽然我们知道这些磁盘可见并在集群中的两个 Oracle RAC 节点中共享,但本身将失败。导致该错误的若干原因已得到证明。第一个原因来自 Metalink,指出 cluvfy 当前没有使用 SCSI 设备之外的其他设备。这将包括设备(如 EMC PowerPath)和卷组(如 Openfiler 中的卷组)。截至本文撰写之日,除了使用手动方法检测共享设备外没有其他解决方法。该错误的另一个原因由 Oracle Corporation 的 Bane Radulovic 提出。他的研究表明,CVU 在 Linux 上调用 smartclt 时,smartclt 不会从 iSCSI 设备返回序列号。例如,针对 /dev/sde 进行的检查显示:

# /usr/sbin/smartctl -i /dev/sde
smartctl version 5.33 [i686-redhat-linux-gnu] Copyright (C) 2002-4 Bruce Allen
Home page is http://smartmontools.sourceforge.net/

Device: Openfile Virtual disk Version: 0
Serial number:
Device type: disk
Local Time is: Wed Oct 25 23:41:20 2006 EDT
Device supports SMART and is Disabled
Temperature Warning Disabled or Not Supported
截至本文撰写之日,我们还不知道 Openfiler 开发人员是否打算对此进行修复。

返回首页

 20. 安装 Oracle 10g 集群件软件

 仅在集群 (linux1) 的一个 Oracle RAC 节点上执行下列安装过程!Oracle Universal Installer 将把 Oracle 集群件软件安装到集群中的两个 Oracle RAC 节点。

您现在就可以安装该环境的“集群”部分:Oracle 集群件。在上一节中,您将 Oracle 集群件的安装文件下载并解压缩到 linux1 的目录 /u01/app/oracle/orainstall/clusterware 中。这是唯一需要执行安装的节点。

在 Oracle 集群件的安装过程中,系统将提示您提供相关的并要在 RAC 集群中配置的节点。当实际的安装开始时,它将使用我们在第 14 节(“为远程访问配置 RAC 节点”)中配置的远程访问把所需的软件复制到所有节点。

那 Oracle 集群件究竟是用来干什么的呢?它包含所有集群和数据库配置元数据以及多个适用于 RAC 的系统管理特性。通过它,DBA 可以将一个 Oracle 实例(或多个实例)注册和调用到集群。在通常的操作中,Oracle 集群件将通过一种特殊的 ping 操作向集群中配置的所有节点发送消息(通常称作“心跳”)。如果对任何节点的心跳检测失败,则它将检查 Oracle 集群件配置文件(位于共享磁盘上)以辨别是节点故障还是网络故障。

安装 Oracle 集群件后,用于安装 Oracle 10g 数据库软件(下一节)的 Oracle Universal Installer (OUI) 将自动识别这些节点。与您将在本节中执行的 Oracle 集群件安装一样,Oracle 数据库 10g 软件只需要从一个节点中运行。OUI 将把此软件程序包复制到 RAC 集群中配置的所有节点。

Oracle 集群件共享文件

系统将把由 Oracle 集群件使用的两个共享文件(实际上是文件组)存储到我们在前面创建的 Oracle 集群文件系统第 2 版 (OFCS2) 中。这两个共享 Oracle 集群件文件组是:

Oracle 集群注册表 (OCR)

文件 1:/u02/oradata/orcl/OCRFile
文件 2:/u02/oradata/orcl/OCRFile_mirror
大小:(2 * 100MB) = 200M

CRS 表决磁盘

文件 1:/u02/oradata/orcl/CSSFile
文件 2:/u02/oradata/orcl/CSSFile_mirror1
文件 3:/u02/oradata/orcl/CSSFile_mirror2
大小:(3 * 20MB) = 60MB
注意:不能对这两个共享 Oracle 集群件文件使用自动存储管理 (ASM):Oracle 集群注册表 (OCR) 或 CRS 表决磁盘 文件。问题是只有这两个文件就绪并可以访问后才可以启动 Oracle 实例。要使 ASM 可用,应首先运行 ASM 实例。

另请注意,可以将这两个共享文件存储到 OCFS2、共享的原始设备或其他供应商的集群化文件系统中。

验证终端 Shell 环境

在启动 Oracle Universal Installer 之前,您应该首先验证您已登录到要从其运行安装程序的服务器(例如 linux1),然后从控制台以 root 运行 xhost 命令以允许建立 X Server 连接。接下来,以 oracle 用户帐户登录。如果您正在使用远程客户端来连接到执行安装的节点(从 X Server 所在的工作站通过 SSH/Telnet 连接 linux1),您将需要将 DISPLAY 变量设置为指向本地工作站。最后,验证集群中所有节点的远程访问/用户等效性:
验证服务器并启用 X Server 访问

# hostnamelinux1# xhost +access control disabled, clients can connect from any host
以 oracle 用户帐户登录并设置 DISPLAY(如果需要)

# su - oracle$ # IF YOU ARE USING A REMOTE CLIENT TO CONNECT TO THE$ # NODE PERFORMING THE INSTALL$ DISPLAY=<your local workstation>:0.0$ export DISPLAY
验证远程访问/用户等效性

验证您能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行安全 Shell 命令(ssh 或 scp)或远程 Shell 命令(rsh 和 rcp)。

使用安全 shell 方法时,需要首先在任何新的终端 shell 会话上启用用户等效性然后再尝试运行 OUI。要为当前的终端 shell 会话启用用户等效性,请执行以下步骤(记住为每个键输入在提示时生成的通行短语):

$ exec /usr/bin/ssh-agent $SHELL$ /usr/bin/ssh-addEnter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxxIdentity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)$ ssh linux1 "date;hostname"Wed Sep 13 18:27:17 EDT 2006linux1$ ssh linux2 "date;hostname"Wed Sep 13 18:28:00 EDT 2006linux2
使用远程 shell 方法时,用户等效性通常在 oracle 用户帐户的 /etc/hosts.equiv 文件中定义,在所有新的终端 shell 会话上启用:

$ rsh linux1 "date;hostname"Tue Sep 12 12:37:17 EDT 2006linux1$ rsh linux2 "date;hostname"Tue Sep 12 12:38:00 EDT 2006linux2
安装集群就绪服务

执行以下任务安装 Oracle 集群件:

$ cd ~oracle$ /u01/app/oracle/orainstall/clusterware/runInstaller -ignoreSysPrereqs

屏幕名称
回应
欢迎屏幕 单击 Next
Specify Inventory directory and credentials 接受默认值:
Inventory directory: /u01/app/oracle/oraInventory
Operating System group name: dba
Specify Home Details 为 ORACLE_HOME(实际上是 $ORA_CRS_HOME,我将在本文中使用它)设置 Name 和 Path,如下所示:
Name: OraCrs10g_home
Path: /u01/app/oracle/product/crs
Product-Specific Prerequisite Checks 安装程序将执行一系列的检查以确定节点是否满足安装和配置 Oracle 集群件软件的最低要求。如果任何检查失败,您将需要通过单击该复选框手动验证失败的检查。我所执行的安装通过了所有检查,未出现任何问题。
单击 Next 继续。
Specify Cluster Configuration
Specify Network Interface Usage
Specify OCR Location 从带有 RAC 的 Oracle 数据库 10g 第 2 版 (10.2) 开始,Oracle 集群件支持创建镜像的 OCR 文件,从而增强了集群可靠性。就本示例而言,我选择了通过保留默认选项“Normal Redundancy”镜像 OCR 文件:
Specify OCR Location: /u02/oradata/orcl/OCRFile
Specify OCR Mirror Location: /u02/oradata/orcl/OCRFile_mirror
Specify Voting Disk Location 从带有 RAC 的 Oracle 数据库 10g 第 2 版 (10.2) 开始,已经修改了 CSS,使您可以为 CSS 配置多个表决磁盘。在第 1 版 (10.1) 中,您只能配置一个表决磁盘。通过启用多个表决磁盘配置,您可以使用冗余的表决磁盘在独立的共享物理磁盘上为 RAC 数据库配置多个表决磁盘。该选项简化了 iSCSI 网络协议以及其他网络附件存储 (NAS) 存储解决方案的使用。注意,要利用多个表决磁盘的好处,必须至少配置三个表决磁盘。就本示例而言,我选择了通过保留默认选项“Normal Redundancy”镜像表决磁盘:
Voting Disk Location: /u02/oradata/orcl/CSSFile
Additional Voting Disk 1 Location: /u02/oradata/orcl/CSSFile_mirror1
Additional Voting Disk 2 Location: /u02/oradata/orcl/CSSFile_mirror2
Summary 单击 Install 开始安装!
Execute Configuration Scripts 安装完成后,将提示您运行 orainstRoot.sh 和 root.sh 脚本。以“root”用户帐户在集群的两个 Oracle RAC 节点(从执行安装的节点开始)上打开一个新控制台窗口。
导航到 /u01/app/oracle/oraInventory 目录,并在 RAC 集群的所有节点上运行 orainstRoot.sh。
在集群中两个 Oracle RAC 节点(从执行安装的节点开始)上的同一个新控制台窗口中,以“root”用户帐户登录。

导航到 /u01/app/oracle/product/crs 目录并在集群中的每个节点(从执行安装的节点开始)上找到 root.sh 文件。在 RAC 集群的所有节点上运行 root.sh 文件,一次一个。

您在所有节点上运行 root.sh 时将收到多个警告。可以忽略这些警告,没什么问题。

可能需要等一会儿才会运行 root.sh。在最后一个节点上运行 root.sh 时,您将收到一个严重错误,其输出如下所示:

...
Expecting the CRS daemons to be up within 600 seconds.
CSS is active on these nodes.
linux1
linux2
CSS is active on all nodes.
Waiting for the Oracle CRSD and EVMD to start
Oracle CRS stack installed and running under init(1M)
Running vipca(silent) for configuring nodeapps
The given interface(s), "eth0" is not public.Public interfaces should be used to configure virtual IPs.
此问题为 Oracle 10.2.0.1(Metalink 文章 338924.1 中有说明)所特有,需要在继续操作之前将其解决。最简单的变通方法是从出现错误的上一个节点中以 root 用户的身份手动重新运行 vipca (GUI)。请记住,vipca 是一个 GUI,需要根据您的 X 服务器设置 DISPLAY 变量:

# $ORA_CRS_HOME/bin/vipca

出现“VIP Configuration Assistant”时,我按如下所示回应屏幕提示:

Welcome: 单击 Next
Network interfaces: 选择两个接口 — eth0 和 eth1
Virtual IPs for cluster notes:
Node Name: linux1
IP Alias Name: linux1-vip
IP Address: 192.168.1.200
Subnet Mask: 255.255.255.0


Node Name: linux2
IP Alias Name: linux2-vip
IP Address: 192.168.1.201
Subnet Mask: 255.255.255.0


Summary: 单击 Finish
Configuration Assistant Progress Dialog: 配置完成后单击 OK。
Configuration Results: 单击 Exit


返回到 OUI 并确认“Execute Configuration scripts”对话框窗口。

End of installation 安装结束时,退出 OUI。

验证 Oracle 集群件安装

安装 Oracle 集群件后,可以运行几个测试来验证安装是否成功。在 RAC 集群的两个节点上运行下列命令。

检查集群节点

$ /u01/app/oracle/product/crs/bin/olsnodes -nlinux1 1linux2 2
检查 Oracle 集群件自动启动脚本
$ ls -l /etc/init.d/init.*-r-xr-xr-x 1 root root 1951 Oct 4 14:21 /etc/init.d/init.crs*-r-xr-xr-x 1 root root 4714 Oct 4 14:21 /etc/init.d/init.crsd*-r-xr-xr-x 1 root root 35394 Oct 4 14:21 /etc/init.d/init.cssd*-r-xr-xr-x 1 root root 3190 Oct 4 14:21 /etc/init.d/init.evmd*

返回首页

21. 安装 Oracle 数据库 10g 软件
仅在集群 (linux1) 的一个 Oracle RAC 节点上执行下列安装过程!Oracle Universal Installer 将把 Oracle 数据库软件安装到集群中的两个 Oracle RAC 节点。

成功安装 Oracle 集群件软件后,下一步是安装具有 RAC 的 Oracle 数据库 10g 第 2 版 (10.2.0.1.0)。

就本示例而言,您在安装该软件时将不使用“Create Database”选项。而是将在安装后使用数据库创建助手 (DBCA) 创建数据库。

与前面章节中的 Oracle 集群件安装一样,Oracle10g 数据库软件只需从一个节点运行。OUI 将把此软件程序包复制到 RAC 集群中配置的所有节点。

验证终端 Shell 环境

如前面的章节(安装 Oracle10g 集群件软件)中所讨论的,需要首先为集群中所有节点的远程访问和用户等效性配置终端 shell 环境然后才能运行 Oracle Universal Installer。注意,您可以利用前面的小节中使用的同一终端 shell 会话,您不必采取下面描述的关于设置远程访问和 DISPLAY 变量的任何操作:
以 oracle 用户帐户登录并设置 DISPLAY(如果需要)

# su - oracle$ # IF YOU ARE USING A REMOTE CLIENT TO CONNECT TO THE$ # NODE PERFORMING THE INSTALL$ DISPLAY=<your local workstation>:0.0$ export DISPLAY
验证远程访问/用户等效性

验证您能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行安全 Shell 命令(ssh 或 scp)或远程 Shell 命令(rsh 和 rcp)。

使用安全 shell 方法时,需要首先在任何新的终端 shell 会话上启用用户等效性然后再尝试运行 OUI。要为当前的终端 shell 会话启用用户等效性,请执行以下步骤(记住为每个键输入在提示时生成的通行短语):

$ exec /usr/bin/ssh-agent $SHELL$ /usr/bin/ssh-addEnter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxxIdentity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)$ ssh linux1 "date;hostname"Wed Sep 13 18:27:17 EDT 2006linux1$ ssh linux2 "date;hostname"Wed Sep 13 18:28:00 EDT 2006linux2
使用远程 shell 方法时,用户等效性通常在 oracle 用户帐户的 /etc/hosts.equiv 文件中定义,在所有新的终端 shell 会话上启用:

$ rsh linux1 "date;hostname"Tue Sep 12 12:37:17 EDT 2006linux1$ rsh linux2 "date;hostname"Tue Sep 12 12:38:00 EDT 2006linux2
运行 Oracle 集群验证实用程序

安装 Oracle 数据库软件之前,我们应该使用集群验证实用程序 (CVU) 运行以下数据库安装前检查。

注意: 有关如何配置 CVU 的说明,可在本文前面的“使用集群验证实用程序的前提条件”一节中找到。

$ cd /u01/app/oracle/orainstall/clusterware/cluvfy
$ ./runcluvfy.sh stage -pre dbinst -n linux1,linux2 -r 10gR2 -verbose
查看 CVU 报表。注意,该报表将包含我们在检查 CRS 安装前任务时收到的错误:找不到一组合适的 VIP 接口,以及找不到 RHEL4 Update 中不存在的特定 RPM 程序包。可以忽略这两个错误,没什么问题。

安装 Oracle 数据库 10g 第 2 版软件

使用以下命令安装 Oracle 数据库 10g 第 2 版软件:

$ cd ~oracle$ /u01/app/oracle/orainstall/database/runInstaller -ignoreSysPrereqs

屏幕名称
回应
欢迎屏幕 单击 Next
Select Installation Type 我选择了 Enterprise Edition 选项。
Specify Home Details 为 ORACLE_HOME 设置 Name 和 Path,如下所示:
Name: OraDb10g_home1
Path: /u01/app/oracle/product/10.2.0/db_1
Specify Hardware Cluster Installation Mode 选择 Cluster Installation 选项,然后选择所有可用节点。单击 Select All 选择所有服务器:linux1 和 linux2。
如果安装此时停止,且有 RAC 节点的状态显示为“Node not reachable”,则执行以下检查:

确保 Oracle 集群件正在所讨论的节点上运行。
确保您能够从执行安装的节点访问所讨论的节点。

Product-Specific Prerequisite Checks 安装程序将执行一系列的检查以确定节点是否满足安装和配置 Oracle 数据库软件的最低要求。如果任何检查失败,您将需要通过单击该复选框手动验证失败的检查。
单击 Next 继续。
Select Database Configuration 选择选项“Install database software only”。
记住,我们将在单独的步骤中使用 DBCA 创建集群化数据库。
Summary 单击 Install 开始安装!
Root Script Window - Run root.sh 安装完成后,将提示您运行 root.sh 脚本。需要记住的是,需要在 RAC 集群的所有节点上一次一个地(从运行数据库安装的节点开始)运行 root.sh 脚本。
首先,以 root 用户帐户在安装 Oracle 10g 数据库软件的节点上打开一个新控制台窗口。我打开的是“linux1”。

导航到 /u01/app/oracle/product/10.2.0/db_1 目录,运行 root.sh。

在集群的所有节点上运行 root.sh 脚本后,返回 OUI 并确认“Execute Configuration scripts”对话框窗口。

End of installation 安装结束时,退出 OUI。
返回首页

22. 安装 Oracle 10g 随附 CD 软件
仅在集群 (linux1) 的一个 Oracle RAC 节点上执行下列安装过程!Oracle 10g 随附 CD 软件将由 Oracle Universal Installer 安装到集群的两个 Oracle RAC 节点。

成功安装 Oracle 数据库软件后,下一步是安装 Oracle 10g 第 2 版随附 CD 软件 (10.2.0.1.0)。

请注意,这是一个可选步骤。就本指南而言,我的测试数据库将通常使用 Java 虚拟机 (Java VM) 和 Oracle interMedia,因此将需要安装 Oracle 数据库 10g 随附 CD。要执行的安装类型将为 Oracle Database 10g Products 安装类型。

此安装类型包括用于提高 Java 性能的原生编译的 Java 库 (NCOMP) 文件。如果不安装 NCOMP 文件,则在使用 Java VM 的数据库升级为修补版时,将发生 ORA-29558:JAccelerator (NCOMP) not installed 错误。

验证终端 Shell 环境

如前面的章节(安装 Oracle10g 数据库软件)中所讨论的,需要首先为集群中所有节点的远程访问和用户等效性配置终端 shell 环境然后才能运行 Oracle Universal Installer。注意,您可以利用前面的小节中使用的同一终端 shell 会话,您不必采取下面描述的关于设置远程访问和 DISPLAY 变量的任何操作:
以 oracle 用户帐户登录并设置 DISPLAY(如果需要)


# su - oracle$ # IF YOU ARE USING A REMOTE CLIENT TO CONNECT TO THE$ # NODE PERFORMING THE INSTALL$ DISPLAY=<your local workstation>:0.0$ export DISPLAY
验证远程访问/用户等效性

验证您能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行安全 Shell 命令(ssh 或 scp)或远程 Shell 命令(rsh 和 rcp)。

使用安全 shell 方法时,需要首先在任何新的终端 shell 会话上启用用户等效性然后再尝试运行 OUI。要为当前的终端 shell 会话启用用户等效性,请执行以下步骤(记住为每个键输入在提示时生成的通行短语):

$ exec /usr/bin/ssh-agent $SHELL$ /usr/bin/ssh-addEnter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxxIdentity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)$ ssh linux1 "date;hostname"Wed Sep 13 18:27:17 EDT 2006linux1$ ssh linux2 "date;hostname"Wed Sep 13 18:28:00 EDT 2006linux2
使用远程 shell 方法时,用户等效性通常在 oracle 用户帐户的 /etc/hosts.equiv 文件中定义,在所有新的终端 shell 会话上启用:

$ rsh linux1 "date;hostname"Tue Sep 12 12:37:17 EDT 2006linux1$ rsh linux2 "date;hostname"Tue Sep 12 12:38:00 EDT 2006linux2
安装 Oracle10g 随附 CD 软件

使用以下命令安装 Oracle10g 随附 CD 软件:

$ cd ~oracle$ /u01/app/oracle/orainstall/companion/runInstaller -ignoreSysPrereqs

屏幕名称
回应

欢迎屏幕
单击 Next

Select a Product to Install
选择“Oracle Database 10g Products 10.2.0.1.0”选项。
Specify Home Details 将 ORACLE_HOME Name 和 Path 的目标设置为前面安装的 Oracle10g 数据库软件的目标,如下所示:
Name: OraDb10g_home1
Path: /u01/app/oracle/product/10.2.0/db_1
Specify Hardware Cluster Installation Mode 默认情况下,将选择 Cluster Installation 选项以及集群中的所有可用节点。保留这些默认选项,然后单击 Next 继续。
如果安装此时停止,且有 RAC 节点的状态显示为“Node not reachable”,则执行以下检查:

确保 Oracle 集群件正在所讨论的节点上运行。
确保您能够从执行安装的节点访问所讨论的节点。

Product-Specific Prerequisite Checks 安装程序将执行一系列的检查以确定节点是否满足安装和配置随附 CD 软件的最低要求。如果任何检查失败,您将需要通过单击该复选框手动验证失败的检查。我所执行的安装通过了所有检查,未出现任何问题。
单击 Next 继续。
Summary 在 Summary 屏幕上,单击 Install 开始安装!

End of installation 安装结束时,退出 OUI。

返回首页

 23. 创建 TNS 监听器进程

 仅在集群 (linux1) 的一个 Oracle RAC 节点上执行下列配置过程!Network Configuration Assistant (NETCA) 将在集群的两个 Oracle RAC 节点上的集群化配置中设置 TNS 监听器。

DBCA 需要在 RAC 集群的所有节点上配置并运行 Oracle TNS 监听器进程,然后它才能创建集群化数据库。

只需在集群的一个节点上执行 TNS 监听器创建过程。执行所有更改并将这些更改复制到集群的所有节点上。在一个节点(我将使用 linux1)上,启动 NETCA 并执行创建新 TNS 监听器进程的过程,同时配置节点的本地访问权限。

验证终端 Shell 环境

如前面的章节(安装 Oracle10g CD 随附软件)中所讨论的,需要首先为集群中所有节点的远程访问和用户等效性配置终端 shell 环境然后才能运行 Network Configuration Assistant (NETCA)。注意,您可以利用前面的小节中使用的同一终端 shell 会话,您不必采取下面描述的关于设置远程访问和 DISPLAY 变量的任何操作:
以 oracle 用户帐户登录并设置 DISPLAY(如果需要)

# su - oracle$ # IF YOU ARE USING A REMOTE CLIENT TO CONNECT TO THE$ # NODE PERFORMING THE INSTALL$ DISPLAY=<your local workstation>:0.0$ export DISPLAY
验证远程访问/用户等效性

验证您能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行安全 Shell 命令(ssh 或 scp)或远程 Shell 命令(rsh 和 rcp)。

使用安全 shell 方法时,需要首先在任何新的终端 shell 会话上启用用户等效性然后再尝试运行 OUI。要为当前的终端 shell 会话启用用户等效性,请执行以下步骤(记住为每个键输入在提示时生成的通行短语):

$ exec /usr/bin/ssh-agent $SHELL$ /usr/bin/ssh-addEnter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxxIdentity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)$ ssh linux1 "date;hostname"Wed Sep 13 18:27:17 EDT 2006linux1$ ssh linux2 "date;hostname"Wed Sep 13 18:28:00 EDT 2006linux2
使用远程 shell 方法时,用户等效性通常在 oracle 用户帐户的 /etc/hosts.equiv 文件中定义,在所有新的终端 shell 会话上启用:

$ rsh linux1 "date;hostname"Tue Sep 12 12:37:17 EDT 2006linux1$ rsh linux2 "date;hostname"Tue Sep 12 12:38:00 EDT 2006linux2
运行 Network Configuration Assistant

要启动 NETCA,请运行以下命令:

$ netca &

下表将引导您为我们 RAC 环境创建一个新的 Oracle 监听器。

屏幕名称
回应
Select the Type of Oracle
Net Services Configuration
选择 Cluster Configuration
Select the nodes to configure 选择所有节点:linux1 和 linux2。
Type of Configuration 选择 Listener configuration。
Listener Configuration — 接下来 6 个屏幕 后续屏幕现在与其他常规监听器配置相似。您只需接受后续 6 个屏幕的默认参数即可:
What do you want to do: Add
Listener name: LISTENER
Selected protocols: TCP
Port number: 1521
Configure another listener: No
Listener configuration complete! [ Next ]
您将返回到此 Welcome (Type of Configuration) 屏幕。
Type of Configuration 选择 Naming Methods configuration。
Naming Methods Configuration 后续屏幕是:
Selected Naming Methods: Local Naming
Naming Methods configuration complete! [ Next ]
您将返回到此 Welcome (Type of Configuration) 屏幕。
Type of Configuration 单击 Finish 退出 NETCA。

Oracle TNS 监听器进程现在应在 RAC 集群的所有节点上运行:

$ hostname
linux1
$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_LINUX1
=====================
$ hostname
linux2
$ ps -ef | grep lsnr | grep -v 'grep' | grep -v 'ocfs' | awk '{print $9}'
LISTENER_LINUX2

返回首页

24. 创建 Oracle 集群数据库

 仅在集群 (linux1) 的一个 Oracle RAC 节点上执行数据库创建过程!

我们将使用 DBCA 创建集群化数据库。

在执行 DBCA 前,确保为 $ORACLE_BASE/product/10.2.0/db_1 环境正确设置了 $ORACLE_HOME 和 $PATH。

在试图开始创建集群化数据库之前,还应确保已安装的所有服务(Oracle TNS 监听器、Oracle 集群件进程等)正在运行。

验证终端 Shell 环境

如前面的章节(创建 TNS 监听器进程)中所讨论的,需要首先为集群中所有节点的远程访问和用户等效性配置终端 shell 环境然后才能运行 Database Configuration Assistant (DBCA)。注意,您可以利用前面的小节中使用的同一终端 shell 会话,您不必采取下面描述的关于设置远程访问和 DISPLAY 变量的任何操作:

 以 oracle 用户帐户登录并设置 DISPLAY(如果需要)

# su - oracle$ # IF YOU ARE USING A REMOTE CLIENT TO CONNECT TO THE$ # NODE PERFORMING THE INSTALL$ DISPLAY=<your local workstation>:0.0$ export DISPLAY
验证远程访问/用户等效性

验证您能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行安全 Shell 命令(ssh 或 scp)或远程 Shell 命令(rsh 和 rcp)。

使用安全 shell 方法时,需要首先在任何新的终端 shell 会话上启用用户等效性然后再尝试运行 OUI。要为当前的终端 shell 会话启用用户等效性,请执行以下步骤(记住为每个键输入在提示时生成的通行短语):

$ exec /usr/bin/ssh-agent $SHELL$ /usr/bin/ssh-addEnter passphrase for /u01/app/oracle/.ssh/id_rsa: xxxxxIdentity added: /u01/app/oracle/.ssh/id_rsa (/u01/app/oracle/.ssh/id_rsa)Identity added: /u01/app/oracle/.ssh/id_dsa (/u01/app/oracle/.ssh/id_dsa)$ ssh linux1 "date;hostname"Wed Sep 13 18:27:17 EDT 2006linux1$ ssh linux2 "date;hostname"Wed Sep 13 18:28:00 EDT 2006linux2
使用远程 shell 方法时,用户等效性通常在 oracle 用户帐户的 /etc/hosts.equiv 文件中定义,在所有新的终端 shell 会话上启用:

$ rsh linux1 "date;hostname"Tue Sep 12 12:37:17 EDT 2006linux1$ rsh linux2 "date;hostname"Tue Sep 12 12:38:00 EDT 2006linux2
运行 Oracle 集群验证实用程序

创建 Oracle 集群化数据库之前,我们应该使用集群验证实用程序 (CVU) 运行以下数据库配置检查。

注意: 有关如何配置 CVU 的说明,可在本文前面的“使用集群验证实用程序的前提条件”一节中找到。

$ cd /u01/app/oracle/orainstall/clusterware/cluvfy
$ ./runcluvfy.sh stage -pre dbcfg -n linux1,linux2 -d ${ORACLE_HOME} -verbose
查看 CVU 报表。注意,该报表将包含我们在检查 CRS 安装前任务时收到的错误:找不到一组合适的 VIP 接口。可以忽略该错误,没什么问题。

创建集群化数据库

要开始数据库创建过程,运行以下命令:

$ dbca &

屏幕名称
回应
欢迎屏幕
选择“Oracle Real Application Clusters database”。
Operations 选择 Create a Database。
Node Selection 单击 Select All 按钮选择所有服务器:linux1 和 linux2。
Database Templates 选择 Custom Database。
Database Identification 选择:
Global Database Name: orcl.idevelopment.info
SID Prefix: orcl
我将 idevelopment.info 用于数据库域。您可以使用任何域。请记住,此域不必为有效的 DNS 域。
Management Option 保留此处的默认选项,即“Configure the Database with Enterprise Manager / Use Database Control for Database Management”。
Database Credentials 我选择 Use the Same Password for All Accounts。输入口令(两次)并确保此口令不是以数字开头。

Storage Options
对于本指南,我们将选择 use Automatic Storage Management (ASM)。
Create ASM Instance 提供要用于新 ASM 实例的 SYS 口令。
此外,从 Oracle 10g 第 2 版开始,ASM 实例服务器参数文件 (SPFILE) 需要位于共享磁盘上。您将需要修改“Create server parameter file (SPFILE)”的默认条目以驻留在 OCFS2 分区上,如下所示:/u02/oradata/orcl/dbs/spfile+ASM.ora。所有其他选项可以保留其默认值。

然后将有一个对话框询问您是否要创建并启动 ASM 实例。选择 OK 按钮确认此对话框。

OUI 将立即在 RAC 集群的所有节点上创建并启动 ASM 实例。

ASM Disk Groups 首先,单击 Create New 按钮。这将弹出“Create Disk Group”窗口,其中显示了我们在前面使用 ASMLib 创建的四个卷。


如果在本文前面部分创建的卷没有显示在“Select Member Disks”窗口中:(ORCL:VOL1、ORCL:VOL2、ORCL:VOL3 和 ORCL:VOL4),则单击“Change Disk Discovery Path”按钮并输入“ORCL:VOL*”。

对于第一个“Disk Group Name”,我使用了字符串“ORCL_DATA1”。在“Select Member Disks”窗口中选择前两个 ASM 卷(ORCL:VOL1 和 ORCL:VOL2)。将“Redundancy”设置为“Normal”。

确认此窗口中的所有值均正确后,单击 [OK] 按钮。这将显示“ASM Disk Group Creation”对话框。完成 ASM 磁盘组创建过程时,您将返回到“ASM Disk Groups”窗口。

再次单击 Create New 按钮。对于第二个“Disk Group Name”,我使用了字符串“FLASH_RECOVERY_AREA”。在“Select Member Disks”窗口中选择后两个 ASM 卷(ORCL:VOL3 和 ORCL:VOL4)。将“Redundancy”设置为“Normal”。

确认此窗口中的所有值均正确后,单击 [OK] 按钮。这将显示“ASM Disk Group Creation”对话框。

完成 ASM 磁盘组创建过程后,您将返回到“ASM Disk Groups”窗口,其中创建并选择了两个磁盘组。使用新建的磁盘组名称“ORCL_DATA1”旁边的复选框选择一个磁盘组(确保未选择“FLASH_RECOVERY_AREA”的磁盘组),然后单击 [Next] 继续。

Database File Locations 我选择使用默认值,即使用 Oracle Managed Files:

Database Area: +ORCL_DATA1

Recovery Configuration 选中“Specify Flash Recovery Area”选项。
对于 Flash Recovery Area,单击 [Browse] 按钮并选择磁盘组名“+FLASH_RECOVERY_AREA”。

我使用的磁盘组的大小约为 118GB。我使用了 117GB 的 Flash Recovery Area Size (117760 MB)。

Database Content 我将所有数据库组件(和目标表空间)设置为它们的默认值,但选择 Example Schemas 也完全可以。由于我们安装了 Oracle 随附 CD 软件,因此该选项可用。
Database Services 对于此测试配置,单击 Add,然后输入 orcltest 作为“Service Name”。将这两个实例设置为 Preferred,并为“TAF Policy”选择“Basic”。
Initialization Parameters 根据您的环境更改任意参数。我保留了所有这些参数的默认设置。
Database Storage 根据您的环境更改任意参数。我保留了所有这些参数的默认设置。
Creation Options 选择默认选项 Create Database,并单击 Finish 启动数据库创建过程。
在“Summary”屏幕上单击 OK。
End of Database Creation 在数据库创建结束时,退出 DBCA。
退出 DBCA 时,将弹出另一对话框,指示它正在启动所有 Oracle 实例以及 HA 服务“orcltest”。这可能需要几分钟的时间才能完成。完成时,所有窗口和对话框将关闭。

完成 DBCA 后,您就启动了一个功能完善的 Oracle RAC 集群!

创建 orcltest 服务

在创建 Oracle 集群化数据库的过程中,您添加了一个名为 orcltest 的服务,我们将用它来连接启用了 TAF 的数据库。在我的多个安装中,均将此服务添加到了 tnsnames.ora 中,但从未将其作为每个 Oracle 实例的服务更新过。

使用以下命令来验证已成功添加 orcltest 服务:

SQL> show parameter service

NAME TYPE VALUE
-------------------- ----------- --------------------------------
service_names string orcl.idevelopment.info, orcltest
如果定义的唯一服务是用于 orcl.idevelopment.info 的,则您将需要手动将此服务添加到两个实例中:
SQL> show parameter service

NAME TYPE VALUE
-------------------- ----------- --------------------------
service_names string orcl.idevelopment.info

SQL> alter system set service_names =
2 'orcl.idevelopment.info, orcltest.idevelopment.info' scope=both;

返回首页
 
 25. 验证 TNS 联网文件

 确保在集群的两个 Oracle RAC 节点上配置 TNS 联网文件!

listener.ora

我们已经在第 23 节中介绍了如何为集群化环境创建 TNS 监听器配置文件 (listener.ora)。应正确配置 listener.ora 文件且无需对它修改。

为清楚起见,我将节点 linux1 的 listener.ora 文件副本包含在了本指南的支持文件中。我还包含了 tnsnames.ora 文件的副本,该文件由 Oracle 配置并可以用于测试透明应用程序故障切换 (TAF)。此文件应已在集群的两个 Oracle RAC 节点上进行了配置。

您可以将这些条目中的任何条目包含在需要访问集群化数据库的其他客户端计算机上。

从外部客户端连接集群化数据库

这是一个可选步骤,但我要执行它以便确认正确配置了 TNS 文件。使用其他安装了 Oracle(9i 或 10g)的计算机(例如,连接网络的 Windows 计算机)并从集群的任一节点添加为集群化数据库创建的 TNS 条目(位于 tnsnames.ora 中)。

然后使用在 tnsnames.ora 文件中定义的所有可用服务名称连接集群化数据库:

C:\> sqlplus system/manager@orcl2
C:\> sqlplus system/manager@orcl1
C:\> sqlplus system/manager@orcltest
C:\> sqlplus system/manager@orcl

返回首页

 26. 创建/更改表空间

 创建集群化数据库时,我们将所有表空间设置为它们的默认大小。如果您将一个大型驱动器用作共享存储,则可能想创建一个大小可以调整的测试数据库。

以下是几个可为测试数据库修改和创建所有表空间的 SQL 命令。请记住,此示例中使用的数据库文件名称(OMF 文件)可能与 Oracle 为您的环境创建的数据库文件名称不同。可以使用以下查询确定环境的文件名:
SQL> select tablespace_name, file_name
2 from dba_data_files
3 union
4 select tablespace_name, file_name
5 from dba_temp_files;

TABLESPACE_NAME FILE_NAME
--------------- --------------------------------------------------
EXAMPLE +ORCL_DATA1/orcl/datafile/example.257.570913311
INDX +ORCL_DATA1/orcl/datafile/indx.270.570920045
SYSAUX +ORCL_DATA1/orcl/datafile/sysaux.260.570913287
SYSTEM +ORCL_DATA1/orcl/datafile/system.262.570913215
TEMP +ORCL_DATA1/orcl/tempfile/temp.258.570913303
UNDOTBS1 +ORCL_DATA1/orcl/datafile/undotbs1.261.570913263
UNDOTBS2 +ORCL_DATA1/orcl/datafile/undotbs2.265.570913331
USERS +ORCL_DATA1/orcl/datafile/users.264.570913355

$ sqlplus "/ as sysdba"

SQL> create user scott identified by tiger default tablespace users;
SQL> grant dba, resource, connect to scott;

SQL> alter database datafile '+ORCL_DATA1/orcl/datafile/users.264.570913355' resize 1024m;
SQL> alter tablespace users add datafile '+ORCL_DATA1' size 1024m autoextend off;

SQL> create tablespace indx datafile '+ORCL_DATA1' size 1024m
2 autoextend on next 50m maxsize unlimited
3 extent management local autoallocate
4 segment space management auto;

SQL> alter database datafile '+ORCL_DATA1/orcl/datafile/system.262.570913215' resize 800m;

SQL> alter database datafile '+ORCL_DATA1/orcl/datafile/sysaux.260.570913287' resize 500m;

SQL> alter tablespace undotbs1 add datafile '+ORCL_DATA1' size 1024m
2 autoextend on next 50m maxsize 2048m;

SQL> alter tablespace undotbs2 add datafile '+ORCL_DATA1' size 1024m
2 autoextend on next 50m maxsize 2048m;

SQL> alter database tempfile '+ORCL_DATA1/orcl/tempfile/temp.258.570913303' resize 1024m;
以下是我为我的测试数据库环境定义的表空间快照:
Status Tablespace Name TS Type Ext. Mgt. Seg. Mgt. Tablespace Size Used (in bytes) Pct. Used
--------- --------------- ------------ ---------- --------- ------------------ ------------------ ---------
ONLINE UNDOTBS1 UNDO LOCAL MANUAL 1,283,457,024 85,065,728 7
ONLINE SYSAUX PERMANENT LOCAL AUTO 524,288,000 275,906,560 53
ONLINE USERS PERMANENT LOCAL AUTO 2,147,483,648 131,072 0
ONLINE SYSTEM PERMANENT LOCAL MANUAL 838,860,800 500,301,824 60
ONLINE EXAMPLE PERMANENT LOCAL AUTO 157,286,400 83,820,544 53
ONLINE INDX PERMANENT LOCAL AUTO 1,073,741,824 65,536 0
ONLINE UNDOTBS2 UNDO LOCAL MANUAL 1,283,457,024 3,801,088 0
ONLINE TEMP TEMPORARY LOCAL MANUAL 1,073,741,824 27,262,976 3
------------------ ------------------ ---------
avg 22
sum 8,382,316,544 976,355,328

8 rows selected.

返回首页

 27. 验证 RAC 集群和数据库配置

 应在集群的两个 Oracle RAC 节点上执行以下 RAC 验证检查!然而,对于本文,我将只从 linux1 执行检查。

本节提供了几个可用于验证 Oracle RAC 10g 配置的 srvctl 命令和 SQL 查询。

有五个为 SRVCTL 定义的节点级任务:

添加和删除节点级应用程序
设置和取消设置节点级应用程序的环境
管理节点应用程序
管理 ASM 实例
启动和停止一组包含虚拟 IP 地址、监听器、Oracle 通知服务和 Oracle 企业管理器代理的程序(出于维护目的)。
所有实例和服务的状态

$ srvctl status database -d orcl
Instance orcl1 is running on node linux1
Instance orcl2 is running on node linux2
单个实例的状态

$ srvctl status instance -d orcl -i orcl2
Instance orcl2 is running on node linux2
在数据库全局命名服务的状态

$ srvctl status service -d orcl -s orcltest
Service orcltest is running on instance(s) orcl2, orcl1
特定节点上节点应用程序的状态

$ srvctl status nodeapps -n linux1
VIP is running on node: linux1
GSD is running on node: linux1
Listener is running on node: linux1
ONS daemon is running on node: linux1
ASM 实例的状态

$ srvctl status asm -n linux1
ASM instance +ASM1 is running on node linux1.
列出配置的所有数据库

$ srvctl config database
orcl
显示 RAC 数据库的配置

$ srvctl config database -d orcl
linux1 orcl1 /u01/app/oracle/product/10.2.0/db_1
linux2 orcl2 /u01/app/oracle/product/10.2.0/db_1
显示指定集群数据库的所有服务

$ srvctl config service -d orcl
orcltest PREF: orcl2 orcl1 AVAIL:
显示节点应用程序的配置 —(VIP、GSD、ONS、监听器)

$ srvctl config nodeapps -n linux1 -a -g -s -l
VIP exists.: /linux1-vip/192.168.1.200/255.255.255.0/eth0:eth1
GSD exists.
ONS daemon exists.
Listener exists.
显示 ASM 实例的配置

$ srvctl config asm -n linux1
+ASM1 /u01/app/oracle/product/10.2.0/db_1
集群中所有正在运行的实例

SELECT
inst_id
, instance_number inst_no
, instance_name inst_name
, parallel
, status
, database_status db_status
, active_state state
, host_name host
FROM gv$instance
ORDER BY inst_id;

INST_ID INST_NO INST_NAME PAR STATUS DB_STATUS STATE HOST
-------- -------- ---------- --- ------- ------------ --------- -------
1 1 orcl1 YES OPEN ACTIVE NORMAL linux1
2 2 orcl2 YES OPEN ACTIVE NORMAL linux2
位于磁盘组中的所有数据文件

select name from v$datafile
union
select member from v$logfile
union
select name from v$controlfile
union
select name from v$tempfile;

NAME
-------------------------------------------
+FLASH_RECOVERY_AREA/orcl/controlfile/current.258.570913191
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_1.257.570913201
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_2.256.570913211
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_3.259.570918285
+FLASH_RECOVERY_AREA/orcl/onlinelog/group_4.260.570918295
+ORCL_DATA1/orcl/controlfile/current.259.570913189
+ORCL_DATA1/orcl/datafile/example.257.570913311
+ORCL_DATA1/orcl/datafile/indx.270.570920045
+ORCL_DATA1/orcl/datafile/sysaux.260.570913287
+ORCL_DATA1/orcl/datafile/system.262.570913215
+ORCL_DATA1/orcl/datafile/undotbs1.261.570913263
+ORCL_DATA1/orcl/datafile/undotbs1.271.570920865
+ORCL_DATA1/orcl/datafile/undotbs2.265.570913331
+ORCL_DATA1/orcl/datafile/undotbs2.272.570921065
+ORCL_DATA1/orcl/datafile/users.264.570913355
+ORCL_DATA1/orcl/datafile/users.269.570919829
+ORCL_DATA1/orcl/onlinelog/group_1.256.570913195
+ORCL_DATA1/orcl/onlinelog/group_2.263.570913205
+ORCL_DATA1/orcl/onlinelog/group_3.266.570918279
+ORCL_DATA1/orcl/onlinelog/group_4.267.570918289
+ORCL_DATA1/orcl/tempfile/temp.258.570913303

21 rows selected.
属于“ORCL_DATA1”磁盘组的所有 ASM 磁盘

SELECT path
FROM v$asm_disk
WHERE group_number IN (select group_number
from v$asm_diskgroup
where name = 'ORCL_DATA1');

PATH
----------------------------------
ORCL:VOL1
ORCL:VOL2

返回首页

 28. 启动/停止集群

 此时,我们已经完全安装并配置了 Oracle RAC 10g 并拥有了一个功能完善的集群化数据库。

至此完成所有工作后,您可能会问“那我又怎样启动和停止服务呢?”如果您遵循了本指南中的说明,则所有服务(包括 Oracle 集群件、所有 Oracle 实例、企业管理器数据库控制台等)应在 Linux 节点每次重新引导时自动启动。

但有时您可能想要关闭某个节点,然后手动重新启动它。或者,您可能发现企业管理器没有启动它而需要启动它。本节提供了启动和停止集群环境的命令(使用 SRVCTL)。

确保您是以 oracle UNIX 用户登录的。我们将从 linux1 运行本节中的所有命令:

# su - oracle$ hostnamelinux1
停止 Oracle RAC 10g 环境

第一步是停止 Oracle 实例。当此实例(和相关服务)关闭后,关闭 ASM 实例。最后,关闭节点应用程序(虚拟 IP、GSD、TNS 监听器和 ONS)。

$ export ORACLE_SID=orcl1
$ emctl stop dbconsole
$ srvctl stop instance -d orcl -i orcl1
$ srvctl stop asm -n linux1
$ srvctl stop nodeapps -n linux1
启动 Oracle RAC 10g 环境

第一步是启动节点应用程序(虚拟 IP、GSD、TNS 监听器和 ONS)。当成功启动节点应用程序后,启动 ASM 实例。最后,启动 Oracle 实例(和相关服务)以及企业管理器数据库控制台。

$ export ORACLE_SID=orcl1
$ srvctl start nodeapps -n linux1
$ srvctl start asm -n linux1
$ srvctl start instance -d orcl -i orcl1
$ emctl start dbconsole
使用 SRVCTL 启动/停止所有实例

启动/停止所有实例及其启用的服务。我只是觉得有意思就把此步骤作为关闭所有实例的一种方法加进来了!

$ srvctl start database -d orcl
$ srvctl stop database -d orcl

返回首页

 29. 透明的应用程序故障切换 (TAF)

 企业通常需要他们的企业应用程序提供 99.99%(甚至 99.999%)的可用性。想一想,要确保全年停机时间不超过 0.5 小时或者甚至没有停机时间得花费多大代价!为了满足众多这种高可用性要求,企业正投资于可以在一个参与系统出现故障时提供自动故障切换的机制。就 Oracle 数据库的可用性而言,Oracle RAC 10g 通过它的高级故障切换机制提供了一个卓越的解决方案。Oracle RAC 10g 包含了提供持续可用性所需的必要组件,这些组件均在一个集群配置中工作;当集群中的某个参与系统出现故障时,将把用户自动移植到其他可用系统。

透明的应用程序故障切换 (TAF) 选件是 Oracle RAC 10g 一个负责处理故障切换的主要组件。它将把所有断开的数据库连接(和进程)重新连接到集群的其他节点上。故障切换对用户是完全透明的。

这最后一节简短介绍了 TAF 在 Oracle RAC 10g 中的工作方式。请注意,对 Oracle RAC 10g 中的故障切换进行全面介绍可能需要单独的一篇文章,我在此处只想提供一个简短概述。

一个重要的说明是,TAF 自动在 OCI 库中发生。也就是说,您的应用程序(客户端)代码不需要更改便可以利用 TAF。但您需要在 Oracle TNS 文件 tnsnames.ora 中执行某些配置步骤。(请记住,直到编写本文时,由于 Java 瘦客户端从不读取 tnsnames.ora,因此它将无法参与 TAF。)

设置 tnsnames.ora 文件

在演示 TAF 之前,我们需要验证在一个非 RAC 客户端计算机(如果您有一台安装了 Windows 计算机)上的 tnsnames.ora 文件中存在一个有效的条目。确保您安装了 Oracle RDBMS 软件。(实际上,您只需要在客户端上安装 Oracle 软件。)

在本指南的创建集群化数据库过程中,我们创建了一个将用于测试 TAF 的名为 ORCLTEST 的新服务。它为负载均衡和故障切换提供了所有必需的配置参数。可以将此条目的内容复制到客户端计算机(本示例中使用了我的 Windows 便携式计算机)上的 %ORACLE_HOME%\network\admin\tnsnames.ora 文件中:

...
ORCLTEST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = linux1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = linux2-vip)(PORT = 1521))
(LOAD_BALANCE = yes)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcltest.idevelopment.info)
(FAILOVER_MODE =
(TYPE = SELECT)
(METHOD = BASIC)
(RETRIES = 180)
(DELAY = 5)
)
)
)
...
查看会话的故障切换信息的 SQL 查询
以下 SQL 查询可以用来查看一个会话的故障切换类型、故障切换方法和是否发生了故障切换。我们将在这个例子中自始至终使用这个查询。

COLUMN instance_name FORMAT a13
COLUMN host_name FORMAT a9
COLUMN failover_method FORMAT a15
COLUMN failed_over FORMAT a11

SELECT
instance_name
, host_name
, NULL AS failover_type
, NULL AS failover_method
, NULL AS failed_over
FROM v$instance
UNION
SELECT
NULL
, NULL
, failover_type
, failover_method
, failed_over
FROM v$session
WHERE username = 'SYSTEM';
TAF 演示

从 Windows 计算机(或其他非 RAC 客户端计算机)中,以 SYSTEM 用户登录使用 orcltest 服务的集群化数据库:

C:\> sqlplus system/manager@orcltest

COLUMN instance_name FORMAT a13
COLUMN host_name FORMAT a9
COLUMN failover_method FORMAT a15
COLUMN failed_over FORMAT a11

SELECT
instance_name
, host_name
, NULL AS failover_type
, NULL AS failover_method
, NULL AS failed_over
FROM v$instance
UNION
SELECT
NULL
, NULL
, failover_type
, failover_method
, failed_over
FROM v$session
WHERE username = 'SYSTEM';

INSTANCE_NAME HOST_NAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
------------- --------- ------------- --------------- -----------
orcl1 linux1
SELECT BASIC NO
不要注销上面的 SQL*Plus 会话!

我们已经运行了上面的查询,现在我们应该使用 abort 选项来关闭 linux1 上的 orcl1 实例。要执行这一操作,您可以使用 srvctl 命令行实用程序,如下所示:

# su - oracle
$ srvctl status database -d orcl
Instance orcl1 is running on node linux1
Instance orcl2 is running on node linux2

$ srvctl stop instance -d orcl -i orcl1 -o abort

$ srvctl status database -d orcl
Instance orcl1 is not running on node linux1
Instance orcl2 is running on node linux2
现在我们返回到我们的 SQL 会话,然后重新运行缓冲中的 SQL 语句:
COLUMN instance_name FORMAT a13
COLUMN host_name FORMAT a9
COLUMN failover_method FORMAT a15
COLUMN failed_over FORMAT a11

SELECT
instance_name
, host_name
, NULL AS failover_type
, NULL AS failover_method
, NULL AS failed_over
FROM v$instance
UNION
SELECT
NULL
, NULL
, failover_type
, failover_method
, failed_over
FROM v$session
WHERE username = 'SYSTEM';


INSTANCE_NAME HOST_NAME FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER
------------- --------- ------------- --------------- -----------
orcl2 linux2
SELECT BASIC YES

SQL> exit
从上面的演示中,我们可以看到现在已将上述会话故障切换到了 linux2 的实例 orcl2 上。

返回首页

 30. 故障诊断

 OCFS2 — 将 O2CB 配置为在引导时启动

OCFS2 1.2.1 之前的版本中包含一个错误,即不会在每次引导时加载驱动程序,即使将引导属性配置为执行此操作后也是如此。在尝试根据正式的 OCFS2 文档将引导属性配置为在每次引导时启动后,您在每次引导时将仍收到以下错误:
...
Mounting other filesystems:
mount.ocfs2: Unable to access cluster service

Cannot initialize cluster mount.ocfs2:
Unable to access cluster service Cannot initialize cluster [FAILED]
...
Red Hat 更改了在 chkconfig-1.3.11.2-1 与 chkconfig-1.3.13.2-1 之间注册服务的方式。O2CB 脚本习惯使用前者。
在尝试配置引导属性之前:


删除 /etc/init.d/o2cb 中的以下几行
### BEGIN INIT INFO
# Provides: o2cb
# Required-Start:
# Should-Start:
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop:
# Description: Load O2CB cluster services at system boot.
### END INIT INFO

重新注册 o2cb 服务。
# chkconfig --del o2cb
# chkconfig --add o2cb
# chkconfig --list o2cb
o2cb 0:off 1:off 2:on 3:on 4:on 5:on 6:off

# ll /etc/rc3.d/*o2cb*
lrwxrwxrwx 1 root root 14 Sep 29 11:56 /etc/rc3.d/S24o2cb -> ../init.d/o2cb
该服务应为默认运行级别中的 S24o2cb。
解决上面列出的错误后,可以继续设置引导属性,如下所示:
# /etc/init.d/o2cb offline ocfs2
# /etc/init.d/o2cb unload
# /etc/init.d/o2cb configure
Configuring the O2CB driver.

This will configure the on-boot properties of the O2CB driver.
The following questions will determine whether the driver is loaded on
boot. The current values will be shown in brackets ('[]'). Hitting
without typing an answer will keep that current value. Ctrl-C
will abort.

Load O2CB driver on boot (y/n) [n]: y
Cluster to start on boot (Enter "none" to clear) [ocfs2]: ocfs2
Writing O2CB configuration: OK
Loading module "configfs": OK
Mounting configfs filesystem at /config: OK
Loading module "ocfs2_nodemanager": OK
Loading module "ocfs2_dlm": OK
Loading module "ocfs2_dlmfs": OK
Mounting ocfs2_dlmfs filesystem at /dlm: OK
Starting cluster ocfs2: OK
OCFS2 — 调整 O2CB 心跳阈值

在本文之前的版本中(与将 iSCSI 用作共享存储相反,将 FireWire 用作共享存储),我能够安装和配置 OCFS2、格式化新卷并最后安装位于新 OCFS2 卷上的 Oracle 集群件(及其所需的两个共享文件,即表决磁盘和 OCR 文件)。我能够安装 Oracle 集群件并可以使用 FireWire 看到共享驱动器,但当集群件软件在两个节点上运行大约 15 分钟后,我收到了许多锁定和挂起。挂起的节点总是变化不定(在我的示例中为 linux1 或 linux2)。此外,无论是 I/O 负载较高还是根本没有,对该节点崩溃(挂起)都没有影响。
查看 OCFS2 的跟踪文件后,对表决磁盘的访问显然太慢(超过了 O2CB 心跳阈值)并导致 Oracle 集群件软件(以及节点)崩溃。

我所使用的解决方案只是将 O2CB 心跳阈值从其默认设置 7 增大为 61。某些设置可能需要更高的设置。这是一个可配置参数,用于计算节点“隔离”自身所用的时间。本文的“调整 O2CB 心跳阈值”一节对增大 O2CB 心跳阈值所需的任务进行了全面的说明。

Oracle 集群件(10g RAC 10.1.0.3 和更高版本)— CSS 超时计算

本节适用于 Oracle10g R1(10.1.0.3 和更高版本)和 Oracle10g R2(本文所基于的 Oracle 版本)。请注意,我不需要执行本文的本节中记录的任何步骤即可工作。包括本内容只是出于说明目的,只有在极少数情况下您的 RAC 系统上才会出现所描述的现象。有关 RAC 10g 中 CSS 超时计算的更详细的当前概述,请参见 Metalink 说明 294430.1。
在某些情况下,安装了 Oracle 集群件软件之后,您将需要修改集群件的 CSS 超时值。然而,对于 Oracle10g R2 和更高版本无需进行此操作。Oracle10g R2 用户应改为应用补丁 4896338,而不修改默认的 misscount 值。对于 10.1.0.3 和更高版本,CSS 超时的计算方法与 10.1.0.2 不同。从 Linux 平台(包括 IA32、IA64 和 x86-64)上的 Oracle 10.1.0.3 开始,已发现因 CSS 后台程序超时引起的多个问题。这在过去一直是困扰我的一大难题,尤其是在创建数据库 (DBCA) 并将 FireWire 用作共享存储时。例如,数据库创建过程经常因以下错误而失败:ORA-03113:end-of-file on communication channel。关键错误在日志文件 $ORA_CRS_HOME/css/log/ocssd1.log 中记录为:

clssnmDiskPingMonitorThread: voting device access hanging (45010 miliseconds)
实际上,问题源于慢速磁盘以及 CSS misscount 的默认值。CSS misscount 值表示在 CSS 删除节点前未收到的心跳数。CSS 使用该数值计算表决磁盘的 I/O 操作应被视为超时 的时间,从而将其终止以防止裂脑情况的出现。在 Linux 上,Oracle 10.1.0.2 和更高版本的 CSS misscount 的默认值为 60。但 10.1.0.2 版与 10.1.0.3 版的超时值(秒)计算公式并不相同。
10.1.0.2 的超时值计算公式如下:

time_in_secs > CSS misscount, then EXIT
例如,在使用默认值 60 时,超时将为 60 秒。
从 10.1.0.3 开始,该公式更改为:

disktimeout_in_secs = MAX((3 * CSS misscount)/4, CSS misscount - 15)
如果再次使用 CSS misscount 的默认值 60,则超时将为 45 秒。
之所以进行此更改,是为了当节点出现故障时能够更快地重新配置集群。当在 10.1.0.2 中使用 CSS misscount 的默认值 60 时,我们将必须至少等待 60 秒才能超时,但从 10.1.0.3 开始,同一默认值 60 可以减少 15 秒,即 45 秒。

说来说去为什么总是围绕 CSS misscount 呢?正如我在前面指出的,我所执行的数据库创建过程(或对系统执行的其他高 I/O 负载操作)通常会因为 Oracle 集群件崩溃而出现故障。高 I/O 将导致 CSS 在尝试查询表决磁盘时的超时很长。超过计算的超时时,Oracle 集群件将崩溃。当我使用的网络和外部驱动器不是最快的时候,这种情况很常见。对共享驱动器的访问越慢,这种情况就越经常出现。

但一个好消息是,我们可以修改 CSS misscount 值的默认值 60(对于 Linux)实现更长的超时。对于较慢的驱动器,我已经能够将 CSS misscount 值设置为 360。尽管我无法对此进行验证,但我相信可以将 CSS misscount 设置为 600。

请注意,Oracle 支持不建议修改 misscount 值。他们始终建议您应用可更改 CSS 行为的最新补丁集(不会因为表决磁盘的 I/O 需要的时间超过 misscount 秒数就从集群删除节点,除非是在初始集群形成期间或者在即将重新配置之前)。

还有一点值得注意的是,使用 Oracle10g R2 根本不需要增大 misscount。从 10.2.0.1 + 错误 4896338 开始,CSS 不会因为 (IOT) 表决磁盘的 I/O 需要的时间超过 misscount 秒数就从集群删除节点,除非是在初始集群形成期间或者在即将重新配置之前。因此,如果我们的一个集群中有 N 个节点,其中一个节点访问表决磁盘所需的时间超过 misscount 秒数,只要该节点对表决磁盘的访问在 disktimeout 秒数内完成,就不会删除该节点。因此,使用该补丁根本不需要增大 misscount。

那如果使用的是 10g R1,如何修改 CSS misscount 的默认值呢?方法有很多。最简单的方法是在安装 Oracle 集群件之后但是在集群中的两个 Oracle RAC 节点上运行 root.sh 脚本“之前”修改 $ORA_CRS_HOME/install/rootconfig 脚本。例如,要将 CSS misscount 条目从 60 修改为 360,请按如下所示修改文件 $ORA_CRS_HOME/install/rootconfig(在集群中的两个 Oracle RAC 节点上)。将位于第 356 行上的以下条目:

CLSCFG_MISCNT="-misscount 60"
更改为
CLSCFG_MISCNT="-misscount 360"
如果已经安装了 Oracle 集群件,则仍可以使用 $ORA_CRS_HOME/bin/crsctl 命令修改 CSS misscount 值。首先,应该查询 CSS misscount 的当前值:

# $ORA_CRS_HOME/bin/crsctl get css misscount
360
如果收到值 60,则可将它修改为 360,如下所示:

只启动集群中的一个节点。就我的示例而言,我将关闭 linux2 并只启动 linux1。
从一个节点 (linux1) 中,以 root 用户帐户的身份登录并键入:
$ORA_CRS_HOME/bin/crsctl set css misscount 360
重新引导此单个节点 (linux1)。
启动集群中的所有其他节点。

返回首页

 31. 结论
Oracle10g RAC 允许 DBA 配置一个拥有优越的容错和负载平衡功能的数据库解决方案。然而,对于那些希望更熟悉 Oracle10g RAC 的特性和优势的 DBA 而言,他们将发现即使一个小型 RAC 集群的配置成本也在 15,000 美元到 20,000 美元之间。

本文希望为您提供一个低成本的解决方案,通过该方案可使用 CentOS 4 Linux(或 Red Hat Enterprise Linux 4)和 iSCSI 技术安装和配置经济实惠的 Oracle10g 第 2 版 RAC 集群。本文介绍的 RAC 解决方案总共需要大约 2,200 美元,但可以为 DBA 提供一个功能完善的 Oracle10g 第 2 版 RAC 集群。虽然本文使用的硬件对于教学目的而言足够稳定,但永远不应认为其适用于生产环境。

返回首页

 32. 致谢
像这样篇幅和复杂程度的文章通常并非出自一人之手。尽管本人能够编写并成功演示构成此配置的组件的有效性,但我还是要感谢其他几个帮助我成功编写本文的人。

首先,我要感谢来自 Oracle Corporation 的 Server BDE 团队的 Bane Radulovic。Bane 不仅向我介绍了 Openfiler,还与我共享了他对于该产品以及如何针对 Oracle10g RAC 最好地利用它的经验和知识。他的研究和辛苦工作使得配置 Openfiler 的任务得以圆满完成。Bane 还参与了硬件建议和测试。

接下来,我要感谢 Werner Puschitz 在“在 Red Hat Enterprise Linux Advanced Server 3 上安装具有真正应用服务器集群 (RAC) 的 Oracle 数据库 10g”一文中所做的杰出贡献。本文以及他撰写的其他几篇文章提供的有关 Oracle10g RAC 的信息在任何其他 Oracle 文档中都是无法找到的。没有他的辛苦工作以及对配置和安装 hangcheck-timer 内核模块、正确配置 Unix 共享内存以及配置 ASMLib 等问题的研究,本指南也许根本无法完成。如果您有兴趣拜读 Werner Puschitz 撰写的有关 Linux 内部结构以及 Oracle 深入配置方面的技术文章,请访问他出色的网站 www.puschitz.com。

另外,还要感谢 Tzvika Lemel 就如何使用 Oracle 的集群验证实用程序 (CVU) 提出的意见和建议。

最后,我想表达对以下供应商的感谢,他们慷慨地为本文提供了硬件:Maxtor、D-Link、SIIG 以及 LaCie。

Jeffrey Hunter [www.idevelopment.info] 毕业于位于特洛克的加利福尼亚州立大学的 Stanislaus 分校,获得了计算机科学学士学位,曾经当过 12 年以上的高级 DBA 和软件工程师。他是一位 Oracle 认证专家、Java 开发认证专家、Oracle ACE 和作家,当前作为高级数据库管理员就职于 The DBA Zone, Inc.。Jeff 的工作包括高级性能调节、Java 和 PL/SQL 编程、容量规划、数据库安全性以及 UNIX、Linux 和 Windows NT 环境中的物理/逻辑数据库设计。Jeff 的其他兴趣还涉及数学加密理论、Java 和 C 的编程语言处理器(编译器和解释器)、LDAP、编写基于 Web 的数据库管理工具,当然还有 Linux。

 

 


版权所有:UML软件工程组织