|
第 1 页 第 2 页 第 3 页
在 Linux 和 FireWire 上构建您自己的 Oracle RAC 10g 集群(待续) 仅用于开发和测试
11. 配置 Linux 服务器
在集群中的所有节点上执行下列配置过程!
每次启动计算机时,都需要在集群中的每个节点上执行本节中的一些命令。本节详细介绍了如何设置共享内存、信号和文件句柄限制。第 14 节(“用于每个 RAC 节点的所有启动命令”)中包含有关如何将这些命令置于启动脚本 (/etc/rc.local) 中的说明。
概述
本节主要介绍了如何配置两个 Linux 服务器:使每个服务器为 Oracle RAC 10g 安装做好准备。这包括验证足够的交换空间、设置共享内存和信号,以及最后如何设置操作系统的最大文件句柄数。
在本节中,您将注意到有数种不同的方法可以配置(设置)这些参数。就本文而言,我将通过将所有命令置于 /etc/rc.local 文件中以使所有更改永久有效(通过重新启动)。我使用的方法将通过 echo 命令将值直接回显到 /proc 文件系统的相应路径中。
对交换空间的考虑因素
- 安装 Oracle10g 至少需要 512MB 内存。(注意:安装期间交换容量不足会导致 Oracle Universal Installer“挂起”或“死机”)
- 要检查您已经分配的内存/交换容量,可以键入:
# free
或
# cat /proc/swaps
或
# cat /proc/meminfo | grep MemTotal
- 如果您的内存少于 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 文件系统,你无需重新启动计算机便可以改变 SHMMAX 的缺省设置。可以使用以下方法动态设置 SHMMAX 的值。通过将此命令置于 /etc/rc.local 启动文件中可以使它永久有效:
# echo "2147483648" > /proc/sys/kernel/shmmax
- 您还可以使用 sysctl 命令来更改 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
设置 SHMALL
最后,我们来看 SHMALL 共享内存内核参数。该参数控制系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应至少为:
ceil(SHMMAX/PAGE_SIZE)
SHMALL 的默认大小为 2097152,并可以使用以下命令进行查询:
# cat /proc/sys/kernel/shmall
2097152
SHMALL 的默认设置足以满足 Oracle RAC 10g 安装的需要。
(注意: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 文件系统,不必重新启动机器而更改所有信号设置的缺省设置。该方法将以下内容置于 /etc/rc.local 启动文件中:
# echo "250 32000 100 128" > /proc/sys/kernel/sem
- 您还可以使用 sysctl 命令来更改所有信号设置的值:
# 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
32768
Oracle 建议将整个系统的文件句柄值至少设置为 65536。
- 通过直接更改 /proc 文件系统,您可以不必重新启动机器而改变文件句柄最大数量的默认设置。该方法将以下内容置于 /etc/rc.local 启动文件中:
# echo "65536" > /proc/sys/fs/file-max
- 您还可以使用 sysctl 命令来更改 SHMMAX 的值:
# sysctl -w fs.file-max=65536
- 最后,可以通过将内核参数插入到 /etc/sysctl.conf 启动文件中以使此更改永久有效:
# echo "fs.file-max=65536" >> /etc/sysctl.conf
可以通过使用以下命令查询文件句柄的当前使用情况:
# cat /proc/sys/fs/file-nr
613 95 32768
file-nr 文件显示了三个参数:分配的文件句柄总数、当前使用的文件句柄数以及可以分配的最大文件句柄数。
(注意:如果需要增大 /proc/sys/fs/file-max 中的值,请确保正确设置 ulimit。对于 2.4.20,通常将其设置为 unlimited。使用 ulimit 命令来验证 ulimit 设置:
# ulimit
unlimited
12. 配置 hangcheck-timer 内核模块
在集群中的所有节点上执行下列配置过程!
Oracle 9.0.1 和 9.2.0.1 使用一个名为 watchdogd 的用户空间监视后台程序来监视集群的状态情况,并在出现故障时重新启动 RAC 节点。从 Oracle 9.2.0.2 开始,此监视后台程序已被名为 hangcheck-timer 的模块所代替,该模块可以更好地解决可用性和可靠性问题。hang-check 计时器被加载到 Linux 内核中并检查系统是否挂起。它将设置一个计时器,并在特定的时间量之后检查该计时器。有一个用于检查挂起情况的可配置阈值,如果超过该阈值,计算机将重新启动。尽管 Oracle CRS 并不需要 hangcheck-timer 模块,但 Oracle 强烈建议使用它。
hangcheck-timer.o 模块
hangcheck-timer 模块使用了一个基于内核的计时器,该计时器周期性地检查系统任务调度程序,以捕获延迟,从而确定系统的运行状况。如果系统挂起或暂停,则计时器重置该节点。hangcheck-timer 模块使用时间戳计数器 (TSC) CPU 寄存器,该寄存器在每个时钟信号处递增。由于此寄存器由硬件自动更新,因此 TCS 提供了更精确的时间度量。
关于 hangcheck-timer 项目的更多信息可见于此处。
安装 hangcheck-timer.o 模块
hangcheck-timer 最初只由 Oracle 提供;但是,从内核版本 2.4.9-e.12 和更高版本开始,此模块现在包含在 Red Hat Linux 中。如果您按照第 8 节(“获取和安装何适的 Linux 内核”)中的步骤执行,则已经包含了 hangcheck-timer。使用以下命令确认:
# find /lib/modules -name "hangcheck-timer.o"
/lib/modules/2.4.21-15.ELorafw1/kernel/drivers/char/hangcheck-timer.o
/lib/modules/2.4.21-27.0.2.ELorafw1/kernel/drivers/char/hangcheck-timer.o
在以上输出中,我们关注的是 /lib/modules/2.4.21-27.0.2.ELorafw1/kernel/drivers/char 目录中的 hangcheck 计时器对象 (hangcheck-timer.o)。
配置并加载 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/modules.conf 文件中创建一个具有正确值的条目,如下所示:
# su -
# echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modules.conf
每次加载 hangcheck-timer 内核模块时,它将使用由我在 /etc/modules.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/modules.conf 文件中定义的正确参数,请使用 modprobe 命令。尽管可以通过向其传递相应的参数(如 insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180)来加载 hangcheck-timer 内核模块,但我们需要验证它是否选取了我们在 /etc/modules.conf 文件中设置的选项。
要手动加载 hangcheck-timer 内核模块并验证它是否使用在 /etc/modules.conf 文件中定义的正确值,请运行以下命令:
# su -
# modprobe hangcheck-timer
# grep Hangcheck /var/log/messages | tail -2
Jan 30 22:11:33 linux1 kernel:Hangcheck:starting hangcheck timer 0.8.0 (tick is 30 seconds, margin is 180 seconds).
Jan 30 22:11:33 linux1 kernel:Hangcheck:Using TSC.
我还想要验证是否加载了正确的 hangcheck-timer 内核模块。为进行确认,我通常删除内核模块(如果已经加载它),然后使用以下命令重新加载它:
# su -
# rmmod hangcheck-timer
# insmod hangcheck-timer
Using /lib/modules/2.4.21-27.0.2.ELorafw1/kernel/drivers/char/hangcheck-timer.o
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 在 10g 中增加了将安全 Shell (SSH) 工具套件用于设置用户等效项的支持。但本文使用较旧的方法 rcp 来将 Oracle 软件复制到集群中的其他节点。使用 SSH 工具套件时,可以使用 scp(与 rcp 相反)命令以非常安全的方式复制软件。
首先,请确保在 RAC 集群中的每个节点上安装了 rsh RPM:
# rpm -q rsh rsh-server
rsh-0.17-17
rsh-server-0.17-17
根据以上情况,我们可以了解到已经安装了 rsh 和 rsh-server。如果未安装 rsh,则可以从 RPM 所在的 CD 中运行以下命令:
# su -
# rpm -ivh rsh-0.17-17.i386.rpm rsh-server-0.17-17.i386.rpm
要启用“rsh”服务,必须将 /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
# cd /usr/kerberos/bin
# mv rsh rsh.original
# which rsh
/usr/bin/rsh
现在,应从将要执行 Oracle CRS 和 10g RAC 安装的节点测试连接并运行 rsh 命令。我们将使用节点 linux1 执行安装,因此请从该节点运行以下命令:
# su - oracle
$ rsh linux1 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Jan 31 00:39 /etc/hosts.equiv
$ rsh int-linux1 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Jan 31 00:39 /etc/hosts.equiv
$ rsh linux2 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Jan 31 00:25 /etc/hosts.equiv
$ rsh int-linux2 ls -l /etc/hosts.equiv
-rw------- 1 root root 68 Jan 31 00:25 /etc/hosts.equiv
14. 适用于每个 RAC 节点的所有启动命令
验证以下启动命令是否包含在集群中的所有节点上!
至此,我们已经详细介绍了需要在 Oracle RAC 10g 配置的所有节点上配置的参数和资源。在本节中,我们将稍事休息,简要复述这些必须包含在 RAC 集群中每个 Linux 节点的启动文件中的参数、命令和条目(在本文档的前几节中已出现)。
对于以下的每个启动文件,都应将呈现灰色的条目包含在每个启动文件中。
/etc/modules.conf
(所有要由内核模块使用的参数和值。)
alias eth0 tulip
alias eth1 b44
alias sound-slot-0 i810_audio
post-install sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -L >/dev/null 2>&1 || :
pre-remove sound-slot-0 /bin/aumix-minimal -f /etc/.aumixrc -S >/dev/null 2>&1 || :
alias usb-controller usb-uhci
alias usb-controller1 ehci-hcd
alias ieee1394-controller ohci1394
options sbp2 sbp2_exclusive_login=0
post-install sbp2 insmod sd_mod
post-install sbp2 insmod ohci1394
post-remove sbp2 rmmod sd_mod
options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
/etc/sysctl.conf
(我们希望调整互连的默认和最大发送缓冲区大小以及默认和最大的接收缓冲区大小。)
# 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
/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/grub.conf
(确定要在启动节点时使用的内核。)
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:You have a /boot partition.This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hda2
# initrd /initrd-version.img
#boot=/dev/hda
default=0
timeout=10
splashimage=(hd0,0)/grub/splash.xpm.gz
title White Box Enterprise Linux (2.4.21-27.0.2.ELorafw1)
root (hd0,0)
kernel /vmlinuz-2.4.21-27.0.2.ELorafw1 ro root=LABEL=/
initrd /initrd-2.4.21-27.0.2.ELorafw1.img
title White Box Enterprise Linux (2.4.21-15.EL)
root (hd0,0)
kernel /vmlinuz-2.4.21-15.EL ro root=LABEL=/
initrd /initrd-2.4.21-15.EL.img
/etc/rc.local
(这些命令负责配置由 Oracle 实例使用的共享内存、信号和文件句柄。)
#!/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
# +---------------------------------------------------------+
# | SHARED MEMORY |
# +---------------------------------------------------------+
echo "2147483648" > /proc/sys/kernel/shmmax
echo "4096" > /proc/sys/kernel/shmmni
# +---------------------------------------------------------+
# | SEMAPHORES |
# | ---------- |
# | |
# | SEMMSL_value SEMMNS_value SEMOPM_value SEMMNI_value |
# | |
# +---------------------------------------------------------+
echo "256 32000 100 128" > /proc/sys/kernel/sem
# +---------------------------------------------------------+
# | FILE HANDLES |
# ----------------------------------------------------------+
echo "65536" > /proc/sys/fs/file-max
# +---------------------------------------------------------+
# | HANGCHECK TIMER |
# | (I do not believe this is required, but doesn't hurt) |
# ----------------------------------------------------------+
/sbin/modprobe hangcheck-timer
15. 检查 Oracle 10g 的 RPM 程序包
在集群中的所有节点上执行以下检查!
安装 Linux O/S(RHEL 3 或 WBEL)时,应验证是否安装了所有必需的 RPM。如果您遵循我所提供的 Linux 安装指导,则已经安装了所有内容,这时您将拥有所有必需的 RPM 程序包。但如果您执行了其他安装类型(例如,高级服务器),则可能缺少某些程序包,并将需要安装它们。所有必需的 RPM 都位于 Linux CD/ISO 上。
检查必需的 RPM
必须安装以下程序包(或更高版本):
make-3.79.1
gcc-3.2.3-34
glibc-2.3.2-95.20
glibc-devel-2.3.2-95.20
glibc-headers-2.3.2-95.20
glibc-kernheaders-2.4-8.34
cpp-3.2.3-34
compat-db-4.0.14-5
compat-gcc-7.3-2.96.128
compat-gcc-c++-7.3-2.96.128
compat-libstdc++-7.3-2.96.128
compat-libstdc++-devel-7.3-2.96.128
openmotif-2.2.2-16
setarch-1.3-1
要查询程序包信息(例如,gcc 和 glibc-devel),请使用“rpm -q <程序包名> [, <程序包名>]”命令,如下所示:
# rpm -q gcc glibc-devel
gcc-3.2.3-34
glibc-devel-2.3.2-95.20
如果需要安装以上任意程序包,请使用“rpm -Uvh <程序包名.rpm>”。例如,要安装 GCC 3.2.3-24 程序包,请使用:
# rpm -Uvh gcc-3.2.3-24.i386.rpm
重新启动系统
此时,在准备安装任何 Oracle 组件之前,请重新启动集群中的所有节点!!!
# init 6
16. 安装和配置 OCFS
应在集群中的所有节点上执行本节中的大多数配置过程!但创建 OCFS 文件系统应只在集群中的一个节点上执行。
现在,需要安装 Oracle 集群文件系统 (OCFS)。OCFS 由 Oracle 开发,用于消除数据库管理员和系统管理员管理原始设备这一负担。它提供了与通常的文件系统相同的功能和用法。
本指南将使用 OCFS 版本 1 存储两个由 CRS 共享所需的文件。(它们将是唯一两个存储在 OCFS 上的文件。)此 OCFS 版本不支持使用文件系统进行共享的 Oracle Home 安装(Oracle 数据库软件)。此特性将在 OCFS 的未来版本(可能是版本 2)中提供。此处,我们将 Oracle 数据库软件安装到集群中每个 Oracle Linux 服务器本地上的单独 $ORACLE_HOME 目录中。
在版本 1 中,OCFS 只支持以下文件类型:
- Oracle 数据库文件
- 联机重做日志文件
- 归档重做日志文件
- 控制文件
- 服务器参数文件 (SPFILE)
- Oracle 集群注册表 (OCR) 文件
- CRS 表决磁盘。
不应在 OCFS 上使用用于操作文件和目录(移动、复制、压缩等)的 Linux 二进制命令。这些二进制命令是标准系统命令的一部分并与操作系统一起提供(例如,mv、cp、tar 等);在 OCFS 文件系统上使用时,它们将对性能产生重要影响。应改用这些命令的 Oracle 补丁版本。在使用也利用标准系统命令(例如,mv、tar 等)的第三方备份工具时,请注意这一点。
有关 RHEL 的 OCFS 版本 1(包括安装说明)的更多信息,请参阅本文档。
下载 OCFS
首先,从 Oracle Linux 项目开发组网站 (http://oss.oracle.com/projects/ocfs/files/RedHat/RHEL3/i386/) 下载 OCFS 文件(驱动程序、工具、支持)。该页面将包含多个适用于不同版本的 Linux 内核的 OCFS 文件版本。首先,下载适用于单处理器或多处理器 Linux 服务器的主要 OCFS 驱动程序:
ocfs-2.4.21-EL-1.0.14-1.i686.rpm -(适用于单处理器)
或
ocfs-2.4.21-EL-smp-1.0.14-1.i686.rpm -(适用于多处理器)
还将需要下载以下两个支持文件:
ocfs-support-1.0.10-1.i386.rpm -(1.0.10-1 支持程序包) ocfs-tools-1.0.10-1.i386.rpm -(1.0.10-1 工具程序包)
如果您不确定所需的 OCFS 驱动程序版本,请使用与您的内核版本匹配的 OCFS 版本。要确定您的内核版本,请执行以下命令:
$ uname -a
Linux linux1 2.4.21-27.0.1.ELorafw1 #1 Tue Dec 28 16:58:59 PST 2004 i686 i686 i386 GNU/Linux
如果字符串“ELorafw1”之后不存在字符串“smp”,则表示您正在单处理器计算机上运行。如果显示字符串“smp”,则表示您正在多处理器计算机上运行。
安装 OCFS
我们将把 OCFS 文件安装到两台单处理器计算机中。安装过程只需要您以 root 用户帐户的身份在集群中的所有节点上运行以下命令即可:
$ su -
# rpm -Uvh ocfs-2.4.21-EL-1.0.14-1.i686.rpm \
ocfs-support-1.0.10-1.i386.rpm \
ocfs-tools-1.0.10-1.i386.rpm
Preparing... ########################################### [100%]
1:ocfs-support ########################################### [ 33%]
2:ocfs-2.4.21-EL ########################################### [ 67%]
Linking OCFS module into the module path [ OK ]
3:ocfs-tools ########################################### [100%]
配置并加载 OCFS
下一步是生成并配置 /etc/ocfs.conf 文件。完成此操作的最简单方法是运行 GUI 工具 ocfstool,我们需要在集群中的所有节点上以 root 用户帐户的身份运行此工具:
$ su -
# ocfstool &
这将显示如下所示的 GUI:
 图 6. ocfstool GUI
使用 ocfstool GUI 工具执行以下步骤:
- 选择 [Task] - [Generate Config]
- 在“OCFS Generate Config”对话框中,输入专用互连的接口和 DNS 名。本示例将使用 eth1 和 int-linux1 表示节点 linux1,并使用 eth1 和 int-linux2 表示节点 linux2。
- 验证所有节点上的所有值正确之后,请退出应用程序。
以下对话框显示我用于节点 linux1 的设置:
 图 7. ocfstool 设置
退出 ocfstool 后,将获得一个类似如下所示的 /etc/ocfs.conf:
#
# ocfs config
# Ensure this file exists in /etc
#
node_name = int-linux1
ip_address = 192.168.2.100
ip_port = 7000
comm_voting = 1
guid = 8CA1B5076EAF47BE6AA0000D56FC39EC
注意 guid 值。这是一个组用户 ID,它对于集群中的所有节点必须唯一。还需要注意,/etc/ocfs.conf 可能是手动创建或只通过运行指定或更新文件中 GUID 值的 ocfs_uid_gen -c 命令创建的。
下一步是加载 ocfs.o 内核模块。与本节中的所有步骤一样,请以 root 用户帐户的身份在所有节点上运行以下命令:
$ su -
# /sbin/load_ocfs
/sbin/insmod ocfs node_name=int-linux1 ip_address=192.168.2.100 cs=1891
guid=8CA1B5076EAF47BE6AA0000D56FC39EC comm_voting=1 ip_port=7000
Using /lib/modules/2.4.21-EL-ABI/ocfs/ocfs.o
Warning:kernel-module version mismatch
/lib/modules/2.4.21-EL-ABI/ocfs/ocfs.o was compiled for kernel version 2.4.21-27.EL
while this kernel is version 2.4.21-27.0.2.ELorafw1
Warning:loading /lib/modules/2.4.21-EL-ABI/ocfs/ocfs.o will taint the kernel:forced load
See http://www.tux.org/lkml/#export-tainted for information about tainted modules
Module ocfs loaded, with warnings
可以放心地忽略以上两个警告!要验证是否已加载内核模块,请运行以下命令:
# /sbin/lsmod |grep ocfs
ocfs 299072 0 (unused)
(注意:在计算机启动回收之前,ocfs 模块将一直保持加载状态。稍后,我将介绍如何自动加载模块。)
尝试加载 ocfs 模块时可能发生许多类型的错误。我并未遇到其中的任何问题,因此将其包含在此处只是出于说明目的!
一个常见的错误如下所示:
# /sbin/load_ocfs
/sbin/insmod ocfs node_name=int-linux1 \
ip_address=192.168.2.100 \
cs=1891 \
guid=8CA1B5076EAF47BE6AA0000D56FC39EC \
comm_voting=1 ip_port=7000
Using /lib/modules/2.4.21-EL-ABI/ocfs/ocfs.o
/lib/modules/2.4.21-EL-ABI/ocfs/ocfs.o:kernel-module version mismatch
/lib/modules/2.4.21-EL-ABI/ocfs/ocfs.o was compiled for kernel version 2.4.21-4.EL
while this kernel is version 2.4.21-15.ELorafw1.
这通常意味着您使用了错误版本的 modutils RPM。获取最新版本的 modutils 并使用以下命令更新您的系统:
rpm -Uvh modutils-devel-2.4.25-12.EL.i386.rpm
使用 FireWire 时可能出现其他问题。如果您仍然无法加载以及验证是否加载了 ocfs 模块,请以“root”用户帐户的身份在所有存在此错误的节点上尝试执行以下命令:
$ su -
# /lib/modules/`uname -r`/kernel/drivers/addon/ocfs
# ln -s `rpm -qa | grep ocfs-2 | xargs rpm -ql | grep "/ocfs.o$"` \
/lib/modules/`uname -r`/kernel/drivers/addon/ocfs/ocfs.o
感谢 Werner Puschitz 提供以上解决方案!
创建 OCFS 文件系统
(注意:与本节中的其他任务不同,创建 OCFS 文件系统应只在一个节点上执行。我们将只从 linux1 执行本节中的所有命令。)
最后,我们可以开始使用我们在第 10 节(在共享 FireWire 存储设备上创建分区”)中创建的那些分区。至少可以使用第一个分区!
为创建文件系统,我们使用 Oracle 可执行文件 /sbin/mkfs.ocfs。就本示例而言,我只从 linux1 以 root 用户帐户的身份运行以下命令:
$ su -
# mkfs.ocfs -F -b 128 -L /u02/oradata/orcl -m /u02/oradata/orcl -u '175' -g '115' -p 0775 /dev/sda1
Cleared volume header sectors
Cleared node config sectors
Cleared publish sectors
Cleared vote sectors
Cleared bitmap sectors
Cleared data block
Wrote volume header
应注意以上命令中的以下参数:
- -u 参数是 oracle 用户的用户 ID。可以使用命令 id -u oracle 获取此 ID,并且它应在所有节点上都相同。
- -g 参数是 oracle:dba 用户:组的组 ID。可以使用命令 id -g oracle 获取此 ID,并且它应在所有节点上都相同。
- /dev/sda1 是用于此文件系统的设备名(或分区)。我们创建了 /dev/sda1 来存储集群管理器文件。
以下是 mkfs.ocfs 命令提供的选项列表:
usage:mkfs.ocfs -b block-size [-C] [-F]
[-g gid] [-h] -L volume-label
-m mount-path [-n] [-p permissions]
[-q] [-u uid] [-V] device
-b Block size in kilo bytes
-C Clear all data blocks
-F Force format existing OCFS volume
-g GID for the root directory
-h Help
-L Volume label
-m Path where this device will be mounted
-n Query only
-p Permissions for the root directory
-q Quiet execution
-u UID for the root directory
-V Print version and exit
一个有关创建 OCFS 文件系统的最终说明:可以使用 GUI 工具 ocfstool 执行与命令行 mkfs.ocfs 相同的任务。从 ocfstool 实用程序中,使用菜单 [Tasks] - [Format] 。
载入 OCFS 文件系统
现在已经创建了此文件系统,接下来我们便可以载入它了。首先我们使用命令行进行载入,然后我将介绍如何将它包含在 /etc/fstab 中以在每次启动时载入它。我们将需要以 root 用户帐户的身份在所有节点上载入此文件系统。
首先,我们在此处介绍如何从命令行手动载入 OCFS 文件系统。切记以 root 的身份执行此操作:
$ su -
# mount -t ocfs /dev/sda1 /u02/oradata/orcl
如果载入成功,您将只是获得提示。但我们应运行以下检查以确保此文件系统是使用适当权限正确地进行了载入。应在所有节点上运行这些手动检查。
首先,使用 mount 命令确保成功安装了新的文件系统。应在所有节点上执行此步骤:
# mount
/dev/hda2 on / type ext3 (rw)
none on /proc type proc (rw)
none on /dev/pts type devpts (rw,gid=5,mode=620)
usbdevfs on /proc/bus/usb type usbdevfs (rw)
/dev/hda1 on /boot type ext3 (rw)
none on /dev/shm type tmpfs (rw)
/dev/sda1 on /u02/oradata/orcl type ocfs (rw)
然后,使用 ls 命令检查所有权。应使用所有者 oracle 和组 dba 将权限设置为 0775。如果集群中的所有节点并非如此,则可能是所有节点的 oracle UID(本示例中为 175)和/或 dba GID(本示例中为 115)不一致。
# ls -ld /u02/oradata/orcl
drwxrwxr-x 1 oracle dba 131072 Feb 2 18:02 /u02/oradata/orcl
将 OCFS 配置为在启动时自动载入
让我们了解一下到目前为止我们已经执行的操作。我们下载并安装了将用于存储集群管理器文件所需文件的 OCFS。安装后,我们将 OCFS 模块加载到内核中,然后创建了集群文件系统。最后,我们载入了新建的文件系统。本节将逐步演示用于加载 OCFS 模块并确保在每次启动计算机时载入文件系统的步骤。
我们首先将以下行添加到所有节点上的 /etc/fstab 文件中:
/dev/sda1 /u02/oradata/orcl ocfs _netdev 0 0
(注意用于载入此文件系统的 _netdev 选项。此选项防止在启用所有网络服务之前载入 OCFS。)
现在,让我们确保已经加载了 ocfs.o 内核模块,并确保将在启动过程中载入文件系统。
如果您遵循了本指南中的示例,则应已经启用了用于加载内核模块并载入 OCFS 文件系统的操作。但我们仍应通过以 root 的身份在所有节点上运行以下命令来检查这些选项:
$ su -
# chkconfig --list ocfs
ocfs 0:off 1:off 2:on 3:on 4:on 5:on 6:off
我以粗体标记的标志应设置为 on。如果由于某些原因而将这些选项设置为 off,则可以使用以下命令启用它们:
$ su -
# chkconfig ocfs on
(注意,加载 ocfs.o 内核模块还将载入在 /etc/fstab 中配置的 OCFS 文件系统!)
开始介绍下一节之前,最好在此时重新启动集群中的所有节点。当计算机启动时,请确保加载了 ocfs.o 内核模块并确保载入了我们创建的文件系统。
17. 安装并配置自动存储管理和磁盘
应在所有节点上执行大多数安装和配置过程。但创建 ASM 磁盘将只需在集群中的单个节点上执行。
本节将配置自动存储管理 (ASM),以将其用作所有 Oracle 物理数据库文件(数据、联机重做日志、控制文件、归档重做日志)的文件系统/卷管理器。
Oracle 数据库 10g 中引入了 ASM,使管理员不必再管理单个文件和驱动器。ASM 被内置到 Oracle 内核中,通过它,数据库管理员可以全天候管理单个实例以及集群实例的上千个磁盘驱动器。所有要用于 Oracle 的文件和目录将包含在磁盘组中。ASM 跨所有可用磁盘驱动器并行执行负载平衡,以防热点并最大限度地提高性能(甚至对于快速更改数据使用模式也是如此)。
首先,我们将介绍针对 Linux 的 ASMLib 库和关联的驱动程序,以及用于通过 Linux 配置 ASM 的其他方法。然后,我将介绍如何下载特定于 Linux 内核的 ASM 驱动程序(ASMLib 版本 1.0)。最后,我们将安装并配置 ASM 驱动程序,并用一个有关如何创建 ASM 磁盘的演示来结束本节内容。
如果要了解有关 ASMLib 的详细信息,请访问 www.oracle.com/technology/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 程序包
与 OCFS 一样,我们需要下载 Linux 内核的版本以及计算机上的处理器数。我们使用的是内核 2.4.21,且我使用的计算机都是单处理器计算机:
# uname -a
Linux linux1 2.4.21-27.0.2.ELorafw1 #1 Tue Dec 28 16:58:59 PST 2004 i686 i686 i386 GNU/Linux
Oracle ASMLib 下载
安装 ASMLib 程序包
需要在所有节点上以 root 用户帐户的身份执行此安装:
$ su -
# rpm -Uvh oracleasm-2.4.21-EL-1.0.3-1.i686.rpm \
oracleasmlib-1.0.0-1.i386.rpm \
oracleasm-support-1.0.3-1.i386.rpm
Preparing... ########################################### [100%]
1:oracleasm-support ########################################### [ 33%]
2:oracleasm-2.4.21-EL ########################################### [ 67%]
Linking module oracleasm.o into the module path [ OK ]
3:oracleasmlib ########################################### [100%]
配置并加载 ASMLib 程序包
现在,我们已经下载并安装了用于 Linux 的 ASMLib 程序包,接下来我们需要配置并加载 ASM 内核模块。需要在所有节点上以 root 的身份运行此任务:
$ su -
# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.
这将配置 Oracle ASM 库驱动程序的启动时属性。以下问题将确定在启动时是否加载了驱动程序以及它将拥有的权限。当前值将在方括号(“[]”)中显示。按 <ENTER> 而不键入答案将保留该当前值。按 Ctrl-C 将终止。
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 磁盘
在第 8 节中,我们创建了三个用于存储 Oracle 数据库文件(如联机重做日志、数据库文件、控制文件、SPFILE 和归档重做日志文件)的 Linux 分区。
此处是已创建的分区列表:
|
创建的 Oracle ASM 分区
|
| 文件系统类型 |
分区 |
大小 |
载入点 |
文件类型 |
| ASM |
/dev/sda2 |
50GB |
ORCL:VOL1 |
Oracle 数据库文件 |
| ASM |
/dev/sda3 |
50GB |
ORCL:VOL2 |
Oracle 数据库文件 |
| ASM |
/dev/sda4 |
50GB |
ORCL:VOL3 |
Oracle 数据库文件 |
| 总计 |
|
150GB |
|
|
本节中的最后一个任务是创建 ASM 磁盘。创建 ASM 磁盘只需要在一个节点上以 root 用户帐户的身份执行。我将在 linux1 上运行这些命令。在其他节点上,您将需要执行磁盘扫描程序以识别新卷。该操作完成时,应在所有节点上运行 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 RAC 10g 软件
只需要在集群中的一个节点上执行以下下载过程!
下一个逻辑步骤是安装 Oracle CRS (10.1.0.3.0) 和 Oracle 数据库 10g (10.1.0.3.0) 软件。但我们必须先从 OTN 下载并提取所需的 Oracle 软件程序包。
我们将从 Oracle 下载所需的软件并提取到集群中的一个 Linux 节点,即 linux1。我们将从此计算机执行所有安装。Oracle 安装将所需的软件程序包复制到我们在第 13 节中设置的 RAC 配置中的所有其他节点。
以 oracle 用户帐户的身份登录到 Linux RAC 集群中的某个节点。在本示例中,我们将把所需的 Oracle 软件下载到 linux1 并将其保存到 /u01/app/oracle/orainstall/crs 和 /u01/app/oracle/orainstall/db。
下载并提取软件
首先,下载用于 Linux x86 的 Oracle 数据库 10g(10.1.0.3 或更高版本)和 Oracle CRS(10.1.0.3 或更高版本)软件。这两个下载在同一页面中提供。
以 oracle 用户帐户的身份将下载的两个程序包提取到临时目录。本示例将使用 /u01/app/oracle/orainstall/crs 和 /u01/app/oracle/orainstall/db。
按如下所示提取 CRS 程序包:
# su - oracle
$ cd ~oracle/orainstall/crs
$ gunzip ship.crs.lnx32.cpio.gz
$ cpio -idmv < ship.crs.lnx32.cpio
然后提取 Oracle 数据库软件:
$ cd ~oracle/orainstall/db
$ gunzip ship.db.lnx32.cpio.gz
$ cpio -idmv < ship.db.lnx32.cpio
第 1 页 第 2 页 第 3 页
|