文章
DBA:Linux
作者:Jakub Wartak 如何在虚拟环境中创建经济但功能齐全的 Oracle 扩展 RAC 实现。 本指南中的信息未经 Oracle 验证,且不受 Oracle 支持,您在使用时只能风险自负;本指南仅供教学使用。 2008 年 10 月更新 目录
本指南的灵感和基础源自 Oracle ACE Jeffrey Hunter 撰写的著名指南“ 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 11g 集群 ”,并获得了作者的许可。如果您想了解如何在 Linux 上安装 Oracle RAC,建议您阅读该指南;文中介绍了以前使用 Oracle RAC 时的一些经验。
|
||||||||||||||||||||||||||||||
典型的 Oracle 真正应用集群 (RAC) 部署是一种体系结构,可提供单节点或多节点故障的快速恢复。但在通常情况下,Oracle RAC 的所有节点都位于同一个数据中心,因此容易导致灾难性数据中心故障。在这种情况下实现灾难恢复的解决方案是,在本地数据中心和正在运行备用系统的某个备份数据中心(通常是单个 Oracle 数据库或其他 RAC 集群)之间设置 Oracle DataGuard。
虽然 DataGuard 可以很好地完成这一任务,但它将整个备用系统和阵列(一个或多个)变成被动节点(计算功能无法用于事务处理),因此大大提高了此解决方案的成本。(虽然备用的 Oracle DataGuard 系统可对只读查询开放,甚至可随同 Oracle 数据库 11g 中的 Active DataGuard 一直在只读模式下运行,但此配置要求应用程序知道某些节点的只读特性)。
幸运的是,还有另一种解决方案可以实现(部分)灾难恢复,称为“扩展 RAC”(Extended RAC 或 Stretched RAC)。在这种体系结构中,某些 RAC 节点在“站点 Alpha”中工作,其余节点在“站点 Beta”中工作。两个站点中的节点都是主动节点,因此所有计算资源都将得到充分利用。如图 1 中所示,每个站点都有其自身的存储区域网 (SAN);同时出现在两个数据中心(dcA 和 dcB)的系统是同一个 RAC 集群的成员,因此必须能够通过互连快速交换数据以及访问其他站点的存储设备。(也就是说,位于 dcA 的节点 RAC1 写入位于 dcB 的 SAN 阵列,并与位于 dcB 的 RAC2 节点通信)。
在本指南中,您将使用 Oracle VM 2.1 提供的虚拟化功能,在单台 PC 的 x86 64 位系统上创建经济但功能齐全的 Oracle 扩展 RAC 实现(仅供教学使用)。(图 2 提供了详细的拓扑结构。)主要制约因素 — 延迟(Oracle RAC 对互连延迟以及读取或写入期间的 I/O 延迟很敏感)— 将被人为施加到互连和存储设备以太网流量上(对 IP 网络设备使用 Linux 的信源质量 (Quality of Source))。
如果满足以下任一必要条件,扩展 RAC 可能还会削减成本并/或显著提升企业应用程序的可用性:
另请注意,从理论上讲,在扩展 RAC 中存储阵列不必是最可靠的,因为它中断后不会阻止集群处理请求。
在本指南描述的配置中,Oracle 数据库 11g 第 1 版(在 RAC 配置中)将在两个 Oracle Enterprise Linux 5.1 系统上运行。Oracle RAC 节点的存储将由 OpenFiler 上运行的两个 iSCSI 存储服务器提供。此配置还将利用 Oracle 自动存储管理 (ASM) 提供的特性,ASM 是 Oracle 数据库 10g 及更高版本基于主机/数据库的镜像特性。
理想情况下,应使用实际硬件实现扩展 RAC 以获取更佳性能,但由于此体系结构仅用于研究和培训目的,因此这种折衷方案是可以接受的。Oracle VM Server 只需要一台计算机,但为了安装 Oracle VM Manager(用于管理虚拟系统的简单 Web 控制台),我们还需要另一台 PC。
在撰写本文时,光纤通道协议 (FCP) 仍是存储首选;但在 Oracle 数据库 11g 中,Oracle 引入了对数据文件 NFS 共享存储的支持,以及一些性能增强功能(如 Oracle Direct NFS)。由于本安装的性质,我们仍然继续选择较简单的 iSCSI 存储方法,以保持实际的 FCP 概念不变。注意,在扩展 RAC 案例中,必须将第三个表决磁盘放在 dcA 和 dcB 以外的位置,以实现完全容错的体系结构。
注意,本指南中的磁盘镜像配置对于实际案例来说是不够的;还缺少 I/O 多路径或冗余互连。另外,尽管本指南提供了成功安装完整 Oracle RAC 11g 评估系统的详细说明,但它绝不能替代 Oracle 官方文档。除本指南之外,用户还应参阅以下 Oracle 文档,以完全了解 Oracle RAC 11g 的其他配置选项、安装以及管理。
在开始之前,我必须再强调一下:本指南仅用于教学目的,既不支持也未考虑生产部署。对于遵循本指南操作时所遇到的问题,Oracle 支持部门不会作出响应。
要构建扩展 RAC,需要下载以下软件(后面将提供详细说明):
这两个产品都是免费提供的。注册之后,应在Select a Product Pack 中选择Oracle VM,并在Product architecture 中选择x86 64 bit,然后选择Go。选中Oracle VM 2.1 Media Pack 并单击Continue。现在您应看到:
将这两个产品下载到之前准备好的下载目录中。将这两个 *.zip 文件解压缩后,应显示如下两个 ISO 文件,您可以使用喜爱的 CD 刻录软件将其刻录到 CD 中:
(提示:如果您将这些 ISO 下载到某个工作站并要在其上进行安装,则不必为了在此工作站上安装 OracleVM-Manager-2.1.iso 而刻录该文件。可以在 Linux 上使用以下命令将 CD 回送挂载到 /mnt/cdrom 上):
mount -o loop,ro OracleVM-Manager-2.1.iso /mnt/cdrom"Oracle Enterprise Linux 5.1 Update 1“小型”模板 (PV_x86_64)
此处,您将不使用安装介质 CD 或 DVD 从头安装 Linux 系统,而是使用 Oracle 提供的 VM Linux 模板。VM Linux 模板是二进制文件,它是可直接运行的整个系统的磁盘镜像。由于 Oracle VM 所提供的环境是通用的,因此不必在每个系统上执行安装以确保系统具有驱动程序,而是从模板中克隆每个 Linux 实例并启动。Oracle 提供为 Oracle 数据库预配置的模板。
登录并接受协议之后,从Product Pack 选择列表中选择Oracle VM Templates,并从Platform 选择列表中选择x86_64,然后单击 Go。单击Oracle VM Templates for Oracle Enterprise Linux 5 Media Pack for x86_64 (64 bit) 链接,然后选择下载 Oracle Enterprise Linux 5 Update 2 模板 — PV Small x86_64(64 位)。
超虚拟化 (PV) 系统和虚拟硬件 (HVM) 系统之间的主要区别在于 Linux 内核与 Oracle VM Server 内核 (Xen hypervisor) 之间交互的性质。HVM 系统是没有特殊勾子(以利用 Xen 的功能)的标准 x86 或 x86_64 系统,可以在标准 PC(无 Xen)上运行。另一方面,PV 系统知道自身在 Xen 上运行,它们不联系硬件,而是直接与 Xen 通信 — 不必像使用 HVM 时那样模拟实际硬件。
适用于 Linux x86(64 位)的Oracle 数据库 11g 和集群件需要下载的文件名如下:
打开下载页后,查找 openfiler-2.2-x86.img.gz (~160MB)。此处我们将使用 2.2 版;但是,我还建议您签出 2.3 版,它增加了一些很好的功能,如 iSCSI 快照的 LUN 映射和 iSCSI 动态卷大小调整(但在本指南中未进行可用性测试)。
刻录完 Oracle VM Server 引导 CD 后,将其放入有足够 CPU 和 RAM(可以运行几个 Linux 实例而不必进行交换)的 PC 中。按照以下说明安装 Oracle VM:
现在,您需要等待安装过程完成。CD 托盘应自动弹出。重新引导之后,将显示 Oracle VM Server。您可以 root 用户身份从以下位置登录到该服务器:
|
[root@quadovm ~]# xm info | grep mem |
Oracle VM Manager 安装非常简单。使用 Oracle VM Manager 挂载的 ISO CD 启动安装程序:
| [root@xeno ~]# cd /mnt/cdrom [root@xeno cdrom]# sh runInstaller.sh [..] Welcome to Oracle VM Manager Please enter the choice: [1|2]
|
此处选择“1”,安装将继续进行。请确保提供大约 2GB 的可用空间,仅用于工作站上的 Oracle VM Manager。安装非常简单:
|
将“localuser”替换为您的本地用户名,以便于邮件传递。按照指示转至 http://127.0.0.1:8888/OVS 访问 Oracle VM Manager。重新引导后,可通过 /etc/init.d/oracle-xe 和 /etc/init.d/oc4j 脚本启动和停止 Oracle VM Manager。
首先,必须在 Oracle VM Manager 中将我们的 Oracle VM Server (quadvm) 注册为新“spool”(包含一个或多个物理服务器的逻辑自主区域)的主服务器。
转至Servers Pools 选项卡,然后转至Create Server Pool,输入有关 quadvm Oracle VM Server 的信息(使其成为 Server Pool Master、Virtual Machine Server 以及 Utility Master),并为 spool 选择一个直观的名称,如 spool1。
在下一个屏幕上,选择“admin”用户。
检查所有内容,并确认创建新 spool。
创建虚拟机如前所述,虚拟化允许您通过复制模板镜像来克隆系统。下面是操作方法。
上载模板首先,需要将 VM 模板和 OpenFiler 传输到 VM Server 上:
[vnull@xeno OracleVM]$ scp -r OVM_EL5U1_X86_64_PVM_4GB root@10.99.1.2:/root/ root@10.99.1.2's password: vm.cfg 100% 318 0.3KB/s 00:00 system.img 100% 6144MB 8.8MB/s 11:41 README 100% 158 0.2KB/s 00:00 [vnull@xeno OracleVM]$ cd ~/ISO [vnull@xeno ISO]$ scp openfiler-2.2-x86_64.img.gz root@10.99.1.2:/root root@10.99.1.2's password: openfiler-2.2-x86_64.img.gz 100% 175MB 10.9MB/s 00:16 [vnull@xeno ISO]$ |
然后,需要将 VM 模板移到特殊目录,稍后 VM Server 子代理会在该目录中自动检测到此模板:
[root@quadovm ~]# ls -al OVM_EL5U1_X86_64_PVM_4GB/
total 6297632
drwxr-xr-x 2 root root 4096 May 6 14:04 .
drwxr-x--- 4 root root 4096 May 6 13:52 ..
-rw-r--r-- 1 root root 158 May 6 14:04 README
-rwxr-xr-x 1 root root 6442450945 May 6 14:04 system.img
-rw-r--r-- 1 root root 318 May 6 13:52 vm.cfg
[root@quadovm ~]# mv OVM_EL5U1_X86_64_PVM_4GB /OVS/seed_pool/
[root@quadovm ~]#
|
转至Resources,按下Import。选择Internal Virtual Machine Template。
描述模板详细信息(应自动检测到模板名称 OVM_EL5U1_X86_64_PVM_4GB,如果未检测到,请注销并重新登录):
确认导入操作:
应该能看到模板,现在只需选择该模板并单击Approve 按钮。
基于 OEL 模板创建 RAC VM注销并重新登录,转至Virtual Machines -> Create Virtual Machine,然后选择Create Virtual Machine based on Virtual Machine template。
选择您的“spool1”服务器池。
在Source 选项卡中,选择新添加的模板(应该只有一个)。
在Virtual Machine Info 选项卡中,输入所需的 VM 名称(此处为rac1)、口令以及接口(仅一个)。
在汇总屏幕上仔细检查所有内容,然后单击Confirm。
在 Virtual Machines 主屏幕上应显示新添加的 rac1 VM,状态为Creating。Oracle VM 现在正在将模板复制到新系统。
对“rac2”节点重复此步骤。此时,您应该已为两个 Linux 系统做好 Oracle RAC 安装准备。接下来应自定义这两个系统,为 Oracle 软件安装重新配置更多的内存和空间。
转至Virtual Machines,然后单击“rac1”或“rac2”。在General Information 中转至Edit。将 RAM 从 1,024MB 更改为 2,048MB。
转至Virtual Disk 选项卡,然后单击Create New Virtual Disk。在此处,将附加磁盘上所需的空间指定为跟系统空间一样的值。所用的值如下:
虚拟磁盘名称:oracle_software
虚拟磁盘大小 (MB): 8,192
创建之后,Virtual Disks 的状态屏幕应指定已创建了 8GB 的磁盘。
创建 OpenFiler VM现在将创建 iSCSI 存储设备 (OpenFiler)。此步骤必须手动执行,不能使用 Oracle VM Manager,这样 OpenFilers 将不受 VM Manager 控制台管理。
[root@quadovm ~]# cd /OVS/running_pool/
[root@quadovm running_pool]# ls
132_rac1 134_rac2
[root@quadovm running_pool]# mkdir 60_iscsi1 62_iscsi2
[root@quadovm running_pool]# gzip -d /root/openfiler-2.2-x86_64.img.gz
[root@quadovm running_pool]# cp /root/openfiler-2.2-x86_64.img 60_iscsi1/
[root@quadovm running_pool]# cp /root/openfiler-2.2-x86_64.img 62_iscsi2/
|
如您在前面所看到的,OpenFiler Xen 设备可以作为单个镜像文件下载,但 Xen 需要使用内核和 initrd 镜像来引导虚拟机,而它们又位于镜像文件内部。为了解决这个鸡生蛋蛋生鸡的问题,您需要将 initrd 和内核镜像从所提供的镜像中提取出来,在 dom0 中跳过该镜像的前 512 个字节(MBR — 主引导记录)。然后,您将回送挂载内部文件系统并复制所需部分:
[root@quadovm running_pool]# losetup -o 512 /dev/loop4 |
由于您已经准备好系统、内核和 initrd 镜像,现在需要专用的磁盘来存储 iSCSI LUN。通过创建以零填充的大文件(OpenFiler VM 将这些文件用作实际的磁盘)即可达到此目的:
[root@quadovm running_pool]# dd if=/dev/zero of=60_iscsi1/volume1.img bs=1M |
现在您只差一步:创建 Xen 配置文件。(请确保使用第二个 SSH 会话将此步骤执行两次,在相应位置将 60_iscsi1 替换为 62_iscsi2。):
[root@quadovm running_pool]# cd 60_iscsi1 [root@quadovm 60_iscsi1]# cat > vm.cfg name = "iscsi1" kernel = "/OVS/running_pool/60_iscsi1/vmlinuz-2.6.16.29-0.11. |
通过上述内容,您可以了解到以下几点:
由于所提供的 Xen 镜像未进行预配置,因此您需要亲自执行此步骤。以 root 用户身份登录到 iscsi1,然后为新的 OpenFiler iscsi1 VM 模板重新配置联网。首先设置以太网配置文件 /etc/hosts、/etc/resolv.conf 和 sysconfig。最后,重新启动所有联网以显示新设置(无需重新启动 VM)。
Openfiler NAS/SAN Appliance
Powered by rPath Linux
To administer this appliance, please use a web browser
from another system to navigate to
For further information and commercial support, please visit
http://www.openfiler.com
localhost login:root
[root@localhost ~]# cd /etc
[root@localhost etc]# echo -e "10.99.1.101\tiscsi1">> hosts
[root@localhost sysconfig]# cd sysconfig
[root@localhost sysconfig]# cat > network
NETWORKING=yes
GATEWAY=10.99.1.1
HOSTNAME=iscsi1
<CTRL+D>
[root@localhost sysconfig]# cat >network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
NETMASK=255.255.255.0
IPADDR=10.99.1.101
<CTRL+D>
[root@localhost sysconfig]# cat >network-scripts/ifcfg-eth1
DEVICE=eth1
BOOTPROTO=none
ONBOOT=yes
TYPE=Ethernet
USERCTL=no
IPV6INIT=no
NETMASK=255.255.255.0
IPADDR=10.98.1.101
MTU=9000
<CTRL+D>
[root@localhost sysconfig]# echo "nameserver10.99.1.1" > /etc/resolv.conf
[root@localhost sysconfig]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down interface eth1: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface : [ OK ]
Bringing up interface eth0: [ OK ]
Bringing up interface eth1: [ OK ]
[root@localhost sysconfig]#
|
验证接口上的 IP 地址:
[root@localhost sysconfig]# ip a ls
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:16:3e:14:53:73 brd ff:ff:ff:ff:ff:ff
inet
|
为了避免混淆,请重新登录到 iscsi1 更改命令提示符,以显示新主机名。
现在更改 root 口令,因为 OpenFiler 未设置 root 口令:
[root@iscsi1 ~]# passwd
Changing password for user root.
New UNIX password:
BAD PASSWORD: it's WAY too short
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@iscsi1 ~]#
|
在 iscsi2 OpenFiler 模板上使用其他 SSH 会话执行相同的操作。以 root 用户身份登录,并执行与 iscsi1 相同的过程:
[root@quadovm ~]# cd /OVS/running_pool/62_iscsi2/ [root@quadovm 62_iscsi2]# cat > vm.cfg name = "iscsi2" kernel = "/OVS/running_pool/62_iscsi2/vmlinuz-2.6.16.29-0.11.smp. |
验证 IP 联网:
[root@localhost sysconfig]# ip a ls
1: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:16:3e:3c:bd:4a brd ff:ff:ff:ff:ff:ff
inet
|
重新登录,以避免进一步的混淆。现在可将网络浏览器指向以下地址:
注:为每个 iSCSI 存储设备执行此步骤两次。
首先,系统将提示您接受许可,然后您可以使用以下凭证进行登录:
提示:OpenFiler 的 root 口令与 Web 界面口令不同,但您可以使它们保持同步以减少管理开销。
转至Volumes 选项卡,再转至Physical Storage Mgmt.,然后单击/dev/xvdb(您手动创建的第二个镜像数据文件,大小为 12GB)。
转至Volume Group Mgmt.,使用类型“Physical volume”创建一个 x86 大分区(用于 LVM)。
再次转至Volume Group Mgmt.,然后仅使用 /dev/xvdb1 物理卷(在 LVM 术语中称为“PV”)创建名为“racdata1”/“racdata2”的卷组。
创建之后,应显示一个卷组。转至Create New Volumes 选项卡。
现在需要创建三个 iSCSI LUN:
创建这些 LUN 之后,可以查看表示存储分配卷组(名为“racdata1”/“racdata2”)的图表。
转至 Services -> Enable/disable 并启用iSCSI target。
转至General -> Local Networks,在Network Access Configuration 下创建“san1”,以从 10.98.1.0/24 网络(我们的 SAN 网络)建立 iSCSI 连接。
切换到 iSCSI LUN (Volumes -> List of existing volumes),编辑每个 iSCSI LUN。在“iSCSI host access”部分下面确认可以从 san1 网络访问此 iSCSI LUN。单击update 保存。
从现在开始,您已使两个 iSCSI 系统导出 LUN 可供 Oracle RAC 使用。
为扩展 RAC 重新配置 RAC VM除了 eth0,您没有其他以太网物理适配器,所以您需要手动模拟这些适配器,因为如果没有物理接口,Oracle VM 将不会创建网桥。具体而言,您希望为 iSCSI 通信添加 SAN 网络,并为 RAC 的缓存融合添加互连网络。
因此,您只需向 /etc/rc.d/rc.local 中添加以下行,以创建其他以太网桥。(如果您不想重新启动 Oracle VM,则应手动执行这些命令。)
[root@quadovm ~]# cat >> /etc/rc.d/rc.local
|
接下来,出于性能考虑,必须确保 SAN 桥和互连网桥始终保持 MTU 为 9000。(这是一个改动,因为您需要推迟设置 MTU,直至 Xen 使前端和后端网络虚拟化驱动程序保持同步。)
[root@quadovm ~]# cat > fixbrmtu.sh
#!/bin/sh
bridge=$1
if [ "$bridge" != "sanbr0" -a "$bridge" != "ibr0" ]; then
logger -t fixbrmtu -p syslog.notice Skipping MTU fix for bridge=$bridge
exit 0
fi
logger -t fixbrmtu -p syslog.notice Fixing MTU for bridge=$bridge
while : ; do
cd /sys/class/net/$bridge/brif || exit 1
err=0
for iface in *; do
ip link set dev $iface mtu 9000 > /dev/null 2>&1
if [ $? -ne 0 ]; then
err=$[err+1]
fi
done
if [ $err -eq 0 ]; then
break
fi
sleep 1
done
ip link set dev $bridge mtu 9000
exit 0
<CTRL+D>
[root@quadovm ~]# chmod 700 fixbrmtu.sh
|
接下来,使用 vi 编辑 /etc/xen/scripts/vif-bridge 文件,在“success”行后面添加粗体显示的行:
log debug "Successful vif-bridge $command for $vif, bridge $bridge."
if [ "$command" = "online" ]
then
success (/root/fixbrmtu.sh "$bridge") &
fi
|
以 root 用户身份登录到 Oracle VM 上,切换到 /OVS/running_pool/ 并编辑 rac1 和 rac2 的 vm.cfg,将 vif 行更改为以下内容:
vif = ['bridge=xenbr0', 'bridge=ibr0', 'bridge=sanbr0'] |
总的说来,您希望 RAC VM 通过以下方式连接到网桥:
注:Oracle VM Manager 中不会显示其他接口。
接下来启动 VM(针对 rac1 和 rac2):
[root@quadovm 134_rac2]# xm create vm.cfg
Using config file "./vm.cfg".
Started domain 134_rac2
[root@quadovm 134_rac2]#
|
检查正在运行的虚拟系统,如果全部正常,应显示类似如下的内容:
[root@quadovm ~]# xm list
Name ID Mem VCPUs State Time(s)
132_rac1 7 2048 1 -b---- 12.8
134_rac2 8 2048 1 r----- 7.2
Domain-0 0 512 4 r----- 287.6
iscsi1 5 768 1 -b---- 4.8
iscsi2 6 768 1 -b---- 4.8
[root@quadovm ~]#
|
默认情况下,Oracle VM 模板的凭证配置如下:
首先重新配置 rac1 节点;通过本地控制台连接到该节点:
[root@quadovm ~]# xm console 132_rac1
rtc: IRQ 8 is not free.
i8042.c: No controller found.
Enterprise Linux Enterprise Linux Server release 5.1 (Carthage)
Kernel 2.6.18-53.1.13.9.1.el5xen on an x86_64
localhost.localdomain login:root
Password:<type “ovsroot”>
Last login: Wed Feb 20 14:21:42 from ca-ostest246.us.oracle.com
[root@localhost ~]#
|
运行网络配置实用程序:
[root@localhost ~]# export TERM=linux
[root@localhost ~]# system-config-network-tui
|
使用 system-config-network-tui 设置联网非常容易。配置公共接口(也是与 IP 网络之间的管理接口,可从 Oracle VM 外部看见此接口)由两项操作组成:选择“eth0”和设置 IP 地址、网络掩码、网关等。
成功配置“eth0”之后,可以配置“eth1”(互连)。只需创建一个新接口,方法是,选择<New device>,再选择Ethernet,然后选择您的 IP 联网。对 eth2 (SAN) 重复此步骤。
退出之后,完成网络配置(设置 DNS 解析器、主机名和 MTU 更改):
[root@localhost ~]# echo 'nameserver 10.99.1.1' > /etc/resolv.conf
[root@localhost ~]# cat > /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=no
HOSTNAME=rac1
<CTRL+D>
[root@localhost ~]# echo “MTU=9000” >> /etc/sysconfig/network-scripts/ifcfg-eth1
[root@localhost ~]# echo “MTU=9000” >> /etc/sysconfig/network-scripts/ifcfg-eth2
[root@localhost ~]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0: [ OK ]
Bringing up interface eth1: [ OK ]
Bringing up interface eth2: [ OK ]
[root@localhost ~]#
|
将以下内容保存为 /etc/hosts 文件:
127.0.0.1 localhost.localdomain localhost
# eth0: public network
10.99.1.91 rac1
10.99.1.92 rac2
# eth1: interconnect
10.97.1.1 rac1-priv
10.97.1.2 rac2-priv
# VIPs
10.99.1.201 rac1-vip
10.99.1.202 rac2-vip
# eth2: iSCSI SAN
10.98.1.101 iscsi1
10.98.1.102 iscsi2
# PUB for openfilers
10.99.1.101 iscsi1-pub
10.99.1.102 iscsi2-pub
|
为系统设置合适的时区(在本示例中为波兰时区):
[root@localhost ~]# ln -sf /usr/share/zoneinfo/Europe/Warsaw /etc/localtime
|
注销并再次登录到 rac1 后,您的 shell 将指出“root@rac1”。另外,务必检查与您的网关之间的连通性。请记得在 rac2 上使用合适的 IP 地址执行相同的操作。
默认情况下,Oracle VM 模板没有 iSCSI 启动器实用程序的用户空间部分。可从 Oracle Enterprise Linux ISO 镜像(几个 GB)中获取该部分,但为了加快此过程,可为改从此处将其下载到您的工作站中。
然后将 iSCSI 启动器的副本复制到两个 RAC 节点上(从您的工作站中):
[vnull@xeno RPMS_el51]$ scp iscsi-initiator-utils*.rpm root@10.99.1.91:. root@10.99.1.91's password: iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm 100% 528KB 528.2KB/s 00:00 [vnull@xeno RPMS_el51]$ scp iscsi-initiator-utils*.rpm root@10.99.1.92:. root@10.99.1.92's password: iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm 100% 528KB 528.2KB/s 00:00 [vnull@xeno RPMS_el51]$ |
现在安装 iSCSI 启动器,使用基本配置设置该启动器并启用它(在每个 RAC 节点上;记得更改 rac2 的 InitiatorAlias):
[root@rac1 ~]# rpm -Uhv iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm
Preparing... ########################################### [100%]
1:iscsi-initiator-utils ########################################### [100%]
[root@rac1 ~]# rm iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm
rm: remove regular file `iscsi-initiator-utils-6.2.0.865-0.8.el5.x86_64.rpm'?y
[root@rac1 ~]#
[root@rac1 ~]# echo "InitiatorAlias=rac1" >> /etc/iscsi/initiatorname.iscsi
[root@rac1 ~]# service iscsid start
Turning off network shutdown. Starting iSCSI daemon: [ OK ]
[ OK ]
[root@rac1 ~]# chkconfig iscsid on
[root@rac1 ~]# chkconfig iscsi on
|
禁用不需要的服务(在每个 RAC 节点上):
[root@rac1 ~]# chkconfig --level 0123456 bluetooth off
[root@rac1 ~]# chkconfig --level 0123456 cups off
[root@rac1 ~]# chkconfig --level 0123456 ip6tables off
[root@rac1 ~]# chkconfig --level 0123456 iptables off
[root@rac1 ~]# chkconfig --level 0123456 o2cb off
[root@rac1 ~]# chkconfig --level 0123456 o2cb off
[root@rac1 ~]# chkconfig --level 0123456 ocfs2 off
[root@rac1 ~]# chkconfig --level 0123456 sendmail off
[root@rac1 ~]# reboot
|
在其他本地硬盘上为 Oracle 软件挂载点 (/u01) 准备分区(在两个 RAC 节点上):
[root@rac1 ~]# fdisk /dev/hdd
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.
The number of cylinders for this disk is set to 1044.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help):n
Command action
e extended
p primary partition (1-4)p
Partition number (1-4):1
First cylinder (1-1044, default 1):<ENTER>
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044):<ENTER>
Using default value 1044
Command (m for help):p
Disk /dev/hdd: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hdd1 1 1044 8385898+ 83 Linux
Command (m for help):w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@rac1 ~]#
[root@rac1 ~]# mkfs.ext3 -j /dev/hdd1
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
1048576 inodes, 2096474 blocks
104823 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 29 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@rac1 ~]#
[root@rac1 ~]# mkdir /u01
[root@rac1 ~]# echo -e '/dev/hdd1\t\t/u01\t\t\text3\tdefaults,noatime\t1 2'
|
设置动态设备管理,以便为 iSCSI SAN 创建正确的命名;首先通过执行以下命令创建 /etc/udev/rules.d/55-openiscsi.rules 文件(在每个 RAC 节点上):
[root@rac1 ~]# cat > /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{1}/lun%c{2}/part%n", OWNER="oracle", MODE="0640",
|
udevd 提供一个动态设备目录,此目录只包含实际存在设备的文件。它将在 /dev 目录中创建或删除设备节点文件。udevd 的工作方式是,从内核接收插入系统的所有新设备的 u 事件 (uevent)。对于每个事件,将根据新设备属性检查规则文件。基于此,您可以创建符号链接、更改所有权和访问权限,以及启动外部程序。
此规则文件将为每个新 SCSI 设备启动 iscsidev.sh 脚本,此脚本是通过运行以下命令创建的:
[root@rac2 ~]# mkdir -p /etc/udev/scripts
[root@rac2 ~]# cat > /etc/udev/scripts/iscsidev.sh
#!/bin/sh
#iscsidev.sh
BUS=${1}
HOST=${BUS%%:*}
LUN=`echo ${BUS} | cut -d":" -f4`
file="/sys/class/scsi_host/host${HOST}/device/session*/iscsi_session*/
|
此脚本确定传递的 SCSI 设备是否真正是 iSCSI,并将有关该设备的信息返回给 udev。配置完 iSCSI 启动器后,可以执行 iSCSI 目标查找,以连接到存储阵列(在每个 RAC 节点上运行):
[root@rac1 ~]# iscsiadm -m discovery -t sendtargets -p 10.98.1.101
10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.asm1
10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.ocr
10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.voting
[root@rac1 ~]# iscsiadm -m discovery -t sendtargets -p 10.98.1.102
10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.asm1
10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.ocr
10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.voting
[root@rac1 ~]# iscsiadm -m discovery -l
10.98.1.101:3260 via sendtargets
10.98.1.102:3260 via sendtargets
[root@rac2 ~]# iscsiadm -m node | sort
10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.asm1
10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.ocr
10.98.1.101:3260,1 iqn.2006-01.com.openfiler:racdata1.voting
10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.asm1
10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.ocr
10.98.1.102:3260,1 iqn.2006-01.com.openfiler:racdata2.voting
[root@rac1 ~]#
|
现在只登录到存储设备(在两个 RAC 节点上):
[root@rac1 ~]# iscsiadm -m node -L all
Login session [iface: default,
target: iqn.2006-01.com.openfiler:racdata2.asm1, portal: 10.98.1.102,3260]
Login session [iface: default,
target: iqn.2006-01.com.openfiler:racdata2.ocr, portal: 10.98.1.102,3260]
Login session [iface: default,
target: iqn.2006-01.com.openfiler:racdata1.voting, portal: 10.98.1.101,3260]
Login session [iface: default,
target: iqn.2006-01.com.openfiler:racdata1.ocr, portal: 10.98.1.101,3260]
Login session [iface: default,
target: iqn.2006-01.com.openfiler:racdata1.asm1, portal: 10.98.1.101,3260]
Login session [iface: default,
target: iqn.2006-01.com.openfiler:racdata2.voting, portal: 10.98.1.102,3260]
[root@rac1 ~]#
|
现在应对 iSCSI LUN 进行分区。您将在 iSCSI 检测到的所有设备上为每个 LUN 创建一个大分区。( 警告! 这是一个非常危险的脚本;它将删除所有 iSCSI LUN 上的分区表!)
保存以下脚本:
#!/bin/sh
[ -d /dev/iscsi ] || exit 100
for LUN in `find /dev/iscsi -type l`; do
echo $LUN
dd if=/dev/zero of=$LUN bs=512 count=1
echo -en "0,\n;\n;\n;\n" | sfdisk -q $LUN
done
|
赋予该脚本执行权限并运行它(仅从一个节点!):
[root@rac2 ~]# chmod 700 partit.sh
[root@rac2 ~]# ./partit.sh
[..lots of partitioning output..]
|
在第一个节点上,必须检测由 rac2 执行的更改:
[root@rac1 ~]# partprobe |
之后可以使用 fdisk -l 验证分区。
iSCSI 优化若要优化性能,需要优化 iSCSI 存储。此操作主要包括 TCP/IP 堆栈优化,因为 iSCSI 协议基于 TCP。在 OpenFilers(iscsi1 和 iscsi2)上编辑 /etc/init.d/iscsi-target,并将 MEM_SIZE 变量设置为 1073741824。这将确保在 iscsi1 和 iscsi2 上启动 iSCSI 目标之前,TCP 网络缓冲区得到正确设置。
然后,将旧的 /etc/ietd.conf 备份到 /etc/ietd.conf.old,并向该文件中添加以下内容:
MaxConnections 1 InitialR2T No ImmediateData Yes MaxRecvDataSegmentLength 16776192 MaxXmitDataSegmentLength 16776192 MaxBurstLength 16776192 FirstBurstLength 16776192 MaxOutstandingR2T 16 Wthreads 16 DataDigest None HeaderDigest None |
完成更改后,重新引导 iscsi1 和 iscsi2。
注:请记住,每次添加、重新配置或删除新的 iSCSI LUN 时,都将重新生成此文件。
现在需要重新配置 RAC 节点以获取良好的 iSCSI 性能。在 rac1 和 rac2 节点上编辑 /etc/sysctl.conf,并对以下参数进行适当的更改:
net.core.rmem_max = 1073741824 net.core.wmem_max = 1073741824 net.ipv4.tcp_rmem = 1048576 16777216 1073741824 net.ipv4.tcp_wmem = 1048576 16770216 1073741824 net.ipv4.tcp_mem = 1048576 16770216 1073741824 |
在两个 RAC 节点上更改 /etc/iscsi/iscsid.conf(iSCSI 启动器配置),最后重新引导以使更改生效(当然,可以重新启动 iSCSI 客户端并执行 sysctl -p):
[root@rac2 ~]# cat > /etc/iscsi/iscsid.conf
node.startup = automatic
node.session.timeo.replacement_timeout = 120
node.conn[0].timeo.login_timeout = 15
node.conn[0].timeo.logout_timeout = 15
node.conn[0].timeo.noop_out_interval = 10
node.conn[0].timeo.noop_out_timeout = 15
node.session.initial_login_retry_max = 4
node.session.cmds_max = 128
node.session.queue_depth = 128
node.session.iscsi.InitialR2T = No
node.session.iscsi.ImmediateData = Yes
node.session.iscsi.FirstBurstLength = 16776192
node.session.iscsi.MaxBurstLength = 16776192
# the default is 131072
node.conn[0].iscsi.MaxRecvDataSegmentLength = 16776192
# the default is 32768
discovery.sendtargets.iscsi.MaxRecvDataSegmentLength = 16776192
node.conn[0].iscsi.HeaderDigest = None
node.session.iscsi.FastAbort = No
<CTRL+D>
[root@rac2 ~]# reboot
|
注:此更改以及以前的更改(针对 OpenFilers)为我们提供了最佳的原始序列化写入 iSCSI 性能(使用 dd 命令直接在 iSCSI LUN 上进行过测试,块大小等于 1MB)。此性能随系统的不同而有差异(取决于所使用的硬件、软件版本和其他因素)。