ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群(7)

在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群(7)

原创 Linux操作系统 作者:jinqibingl 时间:2012-10-04 23:00:04 0 删除 编辑

在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群(7)  

在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群(7)
(2007-10-16 17:29:33)
在 Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群(7) - 轩辕剑 - 摸索着前进总比原地踏步好转载
var $tag=''; var $tag_code='7b39277fe8bb853cbfdb49ef93ce2ac9'; var $r_quote_bligid='4cbd76e501000b38'; var $worldcup='0'; var $worldcupball='0'; 分类: oracle_rac


 11. 创建“oracle”用户和目录

在集群中的两个 Oracle RAC 节点上执行以下任务!

您将使用 OCFS2 存储 Oracle 集群件软件需要共享的文件。在使用 OCFS2 时,集群中的两个 Oracle RAC 节点上的 UNIX 用户 oracle 的 UID 和 UNIX 组 dba 的 GID 必须相同。如果 UID 或 GID 不同,则 OCFS2 文件系统中的文件将显示为“unowned”,甚至可能由其他用户所拥有。对于本文而言,oracle UID 使用 175,dba GID 使用 115。

创建 Oracle 的组和用户

让我们继续此示例,创建 Unix dba 组和 oracle 用户帐户以及所有相关目录。

# mkdir -p /u01/app
# groupadd -g 115 dba
# groupadd -g 116 oinstall
# useradd -u 175 -g 115 -d /u01/app/oracle -s /bin/bash -c "Oracle Software Owner" -p oracle oracle
# chown -R oracle:dba /u01
# passwd oracle
# su - oracle

注:当您为每个 Oracle RAC 节点设置 Oracle 环境变量时,请确保为每个 RAC 节点分配唯一的 Oracle SID!对于此示例,我使用:


linux1 :ORACLE_SID=orcl1
linux2 :ORACLE_SID=orcl2

为 oracle 用户帐户创建登录脚本

在两个节点上都创建了“oracle”UNIX 用户 id 后,通过使用以下 .bash_profile 确保正确设置了环境:
.................................... # .bash_profile # Get the aliases and functions if [ -f ~/.bashrc ]; then . ~/.bashrc fi alias ls="ls -FA" # User specific environment and startup programs export ORACLE_BASE=/u01/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1 export ORA_CRS_HOME=$ORACLE_BASE/product/crs export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin export JAVA_HOME=/usr/local/java # Each RAC node must have a unique ORACLE_SID.(i.e. orcl1, orcl2,...) export ORACLE_SID=orcl1 export PATH=.:$JAVA_HOME/bin:${PATH}:$HOME/bin:$ORACLE_HOME/bin export PATH=${PATH}:/usr/bin:/bin:/usr/bin/X11:/usr/local/bin export PATH=${PATH}:$ORACLE_BASE/common/oracle/bin export ORACLE_TERM=xterm export TNS_ADMIN=$ORACLE_HOME/network/admin export ORA_NLS10=$ORACLE_HOME/nls/data export LD_LIBRARY_PATH=$ORACLE_HOME/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:$ORACLE_HOME/oracm/lib export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/lib:/usr/lib:/usr/local/lib export CLASSPATH=$ORACLE_HOME/JRE export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/rdbms/jlib export CLASSPATH=${CLASSPATH}:$ORACLE_HOME/network/jlib export THREADS_FLAG=native export TEMP=/tmp export TMPDIR=/tmp ....................................

为 OCFS2/集群件创建挂载点

最后,为将用于存储两个 Oracle 集群件共享文件的 OCFS2 文件系统创建挂载点。需要以“root”用户帐户运行这些命令:

$ su -
# mkdir -p /u02/oradata/orcl
# chown -R oracle:dba /u02

 


12. 为 Oracle 配置 Linux 服务器

在集群中的两个 Oracle RAC 节点上执行以下配置过程!

每次引导算机时,都需要在集群中的两个 Oracle RAC 节点上定义本节讨论的内核参数。本节提供了设置 Oracle 必需的那些内核参数的详细信息。第 15 节(“用于所有 Oracle RAC 节点的所有启动命令”)中包含有关如何将这些命令置于启动脚本 (/etc/sysctl.conf) 中的说明。

概述

本节集中讨论了针对 Oracle10g RAC 安装配置两台 Oracle RAC Linux 服务器的步骤。这包括验证足够的交换空间、设置共享内存和信号、设置文件句柄的最大数量、设置 IP 本地端口范围、设置对 oracle 用户的 shell 限制、激活系统的所有内核参数,以及如何验证两个集群节点的日期和时间是否正确。

在本节中,您将注意到可以使用多种方法来配置(设置)这些参数。就本文而言,我将通过把所有命令置于 /etc/sysctl.conf 文件中使所有更改永久有效(通过重新引导)。

对交换空间的考虑因素


安装 Oracle10g 第 2 版至少需要 512MB 内存。(注:安装期间交换容量不足会导致 Oracle Universal Installer“挂起”或“死机”)
要检查您已经具有的内存容量,键入:
# cat /proc/meminfo | grep MemTotal
MemTotal:1033116 kB

要检查您已经分配的交换容量,键入:
# cat /proc/meminfo | grep SwapTotal
SwapTotal:2031608 kB

如果您的内存少于 512MB(介于 RAM 与 SWAP 之间),您可以通过创建临时交换文件添加临时交换空间。这样,您就不必使用原始设备甚至更彻底地重建系统了。

以 root 身份创建一个用作额外交换空间的文件,假设大小为 300MB:
# dd if=/dev/zero f=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 -or- (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

设置 IP 本地端口范围

配置系统,使本地端口范围为 1024 至 65000。

使用以下命令确定 ip_local_port_range 的值:

# cat /proc/sys/net/ipv4/ip_local_port_range
32768 61000
ip_local_port_range 的默认值是从 32768 到 61000 的端口。Oracle 建议的本地端口范围是 1024 到 65000。
可以通过使用以下命令直接修改 /proc 文件系统 (/proc/sys/net/ipv4/ip_local_port_range),以更改本地端口范围的默认设置,而不必重新引导计算机:
# sysctl -w net.ipv4.ip_local_port_range="1024 65000" 

然后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
# echo "net.ipv4.ip_local_port_range = 1024 65000" >> /etc/sysctl.conf 

为 Oracle 用户设置 Shell 限制

要改善 Linux 系统上的软件性能,Oracle 建议您提高 oracle 用户的 shell 限制:

Shell 限制

limits.conf 中的条目

硬限制

最大打开文件描述符数

nofile

65536

可用于单个用户的最大进程数

nproc

16384
要进行这些更改,以 root 用户身份运行以下命令:
cat >> /etc/security/limits.conf <oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF
cat >> /etc/pam.d/login <session required /lib/security/pam_limits.so
EOF
为“oracle”UNIX 帐户更新默认的 shell 启动文件。
对于 Bourne、Bash 或 Korn shell,通过运行以下命令将以下行添加到 /etc/profile 文件:
cat >> /etc/profile <if [ \$USER = "oracle" ]; then 
if [ \$SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
EOF

对于 C shell(csh 或 tcsh),通过运行以下命令将以下行添加到 /etc/csh.login 文件:
cat >> /etc/csh.login <if ( \$USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
endif
EOF

激活系统的所有内核参数

此时,我们已经包含了成功进行 Oracle 安装和配置所需的所有 Linux 内核参数。在以上每一部分中,我们对 Linux 系统进行了配置,将所有内核参数置于 /etc/sysctl.conf 文件中以将其保存在系统启动上。现在,我们可以重新启动以确保所有这些参数在内核中进行设置,或者,我们只需通过以 root 用户身份运行以下命令来“运行”/etc/sysctl.conf 文件。请在集群的每一个节点上执行该操作!
# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_max = 262144
kernel.shmmax = 2147483648
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000

在所有的集群节点上设置正确的日期和时间

在安装 Oracle 集群件、数据库以及随附 CD 期间,Oracle Universal Installer (OUI) 将首先安装运行该安装程序的本地节点(即 linux1)的软件。然后,将该软件以远程方式复制到集群中的其余节点(即 linux2)。在远程复制过程中,OUI 将在每个远程节点上执行 UNIX“tar”命令,以提取进行了存档和复制的文件。如果执行安装的节点上的日期和时间大于其要进行复制的节点上的日期和时间,那么 OUI 将在“tar”中引发一个错误,以指示其在试图提取带有时间戳的文件时失败。
Error while copying directory /u01/app/oracle/product/crs with exclude file list 'null' to nodes 'linux2'. [PRKC-1002 :All the submitted commands did not execute successfully] --------------------------------------------- linux2: /bin/tar:./bin/lsnodes:time stamp 2006-09-13 09:21:34 is 735 s in the future /bin/tar:./bin/olsnodes:time stamp 2006-09-13 09:21:34 is 735 s in the future ...(more errors on this node)

请注意,尽管这看起来像 OUI 中一个严重的错误,但您完全可以将其看作是一个警告而忽略。“tar”命令 DOES 确实提取了文件;然而,当您在远程节点上执行文件列表时(使用 ls -l),它们将缺少时间字段,直到服务器上的时间大于该文件的时间戳。在启动以上任何一个所述安装之前,确保尽可能将集群的每个成员节点设置为相同的时间和日期。由于两个 Oracle RAC 节点使用相同的参考 Network Time Protocol 服务器,因此 Oracle 强烈建议使用多数操作系统的 Network Time Protocol 功能来执行该操作。 然而,访问 Network Time Protocol 服务器并非始终可用。在这种情况下,为集群中的节点手动设置日期和时间,确保要从其中执行软件安装的节点 (linux1) 的时间和日期小于集群中所有其他节点 (linux2)。我一般使二者之间相差 20 秒,如以下示例所示: 设置 linux1 的日期和时间:
# date -s "6/25/2007 23:00:00" 
设置 linux2 的日期和时间:
# date -s "6/25/2007 23:00:20" 
本文中所述的双节点 RAC 配置没有使用 Network Time Protocol 服务器。

 


13. 配置 hangcheck-timer 内核模块

在集群中的两个 Oracle RAC 节点上执行以下配置过程!

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 AS 包含在一起。hangcheck-timer 应当已包含在内。使用以下命令来确认您已经包含了该模块:

# find /lib/modules -name "hangcheck-timer.ko" /lib/modules/2.6.9-55.0.0.0.2.ELhugemem/kernel/drivers/char/hangcheck-timer.ko /lib/modules/2.6.9-55.0.0.0.2.ELsmp/kernel/drivers/char/hangcheck-timer.ko /lib/modules/2.6.9-55.0.0.0.2.EL/kernel/drivers/char/hangcheck-timer.ko
在以上输出中,我们关注的是 /lib/modules/2.6.9-55.0.0.0.2.ELhugemem/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 节点必须挂起的时长。当以下条件为真时将会重置节点:
system hang time > (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 Jun 25 18:18:31 linux1 kernel:Hangcheck:starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds). Jun 25 18:18:31 linux1 kernel:Hangcheck:Using monotonic_clock(). 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9606200/viewspace-745642/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-08-19

  • 博文量
    154
  • 访问量
    325255