利用openfiler实现iSCSI原理分析 |
本文标签:openfiler,iscsi iSCSI概述 配置openfiler openfiler的安装和安装linux类似,十分简单这里不做过多介绍,不明白的读者可以自行查阅资料 。以下配置环境是以RAC配置为基础,目标是将openfiler上的存储空间已共享存储的方式划分给rac1和rac2两个节点 。 浏览器:Firefox3.6(不推荐用IE进行此设置,下面会讲原因) 要将 Openfiler 用作 iSCSI 存储服务器,我们需要执行六个主要任务:设置 iSCSI 服务、配置网络访问、指定物理存储器并对其分区、创建新的卷组、创建所有逻辑卷,最后,为每个逻辑卷创建新的 iSCSI 目标 。 服务 在浏览器输入https://192.168.2.195:446/ 开启Openfiler的Web界面,这里192.168.2.195为openfiler系统的ip,446为服务端口 。Openfiler的默认用户名为openfiler,密码为password 。 要控制服务,我们使用 Openfiler Storage Control Center 并转到 [Services] / [Manage Services]: 要启用 iSCSI 服务,单击“iSCSI target server”服务名称后面的“Enable”链接 。之后,“iSCSI target server”状态应变为“Enabled” 。 ietd 程序将实现 iSCSI Enterprise Target 软件的用户级部分,以便在 Linux 上构建 iSCSI 存储系统 。启用 iSCSI target 之后,我们应该能够通过 SSH 登录到 Openfiler 服务器,并且可看到 iscsi-target 服务正在运行: [root@openfiler1 ']# service iscsi-target status ietd (pid 14243) is running... 网络访问配置 下一步是配置 Openfiler 中的网络访问,指定需要通过存储(专用)网络访问 iSCSI 卷的两个 Oracle RAC 节点(racnode1 和 racnode2) 。注意,本节稍后将会创建 iSCSI 卷 。另请注意,本步骤并不实际授予两个 Oracle RAC 节点访问 iSCSI 逻辑卷所需的相应权限 。授予权限的操作将在本节稍后通过对每个新逻辑卷更新 ACL 来进行 。 如同上一节,我们使用 Openfiler Storage Control Center 并转到 [System] / [Network Setup] 来完成网络访问配置 。通过页面底部的“Network Access Configuration”部分,管理员可以设置网络和/或主机以允许其访问 Openfiler appliance 导出的资源 。就本文而言,我们希望单独添加两个 Oracle RAC 节点,而不是允许整个 192.168.2.0 网络访问 Openfiler 资源 。 输入每个 Oracle RAC 节点时,请注意“Name”域只是一个逻辑名称,仅供参考 。根据输入节点的惯例,我仅使用了为该 IP 地址定义的节点名称 。接下来,在“Network/Host”域中输入实际节点时,始终使用其 IP 地址,即使其主机名已经在 /etc/hosts 文件或 DNS 中定义 。最后,在我们的 C 类网络中输入实际主机时,使用子网掩码 255.255.255.255 。 记住,您要为集群中的每个 RAC 节点输入专用 网络 (eth1) 的 IP 地址,这一点很重要 。 下图显示了添加两个 Oracle RAC 节点后的结果: 物理存储 在本节中,我们将创建三个 iSCSI 卷,以供集群中的两个 Oracle RAC 节点用作共享存储 。这将在连接到 Openfiler 服务器的内置 73GB 15K SCSI 硬盘驱动器上执行多个步骤 。 存储设备(如内置 IDE/SATA/SCSI/SAS 磁盘、存储阵列、外置 USB 驱动器、外置 FireWire 驱动器或者任何其他存储设备)可以连接到 Openfiler 服务器,并供客户端使用 。如果在操作系统级发现了这些设备,就可以使用 Openfiler Storage Control Center 设置和管理所有这些存储设备 。 在本例中,我们有一个 73GB 的内置 SCSI 硬盘驱动器用于满足共享存储之需 。在 Openfiler 服务器上,该驱动器显示为 /dev/sdb (MAXTOR ATLAS15K2_73SCA) 。要看到该驱动器并启动 iSCSI 卷的创建过程,请从 Openfiler Storage Control Center 转到 [Volumes] / [Block Devices]: 对物理磁盘进行分区
卷组管理 下一步是创建卷组 。我们将创建一个名为 racdbvg 的卷组,其中包含新创建的主分区 。从 Openfiler Storage Control Center 中转到 [Volumes] / [Volume Groups] 。我们将看到所有现有的卷组,或者什么也看不到(我们的情况就是这样) 。在 Volume Group Management 屏幕中,输入新卷组的名称 (racdbvg),单击 /dev/sdb1 前面的复选框以选中该分区,最后单击“Add volume group”按钮 。之后,我们会看到一个列表,其中显示出我们新创建的这个名为“racdbvg”的卷组: 现在,我们可以在新创建的卷组 (racdbvg) 中创建三个逻辑卷 。从 Openfiler Storage Control Center 中转到 [Volumes] / [Add Volume] 。我们将看到新创建的卷组 (racdbvg) 及其块存储统计信息 。该屏幕底部还提供了一个选项,用于在选定的卷组中创建一个新卷 —(在“racdbvg”中创建一个卷) 。使用该屏幕创建以下三个逻辑 (iSCSI) 卷 。在创建每个逻辑卷之后,应用程序将转至“Manage Volumes”屏幕 。然后,您需要单击后退到“Add Volume”选项卡以创建下一个逻辑卷,直至三个 iSCSI 卷全部创建完毕: iSCSI / 逻辑卷卷名卷描述所需空间 (MB)文件系统类型 iSCSI 目标 现在,我们有了三个 iSCSI 逻辑卷 。但是,为了使 iSCSI 客户端可以访问这些逻辑卷,首先需要为这三个卷中的每个卷创建一个 iSCSI 目标 。每个 iSCSI 逻辑卷将映射 到一个特定的 iSCSI 目标,并将为两个 Oracle RAC 节点授予对该目标的相应网络访问权限 。对于本文,在 iSCSI 逻辑卷和 iSCSI 目标之间将会有一一映射的关系 。 创建和配置 iSCSI 目标的过程包括三步:创建一个唯一的目标 IQN(实质上是新的 iSCSI 目标的通用名称),将上一节中创建的一个 iSCSI 逻辑卷映射到新创建的 iSCSI 目标,最后,授予两个 Oracle RAC 节点访问该新 iSCSI 目标的权限 。请注意,需要对上一节中创建的三个 iSCSI 逻辑卷中的每个卷都执行一次此过程 。 对于本文,下表列出了新的 iSCSI 目标名称(目标 IQN)及其将映射到的 iSCSI 逻辑卷: iSCSI 目标/逻辑卷映射目标 IQNiSCSI 卷名卷描述iqn.2006-01.com.openfiler:racdb.crs1 racdb-crs1 racdb - ASM CRS Volume 1iqn.2006-01.com.openfiler:racdb.data1 racdb-data1 racdb - ASM Data Volume 1iqn.2006-01.com.openfiler:racdb.fra1 racdb-fra1 racdb - ASM FRA Volume 1
现在我们来创建三个新的 iSCSI 目标 — 为每个 iSCSI 逻辑卷创建一个 。下面举例说明通过创建 Oracle Clusterware/racdb-crs1 目标 ( 创建新目标 IQN 从 Openfiler Storage Control Center 中转到 [Volumes] / [iSCSI Targets] 。确保选择了灰色子选项卡“Target Configuration” 。您可在此选项卡页中创建一个新的 iSCSI 目标 。系统会自动生成一个默认值,作为新 iSCSI 目标的名称(常称为“目标 IQN”) 。目标 IQN 的一个示例是“
我喜欢用更具含义的字串来替换这个默认目标 IQN 最后一段 。对于第一个 iSCSI 目标(Oracle Clusterware/racdb-crs1),我将这样来修改默认的目标 IQN:将字符串“ 对新的目标 IQN 满意之后,单击“Add”按钮 。这将会创建一个新的 iSCSI 目标,然后会出现一个页面,您可以在该页面中修改新 iSCSI 目标的一系列设置 。对于本文,无需更改新 iSCSI 目标的任何设置 。 LUN 映射 创建新的 iSCSI 目标之后,下一步是将相应的 iSCSI 逻辑卷映射到该目标 。在“Target Configuration”子选项卡下,验证在“Select iSCSI Target”部分中选择了正确的 iSCSI 目标 。如果不是这样,使用下拉菜单选择正确的 iSCSI 目标,然后单击“Change”按钮 。 接下来,单击名为“LUN Mapping”的灰色子选项卡(在“Target Configuration”子选项卡旁) 。找到相应的 iSCSI 逻辑卷(本例中为 /dev/racdbvg/racdb-crs1),然后单击“Map”按钮 。无需更改此页面中的任何设置 。对卷 /dev/racdbvg/racdb-crs1 单击“Map”按钮后,您的屏幕应如下图所示: 网络 ACL 需要先授予 iSCSI 客户端相应的权限,它才能访问新创建的 iSCSI 目标 。在前面,我们已通过 Openfiler 对两个主机(Oracle RAC 节点)进行网络访问配置 。这两个节点需要通过存储(专用)网络访问新的 iSCSI 目标 。现在,我们需要授予这两个 Oracle RAC 节点访问新 iSCSI 目标的权限 。 单击名为“Network ACL”的灰色子选项卡(在“LUN Mapping”子选项卡旁) 。对当前的 iSCSI 目标,将两个主机的“Access”值由“Deny”更改为“Allow”,然后单击“Update”按钮 。 返回到创建新的目标 IQN 一节,对其余两个 ISCSI 逻辑卷执行这三个任务,同时替换“iSCSI 目标/逻辑卷映射”表中找到的值 。 在 Oracle RAC 节点上配置 iSCSI 卷 在集群中的两个 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 设备名称(即 安装 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 确认 iscsi-initiator-utils 程序包现在已安装: [root@racnode1 ']# rpm -qa --queryformat "%{NAME}-%{VERSION}-%{RELEASE} (%{ARCH})\n"| grep iscsi-initiator-utils 配置 iSCSI(启动器)服务 验证 iscsi-initiator-utils 程序包已经安装到两个 Oracle RAC 节点之后,启动 iscsid 服务,并使其在系统引导时自动启动 。我们还将配置 iscsi 服务在系统启动时自动启动,自动登录到所需的 iSCSI 目标 。 [root@racnode1 ']# service iscsid start [root@racnode1 ']# chkconfig iscsi on 现在 iSCSI 服务已经启动,下面使用 iscsiadm 命令行接口发现网络存储服务器上的所有可用目标 。这应该在两个 Oracle RAC 节点上执行,以检验配置是否正常工作: [root@racnode1 ']# iscsiadm -m discovery -t sendtargets -p openfiler1-priv
手动登录到 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 如果此时更新了openfiler服务器上的资源配置,可以使用如下命令更新相关配置 iscsiadm -m node -T iqn.2006-01.com.openfiler:RACDBcrs1 -p 192.168.0.201 -R 配置自动登录 下一步是确保在计算机引导(或 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 创建永久性本地 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=" "; 使用上述 ls 命令的输出结果,我们可以建立以下当前映射: iSCSI 目标名称到本地 SCSI 设备名称的当前映射iSCSI 目标名称SCSI 设备名称iqn.2006-01.com.openfiler:racdb.crs1/dev/sdbiqn.2006-01.com.openfiler:racdb.data1/dev/sddiqn.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 创建 UNIX SHELL 脚本后,将其更改为可执行文件: [root@racnode1 ']# chmod 755 /etc/udev/scripts/iscsidev.sh 既然已经配置了 udev,下面将在两个 Oracle RAC 节点上重新启动 iSCSI 服务: [root@racnode1 ']# service iscsi stop 下面,我们来看一下我们的辛勤工作是否得到了回报: [root@racnode1 ']# ls -l /dev/iscsi/* 上面的清单显示, 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/partiqn.2006-01.com.openfiler:racdb.data1/dev/iscsi/data1/partiqn.2006-01.com.openfiler:racdb.fra1/dev/iscsi/fra1/part |