创建来自 RAW 卷的符号链接(在两个节点上执行)
注意: 在每次启动机器时 , 需要在集群中的每个节点上执行本部分中的一些命令。这些命令的详细信息以及关于将其加入启动脚本的说明都包含在 用于每个 RAC 节点的所有启动命令 。
我通常将来自 RAW 卷的符号链接创建为人们易于理解的名称,以便更易于识别文件。如果您决定不使用符号链接,则在创建 / 维护表空间时,您需要为您所定义的 Oracle 文件使用 /dev/pv1/lvol X 标识。对于某些人来说,处理含义隐晦的标识(如 /dev/pv1/lvol21 )实在过于麻烦了 — ,而 使用人们易于理解的名称则要简单得多。这些命令需要在每台 Linux 服务器上执行一次。我通常将它们包含在 /etc/rc.local 启动脚本中。如果您添加了表空间,则应该将新的逻辑卷、 RAW 绑定及链接名称添加到所有节点的多个文件中。
mkdir /u01/app/oracle/oradata
mkdir /u01/app/oracle/oradata/orcl
ln -s /dev/raw/raw1 /u01/app/oracle/oradata/orcl/CMQuorumFile
ln -s /dev/raw/raw2 /u01/app/oracle/oradata/orcl/SharedSrvctlConfigFile
ln -s /dev/raw/raw3 /u01/app/oracle/oradata/orcl/spfileorcl.ora
ln -s /dev/raw/raw4 /u01/app/oracle/oradata/orcl/control01.ctl
ln -s /dev/raw/raw5 /u01/app/oracle/oradata/orcl/control02.ctl
ln -s /dev/raw/raw6 /u01/app/oracle/oradata/orcl/control03.ctl
ln -s /dev/raw/raw7 /u01/app/oracle/oradata/orcl/cwmlite01.dbf
ln -s /dev/raw/raw8 /u01/app/oracle/oradata/orcl/drsys01.dbf
ln -s /dev/raw/raw9 /u01/app/oracle/oradata/orcl/example01.dbf
ln -s /dev/raw/raw10 /u01/app/oracle/oradata/orcl/indx01.dbf
ln -s /dev/raw/raw11 /u01/app/oracle/oradata/orcl/odm01.dbf
ln -s /dev/raw/raw12 /u01/app/oracle/oradata/orcl/system01.dbf
ln -s /dev/raw/raw13 /u01/app/oracle/oradata/orcl/temp01.dbf
ln -s /dev/raw/raw14 /u01/app/oracle/oradata/orcl/tools01.dbf
ln -s /dev/raw/raw15 /u01/app/oracle/oradata/orcl/undotbs01.dbf
ln -s /dev/raw/raw16 /u01/app/oracle/oradata/orcl/undotbs02.dbf
ln -s /dev/raw/raw17 /u01/app/oracle/oradata/orcl/users01.dbf
ln -s /dev/raw/raw18 /u01/app/oracle/oradata/orcl/xdb01.dbf
ln -s /dev/raw/raw19 /u01/app/oracle/oradata/orcl/perfstat01.dbf
ln -s /dev/raw/raw20 /u01/app/oracle/oradata/orcl/redo01.log
ln -s /dev/raw/raw21 /u01/app/oracle/oradata/orcl/redo02.log
ln -s /dev/raw/raw22 /u01/app/oracle/oradata/orcl/redo03.log
ln -s /dev/raw/raw23 /u01/app/oracle/oradata/orcl/orcl_redo2_2.log
chown -R oracle:dba /u01/app/oracle/oradata
配置 Linux 服务器(在两个节点上执行)
注意: 在每次启动机器时 , 需要在集群中的每个节点上执行本部分中的一些命令。这些命令的详细信息以及关于将其加入启动脚本的说明都包含在 用于每个 RAC 节点的所有启动命令 。
本文的这一部分集中讨论了对两台 Linux 服务器的配置 — 使每台服务器都为 Oracle9 i RAC 的安装作好准备。
对交换空间的考虑因素
- 安装 Oracle9 i 需要最少 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 的默认设置。我使用的方法是将以下命令放入 /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.con
设置 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 的默认设置对于我们的 Oracle9 i RAC 安装来说应该足够使用。
注意: 在 i386 平台上 Red Hat Linux 的 页面大小 为 4096 字节。但是,您可以使用 bigpages ,它支持配置更大的内存页面尺寸。
设置信号
既然我们已经配置了共享内存设置,现在就该考虑配置我们的 信号 了。对信号的最佳描述是,它是用于在共享资源(如共享内存)的进程(或进程中的线程)之间提供同步的计数器。在系统 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
配置 hangcheck-timer 内核模块
Oracle 9.0.1 和 9.2.0.1 使用一个称为 watchdogd 的用户空间监视后台程序来监视集群的状态情况,并在发生故障时重新启动 RAC 模式。但是,从 Oracle 9.2.0.2 开始,一个称为 hangcheck-timer 的 Linux 模块取代了此后台程序,该模块更好地解决了可用性和可靠性的问题。 hangcheck-timer 被加载到内核中并检查系统是否挂起。它将设置一个定时器,并在特定的时间量之后检查该定时器。有一个用于检查挂起情况的可配置阈值,如果超过该值机器将重新启动。虽然 Oracle Cluster Manager 的操作不需要 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 AS 包含在一起。如果您按照 “ 获取和安装合适的 Linux 内核 ” 中的步骤执行,则已经包含了 hangcheck-timer 。使用以下命令来确认您已经包含了该模块:
# find /lib/modules -name "hangcheck-timer.o"
/lib/modules/ 2.4.21 -9.0.1.ELorafw1/kernel/drivers/char/hangcheck-timer.o
配置和加载 hangcheck-timer 模块
对于 hangcheck-timer 模块有两个关键的参数。
- hangcheck-tick :此参数定义了检查系统健康情况的间隔时段。其默认值为 60 秒。 Oracle 建议将其设置为 30 秒。
- hangcheck-margin :此参数定义了 hangcheck-timer 在重启 RAC 节点前所容许的最大挂起延迟。它定义了以秒为单位的错误余量。其默认值为 180 秒。 Oracle 建议将其设置为 180 秒。
这两个参数需要与 Cluster Manager 的 $ORACLE_HOME/oracm/admin/cmcfg.ora 文件中的 MissCount 参数协同使用。
注意: 这两个 hangcheck-timer 模块参数说明在该模块重启系统前 RAC 节点必须挂起多长时间。当以下条件为真时将会重启节点:
系统挂起时间 > (hangcheck_tick + hangcheck_margin)
现在让我们来讨论如何加载该模块。您可以通过使用以下命令,利用正确的参数设置来手动地加载该模块:
# su -
# /sbin/insmod hangcheck-timer hangcheck_tick=30 hangcheck_margin=180
# grep Hangcheck /var/log/messages*
/var/log/messages.1:Apr 30 20:51:47 linux2 kernel:Hangcheck:
starting hangcheck timer 0.8.0 (tick is 30 seconds, margin is 180 seconds).
/var/log/messages.1:Apr 30 20:51:47 linux2 kernel:Hangcheck:Using TSC.
将以上的 “ insmod ” 命令放在您的 /etc/rc.local 文件中!
虽然手动加载模块的方法(如上所示)可以有效工作,但我们需要一种在每次重新启动节点时利用正确参数来加载该模块的方法。我们通过在 /etc/modules.conf 文件中创建项目来完成此任务。将以下的行添加到 /etc/modules.conf 文件中:
# su -
# echo "options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180" >> /etc/modules.conf
现在,为测试模块,可使用 modprobe 命令。您可以运行 modprobe 命令,利用在 /etc/modules.conf 文件中定义的、经过配置的参数来手动加载 hangcheck-timer 模块:
# su -
# modprobe hangcheck-timer
# grep Hangcheck /var/log/messages*
/var/log/messages.1:Apr 30 20:51:47 linux2 kernel:
Hangcheck:starting hangcheck timer 0.8.0 (tick is 30 seconds, margin is 180 seconds).
/var/log/messages.1:Apr 30 20:51:47 linux2 kernel:
Hangcheck:Using TSC.
注意: 您不必在每次重新启动后都运行 modprobe 。 hangcheck-timer 模块将会在需要时由内核加载(自动进行)。