11. 为 Oracle 配置 Linux 服务器
在集群中的所有节点上执行下列配置过程!
每次启动计算机时,都需要在集群中的每个节点上执行本节中的一些命令。本节详细介绍了如何设置共享内存、信号和文件句柄限制。第 14 节(“用于每个 RAC 节点的所有启动命令”)中包含有关如何将这些命令置于启动脚本 (/etc/sysctl.conf) 中的说明。
概述
本节主要介绍了如何配置两个 Linux 服务器:使每个服务器为 Oracle RAC 10g 安装做好准备。这包括验证足够的交换空间、设置共享内存和信号,以及最后如何设置操作系统的最大文件句柄数。
在本节中,您将注意到可以使用多种方法来配置(设置)这些参数。就本文而言,我将通过把所有命令置于 /etc/sysctl.conf 文件中使所有更改永久有效(通过重新引导)。
对交换空间的考虑因素
- 安装 Oracle10g 第 2 版至少需要 512MB 内存。(注:安装期间交换容量不足会导致 Oracle Universal Installer“挂起”或“死机”)
- 要检查您已经分配的内存/交换容量,键入:
# cat /proc/meminfo | grep MemTotal
MemTotal:1034352 kB
- 如果您的内存少于 512MB(介于 RAM 与 SWAP 之间),您可以通过创建临时交换文件添加临时交换空间。这样,您就不必使用原始设备甚至更彻底地重建系统了。
以 root 身份创建一个用作额外交换空间的文件,假设大小为 300MB:
# dd if=/dev/zero of=tempswap bs=1k count=300000
现在我们应该更改文件的权限:
# chmod 600 tempswap
最后我们将该“分区”格式化为交换分区,并将其添加到交换空间:
# mke2fs tempswap
# mkswap tempswap
# swapon tempswap
设置共享内存
共享内存通过将通用的结构和数据放在共享内存段中,使得进程可以对它们进行访问。这是现有最快的进程间通信 (IPC) 方式,主要是因为数据在进程之间传递时没有涉及内核操作。不需要在进程间复制数据。
Oracle 将共享内存用于它的共享全局区 (SGA),这是一个由所有的 Oracle 备份进程及前台进程共享的内存区域。为 SGA 分配足够的容量对于 Oracle 的性能非常重要,这是因为它负责保存数据库缓冲区高速缓存、共享 SQL、访问路径,等等。
要确定所有共享内存的限制,使用以下命令:
# ipcs -lm
------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 32768
max total shared memory (kbytes) = 8388608
min seg size (bytes) = 1
设置 SHMMAX
SHMMAX 参数定义共享内存段的最大大小(以字节为单位)。Oracle SGA 由共享内存组成,且错误设置 SHMMAX 可能会限制 SGA 的大小。在设置 SHMMAX 时,切记 SGA 的大小应该适合于一个共享内存段。SHMMAX 设置不足可能会导致以下问题:
ORA-27123:unable to attach to shared memory segment
您可以通过执行以下命令确定 SHMMAX 的值: # cat /proc/sys/kernel/shmmax
33554432
SHMMAX 的默认值为 32MB。通常,这个值对于配置 Oracle SGA 而言太小了。我通常使用以下方法将 SHMMAX 参数设置为 2GB:
- 可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/kernel/shmmax) 来更改 SHMMAX 的默认设置,而不必重新引导计算机:
# sysctl -w kernel.shmmax=2147483648
- 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使该更改永久有效:
# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
设置 SHMMNI
我们现在看一下 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096。
可以通过执行以下命令确定 SHMMNI 的值:
# cat /proc/sys/kernel/shmmni
4096
SHMMNI 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。
设置 SHMALL
最后,我们来看 SHMALL 共享内存内核参数。该参数控制系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应至少为:
ceil(SHMMAX/PAGE_SIZE)
SHMALL 的默认大小为 2097152,并可以使用以下命令进行查询: # cat /proc/sys/kernel/shmall
2097152
SHMALL 的默认设置应足以满足 Oracle RAC 10g 第 2 版安装的需要。
(注:i386 平台上的 Red Hat Linux 中的页面大小为 4,096 字节。但您可以使用 bigpages,它支持更大内存页面的配置。)
设置信号
至此,您已经配置了共享内存设置,接下来将配置信号。对“信号”的最佳描述是,它是用于在共享资源(如共享内存)的进程(或进程中的线程)之间提供同步的计数器。UNIX System V 支持信号集,其中的每个信号都是一个计数信号。当应用程序请求信号时,它使用“集合”来完成此工作。
要确定所有信号限制,使用以下命令:
# ipcs -ls
------ Semaphore Limits --------
max number of arrays = 128
max semaphores per array = 250
max semaphores system wide = 32000
max ops per semop call = 32
semaphore max value = 32767
您还可以使用以下命令:
# cat /proc/sys/kernel/sem
250 32000 32 128
设置 SEMMSL
SEMMSL 内核参数用于控制每个信号集合的最大信号数。
Oracle 建议将 SEMMSL 设置为 init.ora 文件(适用于 Linux 系统上所有数据库)中的最大 PROCESS 实例参数设置再加上 10。此外,Oracle 建议将 SEMMSL 设置为不小于 100。
设置 SEMMNI
SEMMNI 内核参数用于控制整个 Linux 系统中信号集的最大数量。Oracle 建议将 SEMMNI 设置为不小于 100。
设置 SEMMNS
SEMMNS 内核参数用于控制整个 Linux 系统中的信号(而非信号集)的最大数量。
Oracle 建议将 SEMMNS 设置为系统上每个数据库的 PROCESSES 实例参数设置之和,加上最大的 PROCESSES 的两倍,最后为系统上的每个 Oracle 数据库加上 10。
使用以下计算式确定可以在 Linux 系统上分配的信号的最大数量。它将是以下两者中较小的一个值:
SEMMNS — 或 — (SEMMSL * SEMMNI) 。
设置 SEMOPM
SEMOPM 内核参数用于控制每个 semop 系统调用可以执行的信号操作数。
semop 系统调用(函数)能够使用一个 semop 系统调用完成多个信号的操作。一个信号集可以拥有每个信号集中最大数量的 SEMMSL,因此建议将 SEMOPM 设置为等于 SEMMSL。
Oracle 建议将 SEMOPM 设置为不小于 100。
设置信号内核参数
最后,我们来看如何使用一些方法来设置所有信号参数。在下文中,我想更改(增加)的唯一参数是 SEMOPM。所有其他的默认设置可以完全满足我们的示例安装。
- 可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/kernel/sem) 来更改所有信号设置的默认设置,而不必重新引导计算机:
# sysctl -w kernel.sem="250 32000 100 128"
- 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
# echo "kernel.sem=250 32000 100 128" >> /etc/sysctl.conf
设置文件句柄
在配置我们的 Red Hat Linux 服务器时,确保文件句柄的最大数量足够大是非常关键的。文件句柄的设置表示您在 Linux 系统上可以打开的文件数。
使用以下命令来确定整个系统中文件句柄的最大数量:
# cat /proc/sys/fs/file-max
102563
Oracle 建议将整个系统的文件句柄值至少设置为 65536。
- 可以通过使用以下命令直接更改 /proc 文件系统 (/proc/sys/fs/file-max) 更改文件句柄最大数量的默认设置,不必重新引导计算机:
# sysctl -w fs.file-max=65536
- 然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
# echo "fs.file-max=65536" >> /etc/sysctl.conf
可以通过使用以下命令查询文件句柄的当前使用情况: # cat /proc/sys/fs/file-nr
825 0 65536
file-nr 文件显示了三个参数:分配的文件句柄总数、当前使用的文件句柄数以及可以分配的最大文件句柄数。
(注:如果需要增大 /proc/sys/fs/file-max 中的值,请确保正确设置 ulimit。对于 2.4.20,通常将其设置为 unlimited。使用 ulimit 命令验证 ulimit 设置:
# ulimit
unlimited
12. 配置 hangcheck-timer 内核模块
在集群中的所有节点上执行下列配置过程!
Oracle9i 第 1 版 (9.0.1) 和 Oracle9i 第 2 版 ( 9.2.0.1) 使用一个称为 watchdogd 的用户空间监视后台程序 监视集群的运行状况,并在出现故障时重新启动 RAC 节点。从 Oracle9i 第 2 版 (9.2.0.2) 开始(在 Oracle 10g 第 2 版中仍然存在),一个称为 hangcheck-timer 的 Linux 内核模块取代了监视后台程序,该模块更好地解决了可用性和可靠性问题。它将 hang-check 计时器加载到 Linux 内核中并检查系统是否挂起。它将设置一个计时器,并在特定的时间量之后检查该计时器。有一个用于检查挂起情况的可配置阈值,如果超过该阈值,计算机将重新启动。尽管 Oracle 集群件(集群管理器)操作不需要 hangcheck-timer 模块,但 Oracle 强烈建议使用它。
hangcheck-timer.ko 模块
hangcheck-timer 模块使用了一个基于内核的计时器,该计时器周期性地检查系统任务调度程序来捕获延迟,从而确定系统的运行状况。如果系统挂起或暂停,则计时器重置该节点。hangcheck-timer 模块使用时间戳计数器 (TSC) CPU 寄存器,该寄存器每接收到一个时钟信号就将计数加一。由于此寄存器由硬件自动更新,因此 TCS 提供了更精确的时间度量。
关于 hangcheck-timer 项目的更多信息可在此处找到。
安装 hangcheck-timer.ko 模块
hangcheck-timer 最初只由 Oracle 提供;但是,从内核版本 2.4.9-e.12 和更高版本开始,此模块现在包含在 Red Hat Linux 中。如果您按照第 8 节(“获取并安装新的 Linux 内核/FireWire 模块”)中的步骤执行操作,则已经包含了 hangcheck-timer。使用以下命令确认:
# find /lib/modules -name "hangcheck-timer.ko"
/lib/modules/2.6.9-11.0.0.10.3.EL/kernel/drivers/char/hangcheck-timer.ko
/lib/modules/2.6.9-22.EL/kernel/drivers/char/hangcheck-timer.ko
在以上输出中,我们关注的是
/lib/modules/2.6.9-11.0.0.10.3.EL/kernel/drivers/char 目录中的 hangcheck 计时器对象 (
hangcheck-timer.ko)。
配置并加载 hangcheck-timer 模块
hangcheck-timer 模块有两个关键的参数:
- hangcheck-tick:此参数定义了系统运行状况检查的间隔时间。默认值为 60 秒;Oracle 建议将它设置为 30 秒。
- hangcheck-margin:此参数定义了 hangcheck-timer 在重置 RAC 节点前所容许的最大挂起延迟。它定义了以秒为单位的误差幅度。默认值为 180 秒;Oracle 建议将它设置为 180 秒。
注意:这两个
hangcheck-timer 模块参数表示在该模块重置系统前 RAC 节点必须挂起的时长。当以下条件为真时将会重置节点:
系统挂起时间 > (hangcheck_tick + hangcheck_margin)
配置 Hangcheck 内核模块参数
每次加载 hangcheck-timer 内核模块(手动加载或由 Oracle 加载)时,它都需要知道对我们刚刚讨论的两个参数(hangcheck-tick 和 hangcheck-margin) 所使用的值。这些值需要在每次重新启动 Linux 服务器后可用。为此,在 /etc/modprobe.conf 文件中创建一个具有正确值的条目,如下所示:
# su -
# echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modprobe.conf
每次加载 hangcheck-timer 内核模块时,它将使用由我在
/etc/modprobe.conf 文件中创建的条目定义的值。
手动加载 Hangcheck 内核模块以进行测试
Oracle 负责在需要时加载 hangcheck-timer 内核模块。因此,不必在任何启动文件(如 /etc/rc.local)中执行 hangcheck-timer 内核模块的 modprobe 或 insmod。
我继续在 /etc/rc.local 文件中包含 hangcheck-timer 内核模块的 modprobe 完全只是出于个人习惯。有朝一日我将戒掉这个习惯,但请注意,启动过程中包含 hangcheck-timer 内核模块的 modprobe 并无害处。
为了使自己保持清醒并能够在夜晚安睡,我始终按如下所示在每次启动时配置 hangcheck-timer 内核的加载:
# echo "/sbin/modprobe hangcheck-timer" >> /etc/rc.local
(注:您不必在每次重新启动后使用 modprobe 或 insmod 手动加载 hangcheck-timer 内核模块。Oracle 将在需要时自动加载 hangcheck-timer 模块。)
现在,为了测试 hangcheck-timer 内核模块以验证它是否选取我们在 /etc/modprobe.conf 文件中定义的正确参数,使用 modprobe 命令。尽管可以通过向其传递相应的参数(如 insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180)加载 hangcheck-timer 内核模块,但我们需要验证它是否选取了我们在 /etc/modprobe.conf 文件中设置的选项。
要手动加载 hangcheck-timer 内核模块并验证它是否使用在 /etc/modprobe.conf 文件中定义的正确值,运行以下命令:
# su -
# modprobe hangcheck-timer
# grep Hangcheck /var/log/messages | tail -2
Sep 27 23:11:51 linux2 kernel:Hangcheck:starting hangcheck timer 0.5.0 (tick is 30 seconds, margin is 180 seconds)
13. 配置 RAC 节点以进行远程访问
在集群中的所有节点上执行下列配置过程!
在 RAC 节点上运行 Oracle Universal Installer 时,它将使用 rsh(或 ssh)命令将 Oracle 软件复制到 RAC 集群中的所有其他节点上。运行 Oracle Installer (runInstaller) 的节点上的 oracle UNIX 帐户必须为 RAC 集群中的所有其他节点所信任。因此,您应该能够在将要从中运行 Oracle Installer 的 Linux 服务器上,不使用口令对集群中的所有其他 Linux 服务器运行 r* 命令(如 rsh、rcp 和 rlogin)。rsh 后台程序使用位于用户(oracle 的)主目录中的 /etc/hosts.equiv 文件或 .rhosts 文件验证用户。(正常的 RAC 操作不需要使用 rcp 和 rsh。但应为 RAC 和补丁集安装启用 rcp 和 rsh。)
Oracle 在 Oracle RAC 10g 第 1 版中增加了一项支持,即可以将安全 Shell (SSH) 工具套件用于设置用户等效项。但本文使用较旧的方法 rcp 将 Oracle 软件复制到集群中的其他节点上。使用 SSH 工具套件时,可以使用 scp(与 rcp 相反)命令以非常安全的方式复制软件。
首先,确保在 RAC 集群中的每个节点上都安装了 rsh RPM:
# rpm -q rsh rsh-server
rsh-0.17-25.3
rsh-server-0.17-25.3
根据以上信息,我们可以确认已经安装了
rsh 和
rsh-server。如果未安装
rsh,则可以从 RPM 所在的 CD 中运行以下命令:
# su -
# rpm -ivh rsh-0.17-25.3.i386.rpm rsh-server-0.17-25.3.i386.rpm
要启用“rsh”和“rlogin”服务,必须将
/etc/xinetd.d/rsh 文件中的“disable”属性设置为“
no”并且必须重新加载
xinetd。为此,在集群中的
所有节点上运行以下命令:
# su -
# chkconfig rsh on
# chkconfig rlogin on
# service xinetd reload
Reloading configuration:[ OK ]
要使“oracle”UNIX 用户帐户在 RAC 节点中获得信任,在集群中的
所有节点上创建
/etc/hosts.equiv 文件:
# su -
# touch /etc/hosts.equiv
# chmod 600 /etc/hosts.equiv
# chown root.root /etc/hosts.equiv
现在,将所有 RAC 节点添加到集群中类似于以下示例的
所有节点的
/etc/hosts.equiv 文件中:
# cat /etc/hosts.equiv
+linux1 oracle
+linux2 oracle
+int-linux1 oracle
+int-linux2 oracle
注意:在以上示例中,第二个字段只允许
oracle 用户帐户在指定节点上运行
rsh 命令。由于安全原因,
/etc/hosts.equiv 文件应该由
root 所拥有,并应该将权限设置为
600。实际上,某些系统只有在文件所有者为
root 且权限设置为
600 时,才接受此文件的内容。
尝试测试 rsh 命令前,确保使用的是正确版本的 rsh。在默认情况下,Red Hat Linux 将 /usr/kerberos/sbin 放在 $PATH 变量的前面。这会导致执行 rsh 的 Kerberos 版本。
我通常会重命名 rsh 的 Kerberos 版本,以便使用正常的 rsh 命令。使用以下命令:
# su -
# which rsh
/usr/kerberos/bin/rsh
# mv /usr/kerberos/bin/rsh /usr/kerberos/bin/rsh.original
# mv /usr/kerberos/bin/rcp /usr/kerberos/bin/rcp.original
# mv /usr/kerberos/bin/rlogin /usr/kerberos/bin/rlogin.original
# which rsh
/usr/bin/rsh
现在,应从将要执行 Oracle 集群件和 10g RAC 安装的节点测试连接并运行
rsh 命令。我将使用节点
linux1 执行所有安装,因此我将从该节点运行以下命令:
# su - oracle
$ rsh linux1 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Sep 27 23:37 /etc/hosts.equiv
$ rsh int-linux1 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Sep 27 23:37 /etc/hosts.equiv
$ rsh linux2 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Sep 27 23:37 /etc/hosts.equiv
$ rsh int-linux2 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Sep 27 23:37 /etc/hosts.equiv
14. 适用于每个 RAC 节点的所有启动命令
验证以下启动命令是否包含在集群中的所有节点上!
至此,您已经详细了解了需要在 Oracle10g RAC 配置的所有节点上配置的参数和资源。在本部分中,我们将稍事调整,简要复述这些参数、命令和条目(在本文前面的章节中已提到过),当引导计算机时需要在每个节点上执行它们。
对于以下的每个启动文件,都应将灰色的条目包含在每个启动文件中。
/etc/modprobe.conf
(所有要由内核模块使用的参数和值。)
alias eth0 b44
alias eth1 tulip
alias snd-card-0 snd-intel8x0
options snd-card-0 index=0
alias usb-controller ehci-hcd
alias usb-controller1 uhci-hcd
options sbp2 exclusive_login=0
alias scsi_hostadapter sbp2
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
/etc/sysctl.conf
(我们需要调整互联的默认和最大发送缓冲区大小以及默认和最大的接收缓冲区大小。)该文件还包含那些负责配置由 Oracle 实例使用的共享内存、信号和文件句柄的参数。)
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.See sysctl(8) and
# sysctl.conf(5) for more details.
# Controls IP packet forwarding
net.ipv4.ip_forward = 0
# Controls source route verification
net.ipv4.conf.default.rp_filter = 1
# Controls the System Request debugging functionality of the kernel
kernel.sysrq = 0
# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1
# Default setting in bytes of the socket receive buffer
net.core.rmem_default=262144
# Default setting in bytes of the socket send buffer
net.core.wmem_default=262144
# Maximum socket receive buffer size which may be set by using
# the SO_RCVBUF socket option
net.core.rmem_max=262144
# Maximum socket send buffer size which may be set by using
# the SO_SNDBUF socket option
net.core.wmem_max=262144
# +---------------------------------------------------------+
# | SHARED MEMORY |
# +---------------------------------------------------------+
kernel.shmmax=2147483648
# +---------------------------------------------------------+
# | SEMAPHORES |
# | ---------- |
# | |
# | SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value |
# | |
# +---------------------------------------------------------+
kernel.sem=250 32000 100 128
# +---------------------------------------------------------+
# | FILE HANDLES |
# ----------------------------------------------------------+
fs.file-max=65536
/etc/hosts
(RAC 集群中的节点的所有计算机/IP 条目。)
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
# Public Network - (eth0)
192.168.1.100 linux1
192.168.1.101 linux2
# Private Interconnect - (eth1)
192.168.2.100 int-linux1
192.168.2.101 int-linux2
# Public Virtual IP (VIP) addresses for - (eth0)
192.168.1.200 vip-linux1
192.168.1.201 vip-linux2
192.168.1.106 melody
192.168.1.102 alex
192.168.1.105 bartman
/etc/hosts.equiv
(允许以 oracle 用户帐户登录每个节点而不需要口令。)
+linux1 oracle
+linux2 oracle
+int-linux1 oracle
+int-linux2 oracle
/etc/rc.local
(加载 hangcheck-timer 内核模块。)
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
# +---------------------------------------------------------+
# | HANGCHECK TIMER |
# | (I do not believe this is required, but doesn't hurt) |
# ----------------------------------------------------------+
/sbin/modprobe hangcheck-timer
15. 检查 Oracle 10g 第 2 版的 RPM 程序包
在集群中的所有节点上执行以下检查!
安装 Linux O/S(CentOS Enterprise Linux 或 RHEL4)时,应确保安装了所有必需的 RPM。如果您遵循我所提供的 Linux 安装指导,则已经安装了所有内容,这时您将拥有所有必需的 RPM 程序包。但如果您执行了其他安装类型(例如,高级服务器),则可能缺少某些程序包并需要安装它们。所有必需的 RPM 都位于 Linux CD/ISO 上。
检查必需的 RPM
必须安装以下程序包(或更高版本):
make-3.80-5
glibc-2.3.4-2.9
glibc-devel-2.3.4-2.9
glibc-headers-2.3.4-2.9
glibc-kernheaders-2.4-9.1.87
cpp-3.4.3-22.1
compat-db-4.1.25-9
compat-gcc-32-3.2.3-47.3
compat-gcc-32-c++-3.2.3-47.3
compat-libstdc++-33-3.2.3-47.3
compat-libstdc++-296-2.96-132.7.2
openmotif-2.2.3-9.RHEL4.1
setarch-1.6-1
要查询程序包信息(例如,gcc 和 glibc-devel),使用“rpm -q <程序包名> [, <程序包名>]”命令,如下所示:
# rpm -q gcc glibc-devel
gcc-3.4.3-22.1
glibc-devel-2.3.4-2.9
如果需要安装以上任意程序包,使用“
rpm -Uvh <程序包名.rpm>”。例如,要安装 GCC 3.2.3-24 程序包,使用:
# rpm -Uvh gcc-3.4.3-22.1.i386.rpm
重新启动系统
如果对 O/S 进行了任何更改,则在尝试安装任何 Oracle 组件之前应重新引导集群中的所有节点。!!!
# init 6
16. 安装和配置 OCFS2
应在集群中的所有节点上执行本节中的大多数配置过程!但创建 OCFS2 文件系统应只在集群中的一个节点上执行。
现在将安装 OCFS2。OCFS2 是一个集群文件系统,它允许集群中的所有节点通过标准文件系统接口并发访问设备。这样便可以对需要在集群中运行的应用程序进行轻松地管理。
OCFS 第 1 版于 2002 年发布,使 Oracle RAC 用户可以运行集群化数据库而不必处理 RAW 设备。文件系统是为存储数据库相关文件如数据文件、控制文件、重做日志、归档日志等设计的。而 OCFS2 则是作为一个通用集群文件系统而设计的。使用它,用户不但可以在共享磁盘上存储与数据库相关的文件,而且还可以存储 Oracle 二进制文件和配置文件(共享的 Oracle Home),从而使 RAC 的管理变得更简单。
在本指南中,您将使用 OCFS2 存储需要由 Oracle 集群件软件共享的两个文件。(除了这两个文件以外,您还将使用此空间存储所有 Oracle RAC 实例的共享 SPFILE。)
有关适用于 Linux 的 OCFS2 的更多信息(包括安装说明),请参见本页面。
下载 OCFS
首先,下载 OCFS2 发布版本。OCFS2 发布版本包含两组 RPM,即内核模块和工具。内核模块可以从 http://oss.oracle.com/projects/ocfs2/files/ 下载,而工具可以从 http://oss.oracle.com/projects/ocfs2-tools/files/ 下载。
从关键的 OCFS2 内核模块(驱动程序)开始,下载相应的 RPM。从三个可用的内核模块(如下所示)中,下载与发布版本、平台、内核版本以及内核风格(smp、hugemem、psmp 等)匹配的内核模块。
ocfs2-2.6.9-11.0.0.10.3.EL-1.0.4-1.i686.rpm -(适用于单处理器)
或
ocfs2-2.6.9-11.0.0.10.3.ELsmp-1.0.4-1.i686.rpm -(适用于多处理器)
或
ocfs2-2.6.9-11.0.0.10.3.ELhugemem-1.0.4-1.i686.rpm -(适用于 hugemem)
而工具只需匹配平台和发布版本。您应下载 OCFS2 工具和 OCFS2 控制台应用程序。
ocfs2-tools-1.0.2-1.i386.rpm -(OCFS2 工具)
ocfs2console-1.0.2-1.i386.rpm -(OCFS2 控制台)
尽管 OCFS2 控制台是可选的,但强烈建议使用它。ocfs2console 应用程序需要 e2fsprogs、glib2 2.2.3 或更高版本、vte 0.11.10 或更高版本、pygtk2 (EL4) 或 python-gtk (SLES9) 1.99.16 或更高版本、python 2.3 或更高版本以及 ocfs2-tools。
如果您不确定所需的 OCFS2 驱动程序版本,则使用与您的内核版本匹配的 OCFS2 版本。要确定您的内核版本,执行以下命令:
$ uname -a
Linux linux1 2.6.9-11.0.0.10.3.EL #1 Tue Jul 5 12:20:09 PDT 2005 i686 i686 i386 GNU/Linux
安装 OCFS2
我将把 OCFS2 文件安装到两台单处理器计算机中。安装过程只需要您以 root 用户帐户在集群中的所有节点上运行以下命令即可:
$ su -
# rpm -Uvh ocfs2-2.6.9-11.0.0.10.3.EL-1.0.4-1.i686.rpm \
ocfs2console-1.0.2-1.i386.rpm \
ocfs2-tools-1.0.2-1.i386.rpm
Preparing... ########################################### [100%]
1:ocfs2-tools ########################################### [ 33%]
2:ocfs2-2.6.9-11.0.0.10.3########################################### [ 67%]
3:ocfs2console ########################################### [100%]
禁用 SELinux(只适用于 RHEL4 U2)
向 RHEL4 U2 用户(CentOS 4.2 基于 RHEL4 U2)提供一个建议,即 OCFS2 当前无法在启用 SELinux 的情况下运行。如果您使用的是 RHEL4 U2(其中包括您,因为您在此处使用 CentOS 4.2),则您需要禁用 SELinux(使用工具 system-config-securitylevel)才能执行 O2CB 服务。
要禁用 SELinux,运行“Security Level Configuration”GUI 实用程序:
# /usr/bin/system-config-securitylevel &
这将显示以下屏幕:

图 6 Security Level Configuration 打开屏幕
现在,单击 SELinux 选项卡并取消选中“Enabled”复选框。单击 [OK] 后,将显示一个警告对话框。只需单击“Yes”确认该警告。禁用 SELinux 选项后,屏幕现在应如下所示:

图 7: 禁用了 SELinux
在集群中的两个节点上进行此更改后,将需要重新引导每个节点以实施更改:
# init 6
配置 OCFS2
下一步是在集群中的每个节点上生成和配置 /etc/ocfs2/cluster.conf 文件。完成此操作最简单的方法是运行 GUI 工具 ocfs2console。在本节中,我们不但使用 ocfs2console 创建和配置 /etc/ocfs2/cluster.conf 文件,而且还创建和启动集群堆栈 O2CB。如果 /etc/ocfs2/cluster.conf 文件不存在(本示例中便是这种情况),ocfs2console 工具将创建该文件以及一个默认集群名为 ocfs2 的新集群堆栈服务 (O2CB)。您将需要以 root 用户帐户在集群的所有节点上执行该操作:
$ su -
# ocfs2console &
这将显示如下所示的 GUI:

图 8 ocfs2console GUI
使用 ocfs2console GUI 工具执行以下步骤:
- 选择 [Cluster] -> [Configure Nodes...]。这将启动 OCFS 集群堆栈(图 9)并显示“Node Configuration”对话框。
- 在“Node Configuration”对话框上,单击 [Add] 按钮。
- 这将显示“Add Node”对话框。
- 在“Add Node”对话框中,输入集群中第一个节点的 Host name 和 IP address。将 IP Port 设置为默认值 7777。在我的示例中,我添加了两个节点,即使用 linux1 / 192.168.1.100 表示第一个节点,并使用 linux2 / 192.168.1.101 表示第二个节点。
- 单击“Node Configuration”对话框上的 [Apply] — 所有节点现在将处于“Active”状态,如图 10 所示。
- 单击“Node Configuration”对话框上的 [Close]。
- 确认所有值均正确后,使用 [File] -> [Quit] 退出应用程序。需要在集群的所有节点上执行该操作。

图 9。启动 OCFS2 集群堆栈
以下对话框显示了节点 linux1 和 linux2 的 OCFS2 设置:

图 10 为 OCFS2 配置节点
退出 ocfs2console 后,将获得一个类似如下所示的 /etc/ocfs2/cluster.conf。需要在集群中的所有节点上完成该过程,并且所有节点的 OCFS2 配置文件必须完全相同:
node:
ip_port = 7777
ip_address = 192.168.1.100
number = 0
name = linux1
cluster = ocfs2
node:
ip_port = 7777
ip_address = 192.168.1.101
number = 1
name = linux2
cluster = ocfs2
cluster:
node_count = 2
name = ocfs2
O2CB 集群服务
在使用 OCFS2 执行任何操作(如格式化或挂载文件系统)之前,我们需要先运行 OCFS2 的集群堆栈 O2CB(它将是以上执行的配置过程的结果)。此堆栈包含以下服务:
- NM:用于跟踪 cluster.conf 中的所有节点的节点管理器
- HB:当节点加入或离开集群时向上/向下发出通知的心跳服务
- TCP:处理节点之间的通信
- DLM:用于跟踪所有锁、这些锁的所有者和状态的分布式锁管理器
- CONFIGFS:在 /config 中挂载的用户空间驱动的配置文件系统
- DLMFS:用户空间与内核空间 DLM 的接口
已将以上所有集群服务打包到 o2cb 系统服务 (/etc/init.d/o2cb) 中。以下是 o2cb 系统服务的某些更有用的命令和选项的简要列表。
- /etc/init.d/o2cb status
Module "configfs":Not loaded
Filesystem "configfs":Not mounted
Module "ocfs2_nodemanager":Not loaded
Module "ocfs2_dlm":Not loaded
Module "ocfs2_dlmfs":Not loaded
Filesystem "ocfs2_dlmfs":Not mounted
注意,本示例未加载所有服务。我在执行“status”选项之前执行了“unload”。如果要在使用 ocfs2console 实用程序配置 OCFS 后立即检查 o2cb 服务的状态,则将加载所有这些服务。
- /etc/init.d/o2cb load
Loading module "configfs":OK
Mounting configfs filesystem at /config:OK
Loading module "ocfs2_nodemanager":OK
Loading module "ocfs2_dlm":OK
Loading module "ocfs2_dlmfs":OK
Mounting ocfs2_dlmfs filesystem at /dlm:OK
加载所有 OCFS 模块。
- /etc/init.d/o2cb online ocfs2
Starting cluster ocfs2:OK
以上命令将使我们创建的集群 ocfs2 处于联机状态。
- /etc/init.d/o2cb offline ocfs2
Unmounting ocfs2_dlmfs filesystem:OK
Unloading module "ocfs2_dlmfs":OK
Unmounting configfs filesystem:OK
Unloading module "configfs":OK
以上命令将使我们创建的集群 ocfs2 处于脱机状态。
- /etc/init.d/o2cb unload
Cleaning heartbeat on ocfs2:OK
Stopping cluster ocfs2:OK
以上命令将卸载所有 OCFS 模块。
将 O2CB 配置为在引导时启动
您现在需要配置 OC2B 驱动程序的引导属性,以便在每次引导时将启动集群堆栈服务。需要在集群的两个节点上执行本节中的所有任务。
注意:在撰写本指南时,OCFS2 包含一个错误,即不会在每次引导时加载驱动程序,即使将引导属性配置为执行此操作后也是如此。在尝试根据正式的 OCFS2 文档将引导属性配置为在每次引导时启动后,您在每次引导时将仍收到以下错误:
...
Mounting other filesystems:
mount.ocfs2:Unable to access cluster service
Cannot initialize cluster mount.ocfs2:
Unable to access cluster service Cannot initialize cluster [FAILED]
...
Red Hat 更改了在 chkconfig-1.3.11.2-1 与 chkconfig-1.3.13.2-1 之间注册服务的方式。O2CB 脚本习惯使用前者。
在尝试配置引导属性之前:
- 删除 /etc/init.d/o2cb 中的以下几行
### BEGIN INIT INFO
# Provides:o2cb
# Required-Start:
# Should-Start:
# Required-Stop:
# Default-Start: 2 3 5
# Default-Stop:
# Description:Load O2CB cluster services at system boot.
### END INIT INFO
- 重新注册 o2cb 服务。
# chkconfig --del o2cb
# chkconfig --add o2cb
# chkconfig --list o2cb
o2cb 0:off 1:off 2:on 3:on 4:on 5:on 6:off
# ll /etc/rc3.d/*o2cb*
lrwxrwxrwx 1 root root 14 Sep 29 11:56 /etc/rc3.d/S24o2cb -> ../init.d/o2cb
该服务应为默认运行级别中的 S24o2cb。
解决此错误后,您可以继续设置引导属性,如下所示:
# /etc/init.d/o2cb offline ocfs2
# /etc/init.d/o2cb unload
# /etc/init.d/o2cb configure
Configuring the O2CB driver.
这将配置 O2CB 驱动程序的引导属性。以下问题将决定在引导时是否加载驱动程序。当前值将在方括号(“[]”)中显示。按 <ENTER> 而不键入答案将保留该当前值。Ctrl-C 将终止。
Load O2CB driver on boot (y/n) [n]:y
Cluster to start on boot (Enter "none" to clear) [ocfs2]:ocfs2
Writing O2CB configuration:OK
Loading module "configfs":OK
Mounting configfs filesystem at /config:OK
Loading module "ocfs2_nodemanager":OK
Loading module "ocfs2_dlm":OK
Loading module "ocfs2_dlmfs":OK
Mounting ocfs2_dlmfs filesystem at /dlm:OK
Starting cluster ocfs2:OK
格式化 OCFS2 文件系统
您现在可以使用在在共享 FireWire 存储设备上创建分区一节中创建的分区。(至少可以使用第一个分区!)
如果 O2CB 集群处于脱机状态,则启动它。格式化操作要求集群处于联机状态,这是因为它需要确保在集群的某个节点上未挂载该卷。
在本文档的前面部分中,我们在为 OCFS/集群件创建挂载点一节中创建了目录 /u02/oradata/orcl。本节包含用于创建和安装集群管理器 使用的文件系统 (/u02/oradata/orcl) 的命令。
创建 OCFS2 文件系统
与本节中其他任务不同,只能在 RAC 集群中的一个节点上创建 OCFS2 文件系统。您将只从 linux1 执行本节中的所有命令。
注意,可以使用 GUI 工具 ocfs2console 或命令行工具 mkfs.ocfs2 创建和安装 OCFS2 文件系统。从 ocfs2console 实用程序中,使用菜单 [Tasks] - [Format]。
参见下面有关如何使用命令行工具 mkfs.ocfs2 创建 OCFS2 文件系统的说明。
要创建文件系统,使用 Oracle 可执行文件 mkfs.ocfs2。就本示例而言,我只从 linux1 以 root 用户帐户运行以下命令:
$ su -
# mkfs.ocfs2 -b 4K -C 32K -N 4 -L oradatafiles /dev/sda1
mkfs.ocfs2 1.0.2
Filesystem label=oradatafiles
Block size=4096 (bits=12)
Cluster size=32768 (bits=15)
Volume size=1011675136 (30873 clusters) (246984 blocks)
1 cluster groups (tail covers 30873 clusters, rest cover 30873 clusters)
Journal size=16777216
Initial number of node slots: 4
Creating bitmaps:done
Initializing superblock:done
Writing system files:done
Writing superblock:done
Writing lost+found:done
mkfs.ocfs2 successful
挂载 OCFS2 文件系统
现在已经创建了此文件系统,接下来我们便可以挂载它了。首先,使用命令行进行挂载,然后我将介绍如何将它包含在 /etc/fstab 中以在每次引导时挂载它。 您将需要以 root 用户帐户在 Oracle RAC 集群中的所有节点上挂载文件系统。
首先,此处介绍了如何从命令行手动挂载 OCFS2 文件。注意,需要以 root 用户帐户执行该操作:
$ su -
# mount -t ocfs2 -o datavolume /dev/sda1 /u02/oradata/orcl
如果挂载成功,您将只是获得提示。但您应运行以下检查来确保文件系统挂载正确。
首先,使用 mount 命令确保成功挂载了新文件系统。应在 RAC 集群的所有节点上执行该操作:
# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
cartman:SHARE2 on /cartman type nfs (rw,addr=192.168.1.120)
configfs on /config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sda1 on /u02/oradata/orcl type ocfs2 (rw,_netdev,datavolume)
注意:您将在此处使用
datavolume 选项挂载新文件系统。Oracle 数据库用户
必须使用
datavolume 挂载选项安装任何将包含表决磁盘文件、集群注册表 (OCR)、数据文件、重做日志、归档日志以及控制文件的卷,以确保 Oracle 进程打开包含
o_direct 标志的文件。
不应使用该挂载选项挂载任何其他类型的卷,其中包括 Oracle home(本指南未使用它)。
稍后(通常大约为五秒钟)将挂载该卷。它这样做是为了使心跳线程保持稳定。在未来的版本中,Oracle 计划增加对全局心跳(这将使大多数挂载瞬间完成)的支持。
将 OCFS 配置为在启动时自动挂载
让我们回顾一下到目前为止您已经执行的操作。您下载并安装了 OCFS2,它将用于存储集群管理器 文件所需的文件。安装后,您将 OCFS2 模块加载到内核中,然后对集群文件系统进行了格式化。最后,您挂载了新建的文件系统。本节将逐步完成在每次引导计算机时负责挂载新 OCFS2 文件系统的步骤。
首先将以下行添加到 RAC 集群所有节点上的 /etc/fstab 文件中:
/dev/sda1 /u02/oradata/orcl ocfs2 _netdev,datavolume 0 0
注意用于挂载此文件系统的
_netdev 选项。
_netdev 挂载选项是 OCFS2 卷所必需的;它指示将在网络启动后挂载该卷以及在关闭网络前卸载该卷。
现在,让我们确保已经加载了 ocfs2.ko 内核模块,并确保将在引导过程中安装文件系统。
如果您遵循了本指南中的示例,则应已经启用了用于加载内核模块并安装 OCFS2 文件系统的操作。但您将仍以 root 用户帐户在 RAC 集群的所有节点上运行以下命令来检查这些选项:
$ su -
# chkconfig --list o2cb
o2cb 0:off 1:off 2:on 3:on 4:on 5:on 6:off
应把我以
粗体标记的标志设置为“
on”。
检查新 OCFS2 文件系统的权限
使用 ls 命令检查所有权。应把权限设置为 0775,且将所有者设置为“oracle”、将组设置为“dba”。如果集群中的某些节点未设置为该值(我就未设置为该值),则很有可能是所有节点之间的“oracle”UID(在本示例中为 175)和/或“dba”GID(在本示例中为 115)不相同。
我们来先检查权限:
# ls -ld /u02/oradata/orcl
drwxr-xr-x 3 root root 4096 Sep 29 12:11 /u02/oradata/orcl
正如在以上列表中所看到的,
oracle 用户帐户(以及
dba 组)将无法写入此目录。我们来解决此问题:
# chown oracle.dba /u02/oradata/orcl
# chmod 775 /u02/oradata/orcl
我们回过头来再次检查集群中每个节点的权限是否正确:
# ls -ld /u02/oradata/orcl
drwxrwxr-x 3 oracle dba 4096 Sep 29 12:11 /u02/oradata/orcl
调整 O2CB 心跳阈值
该部分对于在 FireWire 驱动器上配置由 Oracle 集群件使用的两个共享文件非常重要。在测试过程中,我能够安装和配置 OCFS2、格式化新卷并最后安装位于新 OCFS2 卷上的 Oracle 集群件(及其所需的两个共享文件,即表决磁盘和 OCR 文件)。我能够安装 Oracle 集群件并可以看到共享驱动器,但在评估过程中,当集群件软件在两个节点上运行大约 15 分钟后,我收到了许多锁定和挂起。挂起的节点总是变化不定(在我的示例中为 linux1 或 linux2)。此外,无论是 I/O 负载较高还是根本没有,对该节点崩溃(挂起)都没有影响。
注意,您将创建的配置是一个非常低端的设置(配置了与 FireWire 驱动器有关的慢速磁盘访问)。这绝不是一个高端设置并易受虚假超时的影响。
查看 OCFS2 的跟踪文件后,对表决磁盘的访问显然太慢(超过了 O2CB 心跳阈值)并导致 Oracle 集群件软件(以及节点)崩溃。
我所使用的解决方案只是将 O2CB 心跳阈值从其默认设置 7 增大为 301(在某些情况下高达 900)。这是一个可配置参数,用于计算节点“隔离”自身所用的时间。
首先,我们了解一下如何确定 O2CB 心跳阈值的当前设置。为此,可以查询 /proc 文件系统,如下所示:
# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold
7
值为 7,但该值表示什么呢?其实,它用在以下公式中确定隔离时间(秒):
[隔离时间(秒)] = (O2CB_HEARTBEAT_THRESHOLD - 1) * 2
因此,如果 O2CB 心跳阈值为 7,则隔离时间将为:
(7 - 1) * 2 = 12 秒
如果您的 FireWire 磁盘较慢,则需要一个更大的阈值(准确来说是 600)。对于 600 秒,您将需要一个值为 301 的 O2CB_HEARTBEAT_THRESHOLD,如下所示:
(301 - 1) * 2 = 600 秒
现在我们了解一下如何将 O2CB 心跳阈值从 7 增大为 301。这需要在集群的两个节点上执行以下操作。首先需要修改文件 /etc/sysconfig/o2cb 并将 O2CB_HEARTBEAT_THRESHOLD 设置为 301:
# O2CB_ENABELED:'true' means to load the driver on boot.
O2CB_ENABLED=true
# O2CB_BOOTCLUSTER:If not empty, the name of a cluster to start.
O2CB_BOOTCLUSTER=ocfs2
# O2CB_HEARTBEAT_THRESHOLD:Iterations before a node is considered dead.
O2CB_HEARTBEAT_THRESHOLD=301
修改文件 /etc/sysconfig/o2cb 后,您需要更改 o2cb 配置。同样,应在集群的所有节点上执行以下操作。
# umount /u02/oradata/orcl/
# /etc/init.d/o2cb unload
# /etc/init.d/o2cb configure
Load O2CB driver on boot (y/n) [y]:y
Cluster to start on boot (Enter "none" to clear) [ocfs2]:ocfs2
Writing O2CB configuration:OK
Loading module "configfs":OK
Mounting configfs filesystem at /config:OK
Loading module "ocfs2_nodemanager":OK
Loading module "ocfs2_dlm":OK
Loading module "ocfs2_dlmfs":OK
Mounting ocfs2_dlmfs filesystem at /dlm:OK
Starting cluster ocfs2:OK
您现在可以再次检查以确保这些设置应用于 o2cb 集群堆栈:
# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold
301
重要注意事项: 用于 O2CB 心跳阈值的值 301 并不适用于本指南中列出的所有 FireWire 驱动器。使用以下图表确定应使用的 O2CB 心跳阈值。
|
FireWire 驱动器 |
O2CB 心跳阈值 |
| Maxtor OneTouch II 300GB USB 2.0 / IEEE 1394a 外置硬盘驱动器 - (E01G300) |
301 |
| Maxtor OneTouch II 250GB USB 2.0 / IEEE 1394a 外置硬盘驱动器 - (E01G250) |
301 |
| Maxtor OneTouch II 200GB USB 2.0 / IEEE 1394a 外置硬盘驱动器 - (E01A200) |
301 |
| 由 F.A. Porsche 设计的 250GB LaCie 硬盘驱动器(采用 FireWire 400 接口)- (300703U) |
600 |
| 由 F.A. Porsche 设计的 160GB LaCie 硬盘驱动器(采用 FireWire 400 接口)- (300702U) |
600 |
| 由 F.A. Porsche 设计的 80GB LaCie 硬盘驱动器(采用 FireWire 400 接口)- (300699U) |
600 |
| ADS Technologies 推出的 Dual Link 驱动器套件(内含 FireWire) - (DLX185) |
901 |
| Maxtor OneTouch 250GB USB 2.0 / IEEE 1394a 外置硬盘驱动器 - (A01A250) |
600 |
| Maxtor OneTouch 200GB USB 2.0 / IEEE 1394a 外置硬盘驱动器 - (A01A200) |
600 |
重新引导两个节点
开始介绍下一节之前,最好在此时重新引导 RAC 集群的所有节点。当计算机启动时,确保加载了集群堆栈服务并安装了新的 OCFS2 文件系统:
# mount
/dev/mapper/VolGroup00-LogVol00 on / type ext3 (rw)
none on /proc type proc (rw)
none on /sys type sysfs (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbfs on /proc/bus/usb type usbfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
cartman:SHARE2 on /cartman type nfs (rw,addr=192.168.1.120)
configfs on /config type configfs (rw)
ocfs2_dlmfs on /dlm type ocfs2_dlmfs (rw)
/dev/sda1 on /u02/oradata/orcl type ocfs2 (rw,_netdev,datavolume)
还应确认 O2CB 心跳阈值的设置是否正确(设置为我们的新值 301):
# cat /proc/fs/ocfs2_nodemanager/hb_dead_threshold
301
如何确定 OCFS2 版本
要确定正在运行的 OCFS2 版本,使用:
# cat /proc/fs/ocfs2/version
OCFS2 1.0.4 Fri Aug 26 12:31:58 PDT 2005 (build 0a22e88ab648dc8d2a1f9d7796ad101c)
17. 安装和配置自动存储管理 (ASMLib 2.0)
应在所有节点上执行大多数安装和配置过程。但创建 ASM 磁盘将只需在集群中的单个节点上执行。
在本节中,您将配置 ASM,以将其用作所有 Oracle 物理数据库文件(数据、联机重做日志、控制文件、归档重做日志)以及闪回恢复区的文件系统/卷管理器。
Oracle 数据库 10g 第 1 版中引入了 ASM 特性,用于使管理员不必再管理单个文件和驱动器。ASM 内置在 Oracle 内核中。通过它,DBA 可以全天候管理 Oracle 集群实例的单个实例以集群实例的数千个磁盘驱动器。将把所有要用于 Oracle 的文件和目录包含在磁盘组中。ASM 跨所有可用磁盘驱动器并行执行负载平衡,以防止热点并最大限度地提高性能(甚至对于快速更改数据使用模式也是如此)。
在该节中,我首先介绍 ASMLib 2.0 库及其用于 Linux 的关联驱动程序以及其他使用 Linux 配置 ASM 的方法。然后,我将介绍如何下载特定于您的 Linux 内核的 ASM 驱动程序(ASMLib 版本 2.0)。 最后,您将安装和配置 ASMLib 2.0 驱动程序,同时以一个如何创建 ASM 磁盘的演示结束本节。
如果要了解有关 ASMLib 的详细信息,请访问 www.oracle.com/technology/global/cn/tech/linux/asmlib/install.html。
使用 Linux 配置 ASM 的方法(仅供参考)
最初开始编写本指南时,我希望集中介绍如何将 ASM 用于所有数据库文件。我很想知道在负载平衡和容错方面,ASM 与此测试 RAC 配置的协同工作性能如何。
有两个不同方法可在 Linux 上配置 ASM:
- 使用 ASMLib I/O 的 ASM:此方法使用 ASMLib 调用在由 ASM 管理的原始块设备上创建所有 Oracle 数据库文件。由于 ASMLib 使用块设备,因此该方法不需要原始设备。
- 使用标准 Linux I/O 的 ASM:此方法使用标准 Linux I/O 系统调用在 ASM 管理的原始字符设备上创建所有 Oracle 数据库文件。您将需要为 ASM 使用的所有磁盘分区创建原始设备。
我们将在此处介绍“使用 ASMLib I/O 的 ASM”。
但在详细介绍 ASMLib 的安装和配置之前,我认为有必要简单介绍一下第二种方法“具有标准 Linux I/O 的 ASM”。如果要使用该方法(它是一个非常有效的解决方案,但并不是我将在此处实施的方法),则应注意在默认情况下 Linux 并不使用原始设备。必须使用原始驱动程序将要使用的每个 Linux 原始设备绑定到相应的块设备。例如,如果要使用我们已经创建的分区(/dev/sda2、/dev/sda3 和 /dev/sda4),则需要执行以下任务:
- 编辑文件 /etc/sysconfig/rawdevices,如下所示:
# raw device bindings
# format:<rawdev> <major> <minor>
# <rawdev> <blockdev>
# example:/dev/raw/raw1 /dev/sda1
# /dev/raw/raw2 8 5
/dev/raw/raw2 /dev/sda2
/dev/raw/raw3 /dev/sda3
/dev/raw/raw4 /dev/sda4
将在每次重新启动时创建原始设备绑定。
- 然后,需要将所有原始设备的所有权更改为“oracle”用户帐户:
# chown oracle:dba /dev/raw/raw2; chmod 660 /dev/raw/raw2
# chown oracle:dba /dev/raw/raw3; chmod 660 /dev/raw/raw3
# chown oracle:dba /dev/raw/raw4; chmod 660 /dev/raw/raw4
- 最后一步是重新启动服务器以绑定设备或只重新启动 rawdevices 服务:
# service rawdevices restart
正如我在上面所提到的,以上示例只是演示有多个方法可以在 Linux 上使用 ASM。现在,我们继续介绍要在本文中使用的方法“使用 ASMLib I/O 的 ASM”。
下载 ASMLib 2.0 程序包
首先下载 ASMLib 2.0 库(从 OTN 中下载)和驱动程序(从我的网站中下载)。与 OCFS 一样,您需要下载用于 Linux 内核的版本以及计算机上的处理器数。假设您在单处理器计算机上使用内核 2.6.9-11.0.0.10.3.EL #1:
# uname -a
Linux linux1 2.6.9-11.0.0.10.3.EL #1 Tue Jul 5 12:20:09 PDT 2005 i686 i686 i386 GNU/Linux
用于 Red Hat Enterprise Linux 4 AS 的 Oracle ASMLib 下载
安装 ASMLib 2.0 程序包
需要在所有节点上以 root 用户帐户执行此安装:
$ su -
# rpm -Uvh oracleasm-2.6.9-11.0.0.10.3.EL-2.0.0-1.i686.rpm \
oracleasmlib-2.0.0-1.i386.rpm \
oracleasm-support-2.0.0-1.i386.rpm
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.6.9-11.0.0.########################################### [ 67%]
3:oracleasmlib ########################################### [100%]
配置和加载 ASMLib 2.0 程序包
现在,您下载并安装了用于 Linux 的 ASMLib 程序包,接下来您需要配置并加载 ASM 内核模块。需要在所有节点上以 root 运行此任务:
$ su -
# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.
This will configure the on-boot properties of the Oracle ASM library
driver.The following questions will determine whether the driver is
loaded on boot and what permissions it will have.The current values
will be shown in brackets ('[]').Hitting <ENTER> without typing an
answer will keep that current value.Ctrl-C will abort.
Default user to own the driver interface []:oracle
Default group to own the driver interface []:dba
Start Oracle ASM library driver on boot (y/n) [n]:y
Fix permissions of Oracle ASM disks on boot (y/n) [y]:y
Writing Oracle ASM library driver configuration:[ OK ]
Creating /dev/oracleasm mount point:[ OK ]
Loading module "oracleasm":[ OK ]
Mounting ASMlib driver filesystem:[ OK ]
Scanning system for ASM disks:[ OK ]
为 Oracle 创建 ASM 磁盘
在第 10 节中,您创建了三个用于存储 Oracle 数据库文件(如联机重做日志、数据库文件、控制文件、归档重做日志文件)和闪回恢复区的 Linux 分区。
以下是为 ASM 创建的分区列表:
| 创建的 Oracle ASM 分区 |
| 文件系统类型 |
分区 |
大小 |
挂载点 |
文件类型 |
| ASM |
/dev/sda2 |
50GB |
ORCL:VOL1 |
Oracle 数据库文件 |
| ASM |
/dev/sda3 |
50GB |
ORCL:VOL2 |
Oracle 数据库文件 |
| ASM |
/dev/sda4 |
100GB |
ORCL:VOL3 |
快速恢复区 |
| 总计 |
|
200GB |
|
|
本节中的最后一个任务是创建 ASM 磁盘。创建 ASM 磁盘只需要在一个节点上以 root 用户帐户执行。我将在 linux1 上运行这些命令。在其他节点上,您将需要执行 scandisk 以识别新卷。该操作完成时,应在所有节点上运行 oracleasm listdisks 命令以验证是否创建了所有 ASM 磁盘以及它们是否可用。
$ su -
# /etc/init.d/oracleasm createdisk VOL1 /dev/sda2
Marking disk "/dev/sda2" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL2 /dev/sda3
Marking disk "/dev/sda3" as an ASM disk [ OK ]
# /etc/init.d/oracleasm createdisk VOL3 /dev/sda4
Marking disk "/dev/sda4" as an ASM disk [ OK ]
注意:如果使用相同硬件(实际上是相同的共享驱动器)重复本指南,则在尝试创建 ASM 磁盘时可能会出现故障。如果确实遇到故障,则尝试使用以下命令列出所有 ASM 磁盘:
# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
您可以看到,结果表明我定义了三个卷。如果上次运行定义了三个卷,则继续执行操作并使用以下命令删除它们,然后使用以上的 (oracleasm createdisk) 命令再次创建它们:
# /etc/init.d/oracleasm deletedisk VOL1
Removing ASM disk "VOL1" [ OK ]
# /etc/init.d/oracleasm deletedisk VOL2
Removing ASM disk "VOL2" [ OK ]
# /etc/init.d/oracleasm deletedisk VOL3
Removing ASM disk "VOL3" [ OK ]
在集群中的
所有其他节点上,必须执行磁盘扫描程序以识别新卷:
# /etc/init.d/oracleasm scandisks
Scanning system for ASM disks [ OK ]
我们现在可以使用以下命令在所有节点上以 root 用户帐户测试是否成功创建了 ASM 磁盘:
# /etc/init.d/oracleasm listdisks
VOL1
VOL2
VOL3
18. 下载 Oracle 10g RAC 软件
只需要在集群中的一个节点上执行以下下载过程!
下一个逻辑步骤是安装 Oracle 集群件第 2 版 (10.2.0.1.0)、Oracle 数据库 10g 第 2 版 (10.2.0.1.0) 以及最终用于 Linux x86 软件的 Oracle 数据库 10g 随附 CD 第 2 版 (10.2.0.1.0)。但您必须先从 OTN 下载并提取所需的 Oracle 软件程序包。
您将从 Oracle 下载所需的软件并将其提取到集群的一个 Linux 节点即 linux1 上。您将从此计算机执行所有安装。Oracle 安装将把所需的软件程序包复制到我们在第 13 节中设置的 RAC 配置中的所有其他节点上。
以 oracle 用户帐户登录 Linux RAC 集群的某个节点。在该示例中,您将把所需的 Oracle 软件下载到 linux1 并将其保存到 /u01/app/oracle/orainstall。
下载并提取软件
首先,下载 Oracle 集群件第 2 版 (10.2.0.1.0)、Oracle 数据库 10g 第 2 版 (10.2.0.1.0) 以及用于 Linux x86 的 Oracle 数据库 10g 随附 CD 第 2 版 (10.2.0.1.0) 软件。所有下载均在同一页面中提供。
以 oracle 用户帐户将下载的三个程序包提取到临时目录。在该示例中,我将使用 /u01/app/oracle/orainstall。
按如下所示提取 Oracle 集群件程序包:
# su - oracle
$ cd ~oracle/orainstall
$ unzip 10201_clusterware_linux32.zip
然后提取 Oracle 数据库软件:
$ cd ~oracle/orainstall
$ unzip 10201_database_linux32.zip
最后,提取 Oracle 随附 CD 软件:
$ cd ~oracle/orainstall
$ unzip 10201_companion_linux32.zip