在 Linux 和 FireWire 上创建自己的 RAC 集群(续)
获取并安装合适的 Linux 内核
概述
接下来的步骤是获取并安装新的 Linux 内核,该内核利用多次登录,支持使用 IEEE1394 设备。在本文先前的版本中,包含有关于下载 Linux 内核的一个补丁版本并对其进行编译的步骤。由于 Oracle 的 Linux 项目开发组 的工作,已经不再需要这些步骤了。他们提供了一个 Red Hat Enterprise Linux 3.0 的预编译内核(它也可以与 Fedora 协同工作),只需下载并安装即可。本部分包含了下载和安装该内核的说明。不过,在开始详细说明如何执行这些操作之前,让我们先用一些时间来讨论在新内核中需要进行的更改。
尽管已经有了针对 Linux 的 FireWire 驱动程序,但它们常常不支持 共享 存储器。通常,当您登录到操作系统时,操作系统将驱动程序与该机器上具体的一个驱动器相连。这种实施方法根本不能用于我们的 RAC 配置。共享存储器(我们的 FireWire 硬盘驱动器)需要被多个节点所访问。我们需要使 FireWire 驱动程序能够提供对驱动器的非独占访问,以便多个服务器 — 即组成集群的节点 — 能够访问同一个存储器。通过在源代码中删除位掩码 ( 该掩码用于在登录期间识别机器 ) ,可以完成这项任务。这样可以对 FireWire 硬盘驱动器进行非独占的访问。集群中的所有其他节点在其登录会话期间,使用相同的经过修改的驱动程序登录到同一个驱动器,因此它们也具有对于该驱动器的非独占访问权。
可能我过早地提到了这个问题,但我希望在深入说明新的 Linux 内核安装细节之前先讨论几个主题。当我们安装新的 Linux 内核(支持对 FireWire 驱动器的多次登录)时,系统将会检测 FireWire 相连的驱动器并将其识别为 SCSI 设备。您将能够使用标准的操作系统工具对磁盘进行分区、创建文件系统等。对于 Oracle9 i RAC ,您必须为所有文件建立分区,并将原始设备绑定到这些分区。本文将利用逻辑卷管理器 (LVM) 在 FireWire 共享驱动器上建立所有所需的分区(通常称为 逻辑分区 )。
我们的实施方法描述了一个双节点集群(每个节点具有一个单独的处理器),每个服务器都运行 Red Hat Linux Fedora Core 1 。切记,在 两个 Linux 节点上都需要安装打过补丁的 Linux 内核。 Red Hat Linux Fedora Core 1 包含内核 linux- 2.4.22 -1.2115.nptl ;我们需要从以下 URL 处下载 Oracle 提供的 2.4.21-9.0.1 Linux 内核: http://oss.oracle.com/projects/firewire/files 。
在集群的两个节点上执行以下过程:
• 下载以下的文件之一:
kernel- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于单处理器
— 或者 —
kernel-smp- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于多处理器
• 备份您的 GRUB 配置文件:
在大多数情况下,您要将 GRUB 用于引导加载器。在实际安装新内核之前,请确保备份您的 /etc/grub.conf 文件的一个拷贝:
# cp /etc/grub.conf /etc/grub.conf.original
• 以用户 root 安装新内核:
# rpm -ivh --force kernel- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于单处理器
— 或者 —
# rpm -ivh --force kernel-smp- 2.4.21 -9.0.1.ELorafw1.i686.rpm — 用于多处理器
注意: 使用 RPM 来安装新内核还会利用合适的片段来更新您的 grub 或 lilo 配置。除非您希望保留旧的内核镜像,否则不需要向您的引导加载器配置中添加任何新的片段。
以下是我的 /etc/grub.conf 文件在内核安装之前和之后的清单。您可以看到,在我的安装中,我在 2.4.21 -9.0.1.ELorafw1 内核中加入了另一个片段。如果您愿意,可以更改新文件中的( default )项,这样新内核将成为启动的默认内核。在默认情况下,安装程序设置 default=1 ,继续将旧内核作为默认内核。
Fedora Core 1 的原始 /etc/grub.conf 文件
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:You have a /boot partition.This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda3
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Fedora Core ( 2.4.22 -1.2115.nptl)
root (hd0,0)
kernel /vmlinuz- 2.4.22 -1.2115.nptl ro root=LABEL=/ rhgb
initrd /initrd- 2.4.22 -1.2115.nptl.img
在安装内核后, Fedora Core 1 的新配置的 /etc/grub.conf 文件
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:You have a /boot partition.This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda3
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title Fedora Core ( 2.4.21 -9.0.1.ELorafw1)
root (hd0,0)
kernel /vmlinuz- 2.4.21 -9.0.1.ELorafw1 ro root=LABEL=/ rhgb
initrd /initrd- 2.4.21 -9.0.1.ELorafw1.img
title Fedora Core ( 2.4.22 -1.2115.nptl)
root (hd0,0)
kernel /vmlinuz- 2.4.22 -1.2115.nptl ro root=LABEL=/ rhgb
initrd /initrd- 2.4.22 -1.2115.nptl.img
• 添加模块选项:
将以下各行添加到 /etc/modules.conf 中:
options sbp2 sbp2_exclusive_login=0
post-install sbp2 insmod sd_mod
post-remove sbp2 rmmod sd_mod
将串行总线协议模块 ( sbp2 ) 的参数 sbp2_exclusive_login 设置为零是非常重要的,以便允许多个主机并发地登录和访问 FireWire 磁盘。第二行确保 SCSI 磁盘驱动程序模块 ( sd_mod ) 也会被加载,因为 ( sbp2 ) 需要 SCSI 层。如果 ( sd_mod ) 加载,则会自动加载核心的 SCSI 支持模块 ( scsi_mod ) — 不必为它创建单独的项。
• 重新启动机器
重新启动您的机器,进入新的内核。请确保 firewire (ieee1394) pci 卡已插入到机器中!
• 加载 firewire 堆栈
在大多数情况下,在 /etc/rc.sysinit 文件中已经对 FireWire 堆栈加载进行了配置。该文件中所包含的用于加载 FireWire 堆栈的命令是:
# modprobe ohci1394
# modprobe sbp2
在 Red Hat 的旧版本中,情况有所不同,必须手动运行这些命令或者将其包含在启动文件中。在 Fedora Core 1 和更高版本中,这些命令已经包含在 /etc/rc.sysinit 文件中,并在每次启动时运行。
• 重新扫描 SCSI 总线
在内核的旧版本中,我需要运行 rescan-scsi-bus.sh 脚本来检测 FireWire 驱动器。此脚本的目的是通过使用以下命令为节点创建 SCSI 项:
echo "scsi add-single-device 0 0 0 0" > /proc/scsi/scsi
使用 Fedora Core 1 时,应该可以自动检测到磁盘。
• 检查 SCSI 设备
重新启动机器后,内核应该自动将磁盘检测为 SCSI 设备 ( /dev/sdXX ) 。本部分提供了几个命令,这些命令应该在集群的两个节点上运行,以确保成功地检测到 FireWire 驱动器。
在这个配置中,我同时在两个节点上执行以上的过程。在过程完成后,我关闭两台机器,首先启动 linux1 ,然后启动 linux2 。以下的命令和结果来自于我的 linux2 机器。同样,请确认您在两个节点上都运行了以下的命令,以确保两台机器都能登录到共享驱动器。
首先查看该 FireWire 适配器是否已被成功地检测到:
# lspci
00:00.0 Host bridge:Intel Corp. 82845 845 (Brookdale) Chipset Host Bridge (rev 11)
00:01.0 PCI bridge:Intel Corp. 82845 845 (Brookdale) Chipset AGP Bridge (rev 11)
00:1d.0 USB Controller:Intel Corp. 82801DB USB (Hub #1) (rev 01)
00:1d.1 USB Controller:Intel Corp. 82801DB USB (Hub #2) (rev 01)
00:1d.2 USB Controller:Intel Corp. 82801DB USB (Hub #3) (rev 01)
00:1d.7 USB Controller:Intel Corp. 82801DB USB2 (rev 01)
00:1e.0 PCI bridge:Intel Corp. 82801BA/CA/DB/EB PCI Bridge (rev 81)
00: 1f .0 ISA bridge:Intel Corp. 82801DB LPC Interface Controller (rev 01)
00: 1f .1 IDE interface:Intel Corp. 82801DB Ultra ATA Storage Controller (rev 01)
00: 1f .3 SMBus:Intel Corp. 82801DB/DBM SMBus Controller (rev 01)
01:00.0 VGA compatible controller:nVidia Corporation NV34 [GeForce FX 5200] (rev a1)
02:00.0 Ethernet controller:Linksys Network Everywhere Fast Ethernet 10/100 model NC100 (rev 11)
02:01.0 FireWire (IEEE 1394): Texas Instruments TSB12LV26 IEEE-1394 Controller (Link)
02:05.0 Ethernet controller:Realtek Semiconductor Co., Ltd. RTL-8139/ 8139C / 8139C + (rev 10)
02:07.0 Multimedia audio controller:C-Media Electronics Inc CM8738 (rev 10)
第二步,查看这些模块是否已被加载:
# lsmod |egrep "ohci1394|sbp2|ieee1394|sd_mod|scsi_mod"
sd_mod 13808 0
sbp2 20556 0
scsi_mod 109864 3 [sg sd_mod sbp2]
ohci1394 28904 0 (unused)
ieee1394 63652 0 [sbp2 ohci1394]
第三步,确认已检测到磁盘并由内核创建了一个项目:
# cat /proc/scsi/scsi
Attached devices:
Host:scsi0 Channel:00 Id:00 Lun: 00
Vendor:Maxtor Model:OneTouch Rev: 0200
Type:Direct-Access
现在让我们确认 FireWire 驱动器可以被多个登录所访问,并显示有效的登录:
# dmesg | grep sbp2
ieee1394:sbp2:Query logins to SBP-2 device successful
ieee1394:sbp2:Maximum concurrent logins supported: 3
ieee1394:sbp2:Number of active logins: 2
ieee1394:sbp2:Logged into SBP-2 device
ieee1394:sbp2:Node[01:1023]:Max speed [S400] - Max payload [2048]
ieee1394:sbp2:Reconnected to SBP-2 device
ieee1394:sbp2:Node[01:1023]:Max speed [S400] - Max payload [2048]
从以上输出中,您可以看到我们拥有的 FireWire 驱动器能够支持来自多达 3 个服务器的并发登录。您的驱动器的芯片组应该支持 RAC 集群中所有节点的并发访问,这很重要。
• 对 SCSI 设备检测的故障诊断
如果您在检测 SCSI 设备的任何步骤(如上所述)中遇到问题,可以尝试以下操作:
# modprobe -r sbp2
# modprobe -r sd_mod
# modprobe -r ohci1394
# modprobe ohci1394
# modprobe sd_mod
# modprobe sbp2
创建 “oracle” 用户和目录(在两个节点上执行)
让我们继续我们的示例,创建 UNIX dba 组和 oracle 用户 id 以及所有的相关目录。
# mkdir /u01
# mkdir /u01/app
# groupadd -g 115 dba
# useradd -u 175 -g 115 -d /u01/app/oracle -s /bin/bash -c "Oracle Software Owner" -p oracle oracle
注意: 当您为每个 RAC 节点设置 Oracle 环境变量时,请确保为每个 RAC 节点分配唯一的 Oracle SID !
对于此示例,我使用:
- linux1 : ORACLE_SID=orcl1
- linux2 : ORACLE_SID=orcl2
注意: Oracle Universal Installer (OUI) 在 /tmp 目录中需要最多 400MB 空闲空间。
您可以通过运行以下命令来查看 /tmp 中的可用空间:
# df -k /tmp
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/hda3 36384656 6224240 28312140 19% /
如果因为某种原因,您在 /tmp 中没有足够的空间,则可以临时在其他文件系统中创建空间,并在安装期间将您的 TEMP 和 TMPDIR 指向该空间。以下是完成此任务的步骤:
# su -
# mkdir /<AnotherFilesystem>/tmp
# chown root.root /<AnotherFilesystem>/tmp
# chmod 1777 /<AnotherFilesystem>/tmp
# export TEMP=/<AnotherFilesystem>/tmp # used by Oracle
# export TMPDIR=/<AnotherFilesystem>/tmp # used by Linux programs
# like the linker "ld"
当 Oracle 的安装完成时,您可以使用以下命令删除该临时目录:
# su -
# rmdir /<AnotherFilesystem>/tmp
# unset TEMP
# unset TMPDIR
在两个节点上都创建了 “ oracle ”UNIX 用户 id 后,通过使用以下的 .bash_profile ,确保正确地建立了环境:
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
alias ls="ls -FA"
# User specific environment and startup programs
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/ 9.2.0
# Each RAC node must have a unique ORACLE_SID.(i.e. orcl1, orcl2,...)
export ORACLE_SID=orcl1
export PATH=.:${PATH}:$HOME/bin:$ORACLE_HOME/bin
export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin
export ORACLE_TERM=xterm
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib
export CLASSPATH=$ORACLE_HOME/JRE
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib
export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib
export THREADS_FLAG=native
export TEMP=/tmp
export TMPDIR=/tmp
export LD_ASSUME_KERNEL= 2.4.1