Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC
11. 在 Oracle RAC 节点上配置 iSCSI 卷
在集群中的两个 Oracle RAC 节点上配置 iSCSI 启动器!但是,创建分区应该只在 RAC 集群的一个节点上执行。
iSCSI 客户端可以是提供 iSCSI 支持(驱动程序)的任何系统(Linux、Unix、MS Windows、Apple Mac 等)。在我们的示例中,客户端是两个 Linux 服务器(linux1 和 linux2),它们运行的是 Enterprise Linux 5.0。
在本部分中,我们将在两个 Oracle RAC 节点上配置 iSCSI 软件启动器。Enterprise Linux 5.0 包含 iSCSI 软件启动器,该软件启动器位于 iscsi-initiator-utils RPM 中。这是 Enterprise Linux 早期版本 (4.x) 的更改,它包含作为 Linux-iSCSI 项目的一部分而开发的 Linux iscsi-sfnet 软件驱动程序。所有 iSCSI 管理任务(如发现和登录)将使用 Open-iSCSI 中包含的命令行接口 iscsiadm。
iSCSI 软件启动器将配置为自动登录网络存储服务器 (openfiler1), 并发现 上一部分中创建的 iSCSI 卷。之后,我们将说明使用 udev 为发现的每个 iSCSI 目标名称创建永久的本地 SCSI 名称(即 /dev/iscsi/asm1)的步骤。您需要拥有一致的本地 SCSI 名称及其映射到的 iSCSI 目标,才能知道要用于 OCFS2 的卷(设备)和属于 ASM 的卷。但是,在此之前,我们必须先安装 iSCSI 启动器软件!
安装 iSCSI(启动器)服务
使用 Enterprise Linux 5.0,默认情况下不会安装 Open-iSCSI iSCSI 软件启动器。该软件包含在 1 号 CD 上的 iscsi-initiator-utils 程序包中。要确定该程序包是否已安装(大多数情况下没有安装),在两个 Oracle RAC 节点上执行以下命令:
# rpm -qa | grep iscsi-initiator-utils
如果 iscsi-initiator-utils 程序包未安装,将 1 号 CD 加载到每个 Oracle RAC 节点并执行以下命令:
# mount -r /dev/cdrom /media/cdrom# cd /media/cdrom/Server# rpm -Uvh iscsi-initiator-utils-6.2.0.742-0.5.el5.i386.rpm# cd /# eject
配置 iSCSI(启动器)服务
验证 iscsi-initiator-utils 程序包已经安装到两个 Oracle RAC 节点之后,启动 iscsid 服务,并使其在系统引导时自动启动。我们还将配置 iscsi 服务自动启动,使其在系统启动时自动登录 iSCSI 目标。
# service iscsid startTurning off network shutdown. Starting iSCSI daemon: [ OK ][ OK ]# chkconfig iscsid on# chkconfig iscsi on
既然 iSCSI 服务已经启动,下面使用 iscsiadm 命令行接口发现网络存储服务器上的所有可用目标。这应该在两个 Oracle RAC 节点上执行,以检验配置是否正常工作:
# iscsiadm -m discovery -t sendtargets -p openfiler1-priv192.168.2.195:3260,1 iqn.2006-01.com.openfiler:rac1.asm4192.168.2.195:3260,1 iqn.2006-01.com.openfiler:rac1.asm3192.168.2.195:3260,1 iqn.2006-01.com.openfiler:rac1.crs192.168.2.195:3260,1 iqn.2006-01.com.openfiler:rac1.asm2192.168.2.195:3260,1 iqn.2006-01.com.openfiler:rac1.asm1
手动登录 iSCSI 目标
此时,iSCSI 启动器服务已经启动,每个 Oracle RAC 节点都能够从网络存储服务器中发现可用目标。下一步是手动登录每个可用目标,这可以使用 iscsiadm 命令行接口来完成。这需要在两个 Oracle RAC 节点上运行。注意,我必须指定 IP 地址而非网络存储服务器的主机名 (openfiler1-priv) — 我认为,如果上述发现使用 IP 地址显示目标,则这是必需的。
# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm1 -p 192.168.2.195 -l# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm2 -p 192.168.2.195 -l# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm3 -p 192.168.2.195 -l# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm4 -p 192.168.2.195 -l# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.crs -p 192.168.2.195 -l
配置自动登录
下一步是确保在计算机引导(或 iSCSI 启动器服务启动/重新启动)时,客户端将自动登录上面列出的每个目标。正如上面描述的手动登录过程,在两个 Oracle RAC 节点上都执行以下命令:
# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm1 -p 192.168.2.195 --op update -n node.startup -v automatic# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm2 -p 192.168.2.195 --op update -n node.startup -v automatic# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm3 -p 192.168.2.195 --op update -n node.startup -v automatic# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.asm4 -p 192.168.2.195 --op update -n node.startup -v automatic# iscsiadm -m node -T iqn.2006-01.com.openfiler:rac1.crs -p 192.168.2.195 --op update -n node.startup -v automatic
创建永久性本地 SCSI 设备名称
在本部分中,我们将说明为每个 iSCSI 目标名称创建永久性本地 SCSI 设备名称的步骤。我们将使用 udev 来完成该任务。您需要拥有一致的本地 SCSI 设备名称及其映射到的 iSCSI 目标,才能知道要用于 OCFS2 的卷(设备)和属于 ASM 的卷。
如果任一个 Oracle RAC 节点引导并且 iSCSI 启动器服务启动,则它将自动登录到以随机方式配置的每个目标,并将这些目标映射到下一个可用的本地 SCSI 设备名称。例如,目标 iqn.2006-01.com.openfiler:rac1.asm1 可能会映射到 /dev/sda。实际上,我可以通过查看 /dev/disk/by-path 目录来确定所有目标的当前映射:
# (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:rac1.asm1 -> ../../sdaip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:rac1.asm2 -> ../../sdbip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:rac1.asm3 -> ../../sdcip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:rac1.asm4 -> ../../sddip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:rac1.crs -> ../../sde
使用上述清单的输出,我们可以建立以下当前映射:
但是,每次重新引导 Oracle RAC 节点时,该映射都可能有所不同。例如,重新引导后,iSCSI 目标 iqn.2006-01.com.openfiler:rac1.asm1 可能会映射到本地 SCSI 设备 /dev/sdd。因此,如果您无法预测重新引 导后的 iSCSI 目标映射,依赖于使用本地 SCSI 设备名称是不现实的。
我们需要的是可以引用的、一致的设备名称(即 /dev/iscsi/asm1), 该设备名称在重新引导后将始终指向正确的 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.rulesKERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c/part%n"..............................................
现在,我们需要创建在接收该事件时将调用的 UNIX SHELL 脚本。我们首先在两个 Oracle RAC 节点上创建一个单独的目录,用于存储 udev 脚本:
# mkdir -p /etc/udev/scripts
接下来,在两个 Oracle RAC 节点上创建 UNIX shell 脚本 /etc/udev/scripts/iscsidev.sh:
..............................................#!/bin/sh# FILE: /etc/udev/scripts/iscsidev.shBUS=${1}HOST=${BUS%%:*}[ -e /sys/class/iscsi_host ] || exit 1file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"target_name=$(cat ${file})# This is not an open-scsi driveif [ -z "${target_name}" ]; then exit 1fiecho "${target_name##*.}"..............................................
创建 UNIX SHELL 脚本后,将其更改为可执行文件:
# chmod 755 /etc/udev/scripts/iscsidev.sh
既然已经配置了 udev,下面将在两个 Oracle RAC 节点上重新启动 iSCSI 服务:
# service iscsi stopLogout session [0][192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm1]Logout session [1][192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm2]Logout session [2][192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm3]Logout session [3][192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm4]Logout session [4][192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.crs]Stopping iSCSI daemon: /etc/init.d/iscsi: line 33: 18615 Killed /etc/init.d/iscsid stop# service iscsi startiscsid dead but pid file existsTurning off network shutdown. Starting iSCSI daemon: [ OK ][ OK ]Setting up iSCSI targets: Login session [192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm4]Login session [192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm3]Login session [192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.crs]Login session [192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm2]Login session [192.168.2.195:3260 iqn.2006-01.com.openfiler:rac1.asm1][ OK ]
下面,我们来看一下我们的辛勤工作是否得到了回报:
# ls -l /dev/iscsi/*/dev/iscsi/asm1:total 0lrwxrwxrwx 1 root root 9 Oct 4 01:50 part -> ../../sde/dev/iscsi/asm2:total 0lrwxrwxrwx 1 root root 9 Oct 4 01:50 part -> ../../sdd/dev/iscsi/asm3:total 0lrwxrwxrwx 1 root root 9 Oct 4 01:50 part -> ../../sdb/dev/iscsi/asm4:total 0lrwxrwxrwx 1 root root 9 Oct 4 01:50 part -> ../../sda/dev/iscsi/crs:total 0lrwxrwxrwx 1 root root 9 Oct 4 01:50 part -> ../../sdc
上面的清单显示,udev 所作的工作正是我们所期待的!现在,我们拥有了一组一致的本地设备名称,可用于引用 iSCSI 目标。例如,我们可以安全地假设设备名称 /dev/iscsi/asm1/part 将始终引用 iSCSI 目标 iqn.2006-01.com.openfiler:rac1.asm1。现在,我们拥有了一致的 iSCSI 目标名称到本地设备名称的映射,如下表所示:
在 iSCSI 卷上创建分区
现在,我们需要在每个 iSCSI 卷上创建一个占用整个卷大小的主分区。正如本文前面提到的那样,我将使用 Oracle 的集群文件系统第 2 版 (OCFS2) 存储供 Oracle 集群件软件共享的两个文件。然后,我们将使用自动存储管理 (ASM) 创建四个 ASM 卷;其中,两个用于所有物理数据库文件(数据/索引文件、联机重做日志文件和控制文件),另两个用于闪回恢复区(RMAN 备份和归档重做日志文件)。
下表列出了五个 iSCSI 卷及其支持的文件系统:
如上表所示,我们需要在每个 iSCSI 卷(共 5 个)上创建一个 Linux 主分区。fdisk 命令在 Linux 中用于创建(和删除)分区。对于每个 iSCSI 卷(共 5 个),您都可以在创建主分区时使用默认值,因为默认操作是使用整个磁盘。您可以安全地忽略指出设备未包含有效 DOS 分区(或 Sun、SGI 或 OSF 磁盘标签)的任何警告。
在本例中,我将在 linux1 上运行 fdisk 命令,以使用 udev 在上一部分中创建的本地设备名称在每个 iSCSI 目标上创建一个主分区:
/dev/iscsi/asm1/part /dev/iscsi/asm2/part /dev/iscsi/asm3/part /dev/iscsi/asm4/part /dev/iscsi/crs/part注:要在每个 iSCSI 卷上创建单个分区,只能从 Oracle RAC 集群中的一个节点上运行!(即 linux1)
# ---------------------------------------# fdisk /dev/iscsi/asm1/partCommand (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-15134, default 1): 1Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134Command (m for help): pDisk /dev/iscsi/asm1/part: 124.4 GB, 124486942720 bytes255 heads, 63 sectors/track, 15134 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/iscsi/asm1/part1 1 15134 121563823+ 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.# ---------------------------------------# fdisk /dev/iscsi/asm2/partCommand (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-15134, default 1): 1Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134Command (m for help): pDisk /dev/iscsi/asm2/part: 124.4 GB, 124486942720 bytes255 heads, 63 sectors/track, 15134 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/iscsi/asm2/part1 1 15134 121563823+ 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.# ---------------------------------------# fdisk /dev/iscsi/asm3/partCommand (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-15134, default 1): 1Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134Command (m for help): pDisk /dev/iscsi/asm3/part: 124.4 GB, 124486942720 bytes255 heads, 63 sectors/track, 15134 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/iscsi/asm3/part1 1 15134 121563823+ 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.# ---------------------------------------# fdisk /dev/iscsi/asm4/partCommand (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-15134, default 1): 1Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134Command (m for help): pDisk /dev/iscsi/asm4/part: 124.4 GB, 124486942720 bytes255 heads, 63 sectors/track, 15134 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/iscsi/asm4/part1 1 15134 121563823+ 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.# ---------------------------------------# fdisk /dev/iscsi/crs/partCommand (m for help): nCommand action e extended p primary partition (1-4)pPartition number (1-4): 1First cylinder (1-1009, default 1): 1Last cylinder or +size or +sizeM or +sizeK (1-1009, default 1009): 1009Command (m for help): pDisk /dev/iscsi/crs/part: 2147 MB, 2147483648 bytes67 heads, 62 sectors/track, 1009 cylindersUnits = cylinders of 4154 * 512 = 2126848 bytes Device Boot Start End Blocks Id System/dev/iscsi/crs/part1 1 1009 2095662 83 LinuxCommand (m for help): wThe partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.
验证新分区
在 linux1 上创建所有必要分区之后,现在应使用以下命令以“root”用户帐户从 Oracle RAC 集群的所有其余节点 (linux2) 将分区更改通知给内核。注意,Openfiler 发现的 iSCSI 目标名称和本地 SCSI 设备名称的映射在两个 Oracle RAC 节点上将有所不同。不用担心,这不会导致任何问题,因为我们不使用本地 SCSI 设备名称,而使用 udev 在上一部分中创建的本地设备名称。
- 最新评论