在集群中的两个 Oracle RAC 节点上配置 iSCSI 启动器。而创建分区只应在 RAC 集群的一个节点上执行。
iSCSI 客户端可以是提供 iSCSI 支持(驱动程序)的任何系统(Linux、Unix、MS Windows、Apple Mac 等)。在我们的示例中,客户端是两个 Linux 服务器(racnode1 和 racnode2),它们运行的是 Oracle Enterprise Linux 5.4。
在本节中,我们将在两个 Oracle RAC 节点上配置 iSCSI 软件启动器。Oracle Enterprise Linux 5.4 包括 Open-iSCSI iSCSI 软件启动器,该软件启动器位于 iscsi-initiator-utils RPM 中。这是对早期版本 Oracle Enterprise Linux (4.x) 的一个更改,这些早期版本中包含作为 Linux-iSCSI 项目的一部分而开发的 Linux iscsi-sfnet 软件驱动程序。所有 iSCSI 管理任务(如发现和登录)将使用 Open-iSCSI 中包含的命令行接口 iscsiadm。
iSCSI 软件启动器将配置为自动登录网络存储服务器 (openfiler1),并发现 上一节中创建的 iSCSI 卷。之后,我们将逐步使用 udev 为发现的每个 iSCSI 目标名称创建永久性本地 SCSI 设备名称(即 /dev/iscsi/crs1)。拥有一致的本地 SCSI 设备名称及其映射到的 iSCSI 目标,有助于在配置 ASM 时能够区分三个卷。但是,在此之前,我们首先必须安装 iSCSI 启动器软件。
注:本指南使用 ASMLib 2.0,它是 Oracle Database 的自动存储管理 (ASM) 特性的一个支持库。ASMLib 将用于对本指南中所使用的所有 iSCSI 卷进行标记。默认情况下,ASMLib 已为 ASM 使用的存储设备提供了永久性路径和权限。有了该特性后,无需用存储设备路径和权限更新 udev 或 devlabel 文件。就本文来说,实际上我仍然选择使用 udev 为发现的每个 SCSI 目标名称创建永久性本地 SCSI 设备名称。这提供了一种自我文档编制的方法,有助于快速确定每个卷的名称和位置。
安装 iSCSI(启动器)服务
就 Oracle Enterprise Linux 5.4 来说,默认情况下不会安装 Open-iSCSI iSCSI 软件启动器。该软件包含在 1 号 CD 上的 iscsi-initiator-utils 程序包中。要确定该程序包是否已安装(大多数情况下没有安装),在两个 Oracle RAC 节点上执行以下命令:
[root@racnode1 ~]#
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n"| grep iscsi-initiator-utils
如果 iscsi-initiator-utils 程序包未安装,将 1 号 CD 加载到每个 Oracle RAC 节点中并执行以下命令:
[root@racnode1 ~]#
mount -r /dev/cdrom /media/cdrom
[root@racnode1 ~]#
cd /media/cdrom/Server
[root@racnode1 ~]#
rpm -Uvh iscsi-initiator-utils-*
[root@racnode1 ~]#
cd /
[root@racnode1 ~]#
eject
确认 iscsi-initiator-utils 程序包现在已安装:
[root@racnode1 ~]#
rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n"| grep iscsi-initiator-utils
iscsi-initiator-utils-6.2.0.871-0.10.el5 (x86_64)
配置 iSCSI(启动器)服务
验证 iscsi-initiator-utils 程序包已经安装到两个 Oracle RAC 节点之后,启动 iscsid 服务,并使其在系统引导时自动启动。我们还将配置 iscsi 服务在系统启动时自动启动,自动登录到所需的 iSCSI 目标。
[root@racnode1 ~]#
service iscsid start
Turning off network shutdown. Starting iSCSI daemon: [
OK ]
[
OK ]
[root@racnode1 ~]#
chkconfig iscsid on
[root@racnode1 ~]#
chkconfig iscsi on
现在 iSCSI 服务已经启动,下面使用 iscsiadm 命令行接口发现网络存储服务器上的所有可用目标。这应该在两个 Oracle RAC 节点上执行,以检验配置是否正常工作:
[root@racnode1 ~]#
iscsiadm -m discovery -t sendtargets -p openfiler1-priv
192.168.2.195:3260,1 iqn.2006-01.com.openfiler:racdb.crs1
192.168.2.195:3260,1 iqn.2006-01.com.openfiler:racdb.fra1
192.168.2.195:3260,1 iqn.2006-01.com.openfiler:racdb.data1
手动登录到 iSCSI 目标
此时,iSCSI 启动器服务已经启动,每个 Oracle RAC 节点都能够从网络存储服务器中发现可用目标。下一步是手动登录每个可用目标,这可以使用 iscsiadm 命令行接口完成。这需要在两个 Oracle RAC 节点上运行。注意,我必须指定网络存储服务器的 IP 地址而非其主机名 (openfiler1-priv) — 我认为必须这么做,因为上述发现使用 IP 地址显示目标。
[root@racnode1 ~]#
iscsiadm -m node -T iqn.2006-01.com.openfiler:racdb.crs1 -p 192.168.2.195 -l
[root@racnode1 ~]#
iscsiadm -m node -T iqn.2006-01.com.openfiler:racdb.data1 -p 192.168.2.195 -l
[root@racnode1 ~]#
iscsiadm -m node -T iqn.2006-01.com.openfiler:racdb.fra1 -p 192.168.2.195 -l
配置自动登录
下一步是确保在计算机引导(或 iSCSI 启动器服务启动/重启)时,客户端将自动登录到上面列出的每个目标。如同上面描述的手动登录过程,在两个 Oracle RAC 节点上执行以下命令:
[root@racnode1 ~]#
iscsiadm -m node -T iqn.2006-01.com.openfiler:racdb.crs1 -p 192.168.2.195 --op update -n node.startup -v automatic
[root@racnode1 ~]#
iscsiadm -m node -T iqn.2006-01.com.openfiler:racdb.data1 -p 192.168.2.195 --op update -n node.startup -v automatic
[root@racnode1 ~]#
iscsiadm -m node -T iqn.2006-01.com.openfiler:racdb.fra1 -p 192.168.2.195 --op update -n node.startup -v automatic
创建永久性本地 SCSI 设备名称
在本节中,我们将逐步为每个 iSCSI 目标名称创建永久性本地 SCSI 设备名称。我们将使用 udev 来完成该任务。拥有一致的本地 SCSI 设备名称及其映射到的 iSCSI 目标,有助于在配置 ASM 时能够区分三个卷。尽管并未严格要求这么做(因为我们将对所有卷使用 ASMLib 2.0),这提供了一种自我文档编制的方法,有助于快速确定每个 iSCSI 卷的名称和位置。
如果任一 Oracle RAC 节点引导并且 iSCSI 启动器服务启动,它会以一种随机的方式自动登录到配置的每个目标,并将这些目标映射到下一个可用的本地 SCSI 设备名称。例如,目标 iqn.2006-01.com.openfiler:racdb.crs1 可能会映射到 /dev/sdb。实际上,我可以通过查看 /dev/disk/by-path 目录来确定所有目标的当前映射:
[root@racnode1 ~]#
(cd /dev/disk/by-path; ls -l *openfiler* | awk '{FS=" "; print $9 " " $10 " " $11}')
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.crs1-lun-0 -> ../../sdb
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0 -> ../../sdd
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.fra1-lun-0 -> ../../sdc
使用上述 ls 命令的输出结果,我们可以建立以下当前映射:
iSCSI 目标名称到本地 SCSI 设备名称的当前映射
iSCSI 目标名称
SCSI 设备名称
iqn.2006-01.com.openfiler:racdb.crs1
/dev/sdb
iqn.2006-01.com.openfiler:racdb.data1
/dev/sdd
iqn.2006-01.com.openfiler:racdb.fra1
/dev/sdc
但是,每次重新引导 Oracle RAC 节点时,该映射都可能有所不同。例如,重新引导之后,可能会决定将 iSCSI 目标 iqn.2006-01.com.openfiler:racdb.crs1 映射到本地 SCSI 设备 /dev/sdc。由于您无法预测重新引导后的 iSCSI 目标映射,依赖于使用本地 SCSI 设备名称是不现实的。
我们需要的是可引用的一致的设备名称(即 /dev/iscsi/crs1),该设备名称在重新引导后将始终指向相应的 iSCSI 目标。这就是引入名为 udev 的动态设备管理 工具的原因。 udev 提供了一个动态设备目录,使用一组可配置的规则通过符号链接指向实际设备。当 udev 收到设备事件(例如,客户端登录到 iSCSI 目标)时,就会根据 sysfs 中提供的可用设备属性匹配其配置好的规则以便识别设备。匹配规则可以提供其他设备信息或指定设备节点名和多个符号链接名,并指示 udev 运行其他程序(例如,一个 SHELL 脚本)作为设备事件处理过程的一部分。
第一步是创建一个新的规则文件。该文件将命名为 /etc/udev/rules.d/55-openiscsi.rules,并且只包含一行用于接收我们感兴趣事件的名称=值对。它还将定义一个调出 SHELL 脚本 (/etc/udev/scripts/iscsidev.sh),用于处理事件。
在两个 Oracle RAC 节点上创建以下规则文件 /etc/udev/rules.d/55-openiscsi.rules:
..............................................
# /etc/udev/rules.d/55-openiscsi.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"
..............................................
现在,我们需要创建在接收该事件时将调用的 UNIX SHELL 脚本。我们首先在两个 Oracle RAC 节点上创建一个单独的目录,用于存储 udev 脚本:
[root@racnode1 ~]#
mkdir -p /etc/udev/scripts
接下来,在两个 Oracle RAC 节点上创建 UNIX shell 脚本 /etc/udev/scripts/iscsidev.sh:
..............................................
#!/bin/sh
# FILE: /etc/udev/scripts/iscsidev.sh
BUS=${1}
HOST=${BUS%%:*}
[ -e /sys/class/iscsi_host ] || exit 1
file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"
target_name=$(cat ${file})
# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
exit 1
fi
# Check if QNAP drive
check_qnap_target_name=${target_name%%:*}
if [ $check_qnap_target_name = "iqn.2004-04.com.qnap" ]; then
target_name=`echo "${target_name%.*}"`
fi
echo "${target_name##*.}"
..............................................
创建 UNIX SHELL 脚本后,将其更改为可执行文件:
[root@racnode1 ~]#
chmod 755 /etc/udev/scripts/iscsidev.sh
既然已经配置了 udev,下面将在两个 Oracle RAC 节点上重新启动 iSCSI 服务:
[root@racnode1 ~]#
service iscsi stop
Logging out of session [sid: 6, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]
Logging out of session [sid: 7, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]
Logging out of session [sid: 8, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]
Logout of [sid: 6, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]: successful
Logout of [sid: 7, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]: successful
Logout of [sid: 8, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]: successful
Stopping iSCSI daemon: [
OK ]
[root@racnode1 ~]#
service iscsi start
iscsid dead but pid file exists
Turning off network shutdown. Starting iSCSI daemon: [
OK ]
[
OK ]
Setting up iSCSI targets: Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]
Logging in to [iface: default, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]
Login to [iface: default, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]: successful
Login to [iface: default, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]: successful
[
OK ]
下面,我们来看一下我们的辛勤工作是否得到了回报:
[root@racnode1 ~]#
ls -l /dev/iscsi/*
/dev/iscsi/crs1:
total 0
lrwxrwxrwx 1 root root 9 Nov 3 18:13 part -> ../../sdc
/dev/iscsi/data1:
total 0
lrwxrwxrwx 1 root root 9 Nov 3 18:13 part -> ../../sde
/dev/iscsi/fra1:
total 0
lrwxrwxrwx 1 root root 9 Nov 3 18:13 part -> ../../sdd
上面的清单显示, udev 所做的工作正是我们所期待的!现在,我们拥有了一组一致的本地设备名称,可用于引用 iSCSI 目标。例如,我们可以安全地认为设备名称 /dev/iscsi/crs1/part 将始终引用 iSCSI 目标 iqn.2006-01.com.openfiler:racdb.crs1。现在,我们拥有了一致的 iSCSI 目标名称到本地设备名称的映射,如下表所示:
iSCSI 目标名称到本地设备名称的映射
iSCSI 目标名称
本地设备名称
iqn.2006-01.com.openfiler:racdb.crs1
/dev/iscsi/crs1/part
iqn.2006-01.com.openfiler:racdb.data1
/dev/iscsi/data1/part
iqn.2006-01.com.openfiler:racdb.fra1
/dev/iscsi/fra1/part
在 iSCSI 卷上创建分区
现在,我们需要在每个 iSCSI 卷上创建一个占用整个卷大小的主分区。正如本文前面提到的,我将使用自动存储管理 (ASM) 存储 Oracle 集群件所需的共享文件、物理数据库文件(数据/索引文件、联机重做日志文件和控制文件),以及集群数据库的快速恢复区 (FRA)。
Oracle Clusterware 共享文件(OCR 和表决磁盘)将存储在一个名为 +CRS 的使用外部冗余 配置的 ASM 磁盘组中。集群数据库的物理数据库文件将存储在一个名为 +RACDB_DATA 的也使用外部冗余配置的 ASM 磁盘组中。最后,快速恢复区(RMAN 备份和存档重做日志文件)将存储于一个名为 +FRA 的使用外部冗余配置的第三个 ASM 磁盘组中。
下表列出了将要创建的三个 ASM 磁盘组及其将包含的 iSCSI 卷:
Oracle 共享驱动器配置
文件类型
ASM 磁盘组名称
iSCSI 目标(短)名称
ASM 冗余
大小
ASMLib 卷名
OCR and Voting Disk
+CRS
crs1
External
2GB
ORCL:CRSVOL1
Oracle Database Files
+RACDB_DATA
data1
External
32GB
ORCL:DATAVOL1
Oracle Fast Recovery Area
+FRA
fra1
External
32GB
ORCL:FRAVOL1
如上表所示,我们需要在每个 iSCSI 卷(共三个)上创建一个 Linux 主分区。 fdisk 命令在 Linux 中用于创建(和删除)分区。对于每个 iSCSI 卷(共三个),您都可以在创建主分区时使用默认值,因为默认操作是使用整个磁盘。您可以放心地忽略任何指示设备未包含有效 DOS 分区(或 Sun、SGI 或 OSF 磁盘标签)的警告。
在本例中,我将在 racnode1 上运行 fdisk 命令,使用上一节中通过 udev 创建的本地设备名称在每个 iSCSI 目标上创建一个主分区:
/dev/iscsi/crs1/part
/dev/iscsi/data1/part
/dev/iscsi/fra1/part
注:要在每个 iSCSI 卷上创建单个分区,只能从 Oracle RAC 集群中的一个节点上进行!(如 racnode1)
# ---------------------------------------
[root@racnode1 ~]#
fdisk /dev/iscsi/crs1/part
Command (m for help):
n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
1
First cylinder (1-1012, default 1):
1
Last cylinder or +size or +sizeM or +sizeK (1-1012, default 1012):
1012
Command (m for help):
p
Disk /dev/iscsi/crs1/part: 2315 MB, 2315255808 bytes
72 heads, 62 sectors/track, 1012 cylinders
Units = cylinders of 4464 * 512 = 2285568 bytes
Device Boot Start End Blocks Id System
/dev/iscsi/crs1/part1 1 1012 2258753 83 Linux
Command (m for help):
w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# ---------------------------------------
[root@racnode1 ~]#
fdisk /dev/iscsi/data1/part
Command (m for help):
n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
1
First cylinder (1-33888, default 1):
1
Last cylinder or +size or +sizeM or +sizeK (1-33888, default 33888):
33888
Command (m for help):
p
Disk /dev/iscsi/data1/part: 35.5 GB, 35534143488 bytes
64 heads, 32 sectors/track, 33888 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/iscsi/data1/part1 1 33888 34701296 83 Linux
Command (m for help):
w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
# ---------------------------------------
[root@racnode1 ~]#
fdisk /dev/iscsi/fra1/part
Command (m for help):
n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4):
1
First cylinder (1-33888, default 1):
1
Last cylinder or +size or +sizeM or +sizeK (1-33888, default 33888):
33888
Command (m for help):
p
Disk /dev/iscsi/fra1/part: 35.5 GB, 35534143488 bytes
64 heads, 32 sectors/track, 33888 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/iscsi/fra1/part1 1 33888 34701296 83 Linux
Command (m for help):
w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
验证新分区
在 racnode1 上创建所有需要的分区之后,现在应使用以下命令以“root”用户帐户从 Oracle RAC 集群的所有其余节点 (racnode2) 将分区更改通知给内核。注意,Openfiler 发现的 iSCSI 目标名称和本地 SCSI 设备名称的映射在两个 Oracle RAC 节点上将有所不同。不用担心,这不会导致任何问题,因为我们将使用 udev 在上一节中创建的本地设备名称而不是其他的本地 SCSI 设备名称。
在 racnode2 上运行以下命令:
[root@racnode2 ~]#
partprobe
[root@racnode2 ~]#
fdisk -l
Disk /dev/sda: 160.0 GB, 160000000000 bytes
255 heads, 63 sectors/track, 19452 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 19452 156143767+ 8e Linux LVM
Disk /dev/sdb: 35.5 GB, 35534143488 bytes
64 heads, 32 sectors/track, 33888 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 33888 34701296 83 Linux
Disk /dev/sdc: 35.5 GB, 35534143488 bytes
64 heads, 32 sectors/track, 33888 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 33888 34701296 83 Linux
Disk /dev/sdd: 2315 MB, 2315255808 bytes
72 heads, 62 sectors/track, 1012 cylinders
Units = cylinders of 4464 * 512 = 2285568 bytes
Device Boot Start End Blocks Id System
/dev/sdd1 1 1012 2258753 83 Linux
最后,您应该在两个 Oracle RAC 节点上运行以下命令,以验证 udev 为每个新分区创建了新的符号链接:
[root@racnode2 ~]#
(cd /dev/disk/by-path; ls -l *openfiler* | awk '{FS=" "; print $9 " " $10 " " $11}')
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.crs1-lun-0 -> ../../sdd
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.crs1-lun-0-part1 -> ../../sdd1
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0 -> ../../sdc
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0-part1 -> ../../sdc1
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.fra1-lun-0 -> ../../sdb
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.fra1-lun-0-part1 -> ../../sdb1
上面的清单显示, udev 确实为每个新分区创建了新的设备名称。在本指南稍后,当我们为 ASMlib 配置卷时,将使用这些新的设备名称。
/dev/iscsi/crs1/part1
/dev/iscsi/data1/part1
/dev/iscsi/fra1/part1