作者:empty 出版社:empty |
Dayang SI Lab Releae
Oracle Real Application Cluster
安装部署手册
Dayang Technology Development Inc
北京中科大洋科技发展有限公司
Oracle Real Application Cluster 安装部署手册
目录
摘要
随着IT技术不断发展,广电行业借助于IT的新技术和新特性,越来越强调生产系统的自动化、网络化、网格化。这就决定了数据库成为了一个广电机构的业务核心,数据库的性能、安全性和可维护性直接影响一个生产系统的日常工作。目前大量应用的数据库系统无非以下几个品牌:SQL SERVER、DB2、MySQL、Sybase、Oracle。而由于Oracle耦合结构松散,性能稳定,服务全面,所以广电行业普遍使用的是Oracle品牌的数据库,而作为Oracle在广电行业的一种典型应用,Real Application Cluster(以下简称RAC)以其卓越的网格计算性能,Active-Active的高可用性,复杂精密的Load Balance技术,为业务需求提供了强有力的技术保障。
本文介绍的RAC安装部署,并未完全指定系统环境,力求作为一种通用的安装手段,文中的斜体加粗字内容为屏幕的输入内容,斜体普通字为屏幕显示的返回信息内容,红色加粗字内容为容易导致安装失败而要求读者特别注意的内容。
1.总述
随 Oracle9i 一同推出的 Oracle RAC 是 Oracle 并行服务器 (OPS) 的后续版本。Oracle RAC 允许多个实例同时访问同一数据库(存储)。RAC 通过允许系统进行扩展,提供了容错、负载均衡和性能效益,同时,由于所有节点访问同一数据库,一个实例的故障不会导致无法访问数据库。
Oracle10g RAC 的核心是共享磁盘子系统。集群中的所有节点必须能够访问集群中所有节点的所有数据、重做日志文件、控制文件和参数文件。为了使所有节点都能够访问数据库,数据磁盘必须全局可用。每个节点都拥有自己的重做日志文件和 UNDO 表空间,但其他节点必须能够访问它们(和共享控制文件),以便在系统出现故障时恢复该节点。
Oracle RAC 与 OPS 之间的最大区别在于增加了缓存融合。使用 OPS 时,从一个节点到另一个节点的数据请求需要首先将数据写到磁盘,然后请求节点才能读取该数据。而使用缓存融合,数据沿着使用复杂锁定算法的高速互连链路传递。
不是所有的集群解决方案都使用共享存储。某些供应商使用一种称为联合集群 的方法,在这种方法中,数据分布在多台计算机中,而不是由所有计算机共享。但是,在使用 Oracle10g RAC 时,多个节点将使用一组磁盘来存储数据。利用 Oracle10g RAC,数据文件、重做日志文件、控制文件和归档日志文件都保存在原始磁盘设备的共享存储、NAS、ASM 或集群文件系统中。Oracle 的集群方法利用了集群中所有节点的集体处理能力,同时提供了故障切换安全性。Dell、IBM 和 HP 等厂商提供了预先配置的面向生产环境的 Oracle10g RAC 解决方案。
2.系统结构
2.1硬件及成本
Oracle RAC 节点 1 — (RAC1)
Dell PowerEdge 2950服务器
• 4*Intel(R) Xeon(R) CPU E5430@2.60GHz
• 8GB DDR SDRAM (333MHz)
• 300GB 7200 RPM 内置硬盘驱动器
• 集成的 Intel 3D AGP 图形卡
• 集成的 10/100 以太网卡 — (Broadcom BCM5708)
• DVDROM(16X 倍速)
• DELL键盘、显示器或鼠标 12000RMB
Oracle RAC 节点 2 — (RAC2)
Dell PowerEdge 2950服务器
• 4*Intel(R) Xeon(R) CPU E5430@2.60GHz
• 8GB DDR SDRAM (333MHz)
• 300GB 7200 RPM 内置硬盘驱动器
• 集成的 Intel 3D AGP 图形卡
• 集成的 10/100 以太网卡 — (Broadcom BCM5708)
• DVDROM(16X 倍速)
• DELL键盘、显示器或鼠标12000RMB
DAS存储阵列
Dell PowerVaultTM MD3000 SAS 存储阵列
MD3000模块化磁盘存储阵列可支持2个节点的集群,其3U架装式机箱最多可安装15块3.5英寸硬盘,可扩展到45个3.5英寸SAS硬盘,在增加2个MD1000的配置下。 使用一个Modular Disk Storage Manager (模块化磁盘存储管理软件),管理整个阵列子系统。 30000RMB
合计 54000RMB
2.2软件及成本
Oracle RAC 节点 1 — (RAC1)
RedHat 4 U6 Linux Enterprise Edition
Oracle RAC Software71250RMB
Oracle RAC 节点 2 — (RAC2)
RedHat 4 U6 Linux Enterprise Edition
Oracle RAC Software71250RMB
合计 196500RMB
2.3系统拓扑
2.4系统总价
根据上述软硬件系统可以得出系统总价为:
系统总价=软件系统总价+硬件系统总价
即:系统总价=984000
3.安装步骤
4.开始安装
4.1安装操作系统
此步骤需要在两节点进行
安装linux过程中需要注意以下几点:
选择全新安装;
手动对sda设备分区:
分区名称分区容量(MB)
/boot2048
Swap32768
/usr20480
/var16384
/home16384
/tmp8192
/2048
/opt磁盘的剩余容量
取消DHCP网络设置
禁用防火墙
禁用SELinux
完全安装所有包,
安装SAS驱动
安装DELL存储管理软件
其中需要注意的是:对于系统的磁盘分区,Swap区尽量分的大一些,一般为物理内存的整数倍。/opt目录是Oracle软件的安装目录,也要保证足够的容量。
4.2 对磁盘阵列进行分区
通过Dell存储的管理软件,我们对共享存储阵列进行分区,并将分区映射到端口。此步骤仅需在一个节点进行即可,我在RAC1节点上进行如下操作。本次安装,我的分区如下:
524M crs
629M
322.1G oradata_dg
408.1G recover_dg
分区结束后,需要保证两节点均可以识别到设备,此工作在两节点进行。打开操作系统的终端:
[root@rac2 ~]# fdisk –l
Disk /dev/sda: 524 MB, 524288000 bytes
17 heads, 59 sectors/track, 1020 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes
Device Boot Start End Blocks Id System
/dev/sda1 1 1020 511500+ 83 Linux
Disk /dev/sdb: 629 MB, 629145600 bytes
20 heads, 60 sectors/track, 1024 cylinders
Units = cylinders of 1200 * 512 = 614400 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 1024 614370 83 Linux
Disk /dev/sdc: 322.1 GB, 322122547200 bytes
255 heads, 63 sectors/track, 39162 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdc1 1 39162 314568733+ 83 Linux
Disk /dev/sdd: 408.1 GB, 408113643520 bytes
255 heads, 63 sectors/track, 49616 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdd1 1 49616 398540488+ 83 Linux
接下来的步骤是在每个卷上创建一个跨整个卷大小的主分区。我将使用 Oracle 的集群文件系统第 2 版 (OCFS2) 存储供 Oracle 集群件软件共享的两个文件。然后,将使用自动存储管理 (ASM) 创建ASM 卷;
# fdisk /dev/sdb
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-15134, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-15134, default 15134): 15134
Command (m for help): p
Disk /dev/sdb: 124.4 GB, 124486942720 bytes
255 heads, 63 sectors/track, 15134 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 15134 121563823+ 83 Linux
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
按照上述方法,依次划分/dev/sdb1、/dev/sdc1、/dev/sdd1、/dev/sde1。在创建所有必要分区之后,现在应以“root”用户帐户从集群的两个 Oracle RAC 节点使用以下命令将分区的更改情况通知给内核。
# partprobe
4.3 配置网络
系统的IP地址需要在搭建之初分配好,下面是我分配的IP地址:
IP 名称子网掩码IP 地址
Rac1-public255.255.255.0192.168.1.100
Rac2-public255.255.255.0192.168.1.101
Rac1-private255.255.255.0192.168.2.100
Rac2-private255.255.255.0192.168.2.101
Rac1-vip255.255.255.0192.168.1.200
Rac2-vip255.255.255.0192.168.1.201
在集群中的两个 Oracle RAC 节点上执行下列网络配置!
注:虽然我们在 Linux 安装过程中配置了几个网络设置,但千万不要跳过本部分,因为它包含了 RAC 环境所需的关键步骤。
在 Linux O/S 安装过程中,我们已经为这两个 Oracle RAC 节点配置了 IP 地址和主机名。现在,我们需要配置 /etc/hosts 文件,并调整几个互连的网络设置。
这两个 Oracle RAC 节点均应有一个用于公共网络的静态 IP 地址和一个用于专用集群互连的静态 IP 地址。不要为公共 IP 地址或互连使用 DHCP 命名;您需要静态 IP 地址!
使用网络配置应用程序,您需要配置两个 NIC 设备以及 /etc/hosts 文件。 我们的示例配置将使用以下设置:
Oracle RAC 节点 1 - (rac1)
设备IP 地址SubnetGateway目的
eth0192.168.1.100255.255.255.0连接 rac1 与公共网络
eth1192.168.2.100255.255.255.0 将 rac1(互连)连接到 rac2 (rac2-priv)
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
# Public Network - (eth0)
192.168.1.100 rac1
192.168.1.101 rac2
# Private Interconnect - (eth1)
192.168.2.100 rac1-priv
192.168.2.101 rac2-priv
# Public Virtual IP (VIP) addresses - (eth0)
192.168.1.200 rac1-vip
192.168.1.201 rac2-vip
Oracle RAC 节点 2 — (rac2)
设备IP 地址SubnetGateway目的
eth0192.168.1.101255.255.255.0连接 rac2 与公共网络
eth1192.168.2.101255.255.255.0将 rac2(互连)连接到 rac1 (rac1-priv)
vi /etc/hosts
127.0.0.1 localhost.localdomain localhost
# Public Network - (eth0)
192.168.1.100 rac1
192.168.1.101 rac2
# Private Interconnect - (eth1)
192.168.2.100 rac1-priv
192.168.2.101 rac2-priv
# Public Virtual IP (VIP) addresses - (eth0)
192.168.1.200 rac1-vip
192.168.1.201 rac2-vip
请注意,只需在两个 Oracle RAC 节点的 /etc/hosts 文件(或您的 DNS)中定义虚拟 IP 地址。当您运行 Oracle Universal Installer 时,该程序启动 Oracle 的虚拟互联网协议配置助手 (VIPCA),也就说 Oracle 将自动配置公共虚拟 IP 地址。当运行 srvctl start nodeapps -n node_name> 命令时,所有的虚拟 IP 地址将被激活。这就是将要在客户端 tnsnames.ora 文件中进行配置的主机名/IP 地址(后文详述)。
配置网络之后,您可以使用 ifconfig 命令验证一切是否正常。以下示例来自于 rac1:
# /sbin/ifconfig -a
eth0 Link encap:Ethernet HWaddr 00:14:6C:76:5C:71
inet addr:192.168.200.200 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::214:6cff:fe76:5c71/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1546 errors:0 dropped:0 overruns:0 frame:0
TX packets:1273 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1179157 (1.1 MiB) TX bytes:183011 (178.7 KiB)
Interrupt:169 Base address:0x2f00
eth1 Link encap:Ethernet HWaddr 00:0E:0C:64:D1:E5
inet addr:192.168.100.100 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::20e:cff:fe64:d1e5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:11 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:782 (782.0 b)
Base address:0xddc0 Memory:fe9c0000-fe9e0000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4893 errors:0 dropped:0 overruns:0 frame:0
TX packets:4893 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6521518 (6.2 MiB) TX bytes:6521518 (6.2 MiB)
sit0 Link encap:IPv6-in-IPv4
NOARP MTU:1480 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
关于虚拟 IP
10g 中为什么使用虚拟 IP (VIP)?为什么当它的主节点发生故障时它只是返回一个无效的连接?
这全是出于对应用程序可用性的考虑。当一个节点发生故障时,与其关联的 VIP 将被自动故障切换到另外某个节点上。当出现这种情况时,会发生两件事。
1.新的节点重新进行地址解析,显示该地址的一个新的 MAC 地址。对于直连客户端,这通常使它们在连接旧地址时出现错误。
2.到 VIP 的后续数据包将被传送到新的节点,该节点将把错误 RST 数据包返回客户端。这导致客户端立即收到错误信息。
这意味着,当客户端向故障节点发出 SQL 时,或者在连接状态下遍历地址列表时,客户端会接收到一个 TCP 重置信息,而不是等待很长的 TCP/IP 超时(大约 10 分钟)。发送 SQL 时,该信息为 ORA-3113。而连接时,使用 tnsname 中的下一个地址。
更进一步的操作是使用透明的应用程序故障切换 (TAF)。成功配置 TAF 后,就可以完全避免 ORA-3113 错误!
如果不使用 VIP,连接停用节点的客户端经常要等待 10 分钟的 TCP 超时,然后才收到错误信息。因此,如果没有 VIP, 用户将不能真正拥有一流的高可用性解决方案(来源 — Metalink 说明 220970.1)。
确保 RAC 节点名没有出现在环回地址中
确保在 /etc/hosts 文件的环回地址中不包含节点名(rac1 或 rac2)。如果机器名出现在环回地址条目中,如下所示:
127.0.0.1 rac1 localhost.localdomain localhost
需要按如下所示将其删除:
127.0.0.1 localhost.localdomain localhost
如果 RAC 节点名出现在环回地址中,您在 RAC 安装期间将接收到以下错误信息:
ORA-00603: ORACLE server session terminated by fatal error
或者
ORA-29702: error occurred in Cluster Group Service operation
验证 localhost 在 /etc/hosts 文件中定义为回送地址
确保 localhost.localdomain 和 localhost 项作为回送地址包含在每个 Oracle RAC 节点的 /etc/hosts 文件中:
127.0.0.1 localhost.localdomain localhost
如果 /etc/hosts 文件中不存在 localhost 项,Oracle 集群件将无法启动应用程序资源 — 特别是 ONS 进程。该错误将指明“Failed to get IP for localhost”并写入 ONS 的日志文件。例如:
CRS-0215 could not start resource 'ora.rac1.ons'. Check log file
/opt/app/crs/log/rac1/racg/ora.rac1.ons.log
for more details.
ONS 日志文件包含类似以下内容的行:
Oracle Database 10g CRS Release 10.2.0.1.0 Production Copyright 1996, 2005 Oracle.All rights reserved.
2007-04-14 13:10:02.729: [ RACG][3086871296][13316][3086871296][ora.rac1.ons]:Failed to get IP for localhost (1)
Failed to get IP for localhost (1)
Failed to get IP for localhost (1)
onsctl:ons failed to start
调整网络设置
在 Oracle 9.2.0.1 以及更高版本中,Oracle 在 Linux 上使用 UDP 作为进行过程间通信 (IPC) 的默认协议,如在 RAC 集群中实例之间的缓存融合和集群管理器缓冲区传输。
Oracle 强烈建议将默认的和最大的发送缓冲区大小(SO_SNDBUF 套接字选项)调整为 256KB,并将默认的和最大的接收缓冲区大小(SO_RCVBUF 套接字选项)调整为 256KB。
接收缓冲区由 TCP 和 UDP 用于保留所接收的数据,直到应用程序读出这些数据为止。由于不允许对端设备发送超过缓冲区大小窗口的数据,因此接收缓冲区不会溢出。这意味着,不适合套接字接收缓冲区可能导致发送设备发送的信息淹没接收设备的数据报将会被丢弃。
您无需重新引导即可在 /proc 文件系统中更改默认的和最大的窗口大小:
# su - root
# sysctl -w net.core.rmem_default=262144
net.core.rmem_default = 262144
# sysctl -w net.core.wmem_default=262144
net.core.wmem_default = 262144
# sysctl -w net.core.rmem_max=262144
net.core.rmem_max = 262144
# sysctl -w net.core.wmem_max=262144
net.core.wmem_max = 262144
以上命令更改正在运行的操作系统。现在,将以下各行程序添加到 RAC 集群中两个节点的 /etc/sysctl.conf 文件中,使以上更改永久生效(针对每次重新引导而言):
# 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
检查并关闭 UDP ICMP 拒绝
如果 UDP ICMP 被防火墙阻塞或拒绝,Oracle 集群件软件将在运行几分钟之后崩溃。如果 Oracle 集群件进程出现故障,您的 machine_name>_evmocr.log 文件中将出现以下类似内容:
08/29/2005 22:17:19
oac_init:2: Could not connect to server, clsc retcode = 9
08/29/2005 22:17:19
a_init:12!: Client init unsuccessful : [32]
ibctx:1:ERROR: INVALID FORMAT
proprinit:problem reading the bootblock or superbloc 22
如果遇到此类错误,解决方法是删除 udp ICMP (iptables) 拒绝规则,或者只需关闭防火墙选项。之后,Oracle 集群件软件将开始正常工作,而不会崩溃。以下命令应该以 root 用户帐户的身份执行:
1.检查以确保防火墙选项关闭。如果防火墙选项已停用(如下面的示例所示),则不必继续执行以下步骤。
# /etc/rc.d/init.d/iptables status
Firewall is stopped.
如果防火墙选项已启用,您首先需要手动停用 UDP ICMP 拒绝:
# /etc/rc.d/init.d/iptables stop
Flushing firewall rules: [ OK ]
Setting chains to policy ACCEPT: filter [ OK ]
Unloading iptables modules: [ OK ]
2.然后,针对下一次服务器重新引导关闭 UDP ICMP 拒绝(应该始终被关闭):
# chkconfig iptables off
4.4 建立Oracle用户
在集群中的两个 Oracle RAC 节点上执行以下任务!
我们将使用 Oracle 集群文件系统第 2 版 (OCFS2) 存储需要 Oracle 集群件软件共享的文件。在使用 OCFS2 时,集群中的两个 Oracle RAC 节点上的 UNIX 用户 oracle 的 UID 和 UNIX 组“oracle”的 GID 必须相同。如果 UID 或 GID 不同,则 OCFS2 文件系统中的文件将显示为“unowned”,甚至可能被其他用户所拥有。对于本文而言,oracle UID 使用 175,“oracle”GID 使用 115。
创建 Oracle 的组和用户
首先,创建 UNIX oinstall 和 dba 组以及 oracle 用户帐户:
# groupadd -g 115 oinstall
# groupadd -g 116 dba
# useradd -m -u 175 -g oinstall -G dba -d /home/oracle -s /bin/bash -c Oracle Software Owner oracle
# id oracle
uid=175(oracle) gid=115(oinstall) groups=115(oinstall),116(dba)
设置 oracle 帐户的口令:
# passwd oracle
Changing password for user oracle.
New UNIX password: xxxxxxxxxxx
Retype new UNIX password: xxxxxxxxxxx
passwd: all authentication tokens updated successfully.
注意,UNIX 组 oinstall 的成员被视为 Oracle 软件的“所有者”。dba 组的成员可以管理 Oracle 数据库,例如,启动和关闭数据库。在本文中,我们将创建 oracle 用户帐户以承担全部责任!
验证用户 nobody 存在
安装 Oracle 软件之前,执行以下操作,以验证用户 nobody 存在于系统中:
1.要确定该用户是否存在,输入以下命令:
# id nobody
uid=99(nobody) gid=99(nobody) groups=99(nobody)
如果该命令显示了 nobody 用户的信息,则无需创建该用户。
2.如果用户 nobody 不存在,则输入以下命令进行创建:
# /usr/sbin/useradd nobody
3.在集群中的所有其他 Oracle RAC 节点上重复此过程。
4.4 建立相关的基本目录和挂载点
创建 Oracle 基本目录
下一步是创建一个新目录,用于存储 Oracle 数据库软件。在配置 oracle 用户的环境时(本部分后面的内容),我们将把该目录的位置指定给 $ORACLE_BASE 环境变量。
以下内容假设在根文件系统中创建目录。请注意,这样做是为了简便起见,不建议将其作为通用做法。通常,这些目录将在单独的文件系统中创建。
创建目录之后,您必须为其指定正确的拥有者、组和权限。在两个 Oracle RAC 节点上执行以下命令:
# mkdir -p /opt/app/oracle
# chown -R oracle:oinstall /opt/app/oracle
# chmod -R 775 /opt/app/oracle
在过程结束时,您将看到以下内容:
•/opt 由根目录拥有。
•/opt/app 由根目录拥有。
•/opt/app/oracle 由具有 775 权限的 oracle:oinstall 拥有。该所有权和权限允许 OUI 在 /opt/app/oracle/oraInventory 路径下创建 oraInventory 目录。
创建 Oracle 集群件主目录
接下来,创建一个新目录,用于存储 Oracle 集群件软件。在配置 oracle 用户的环境时(本部分后面的内容),我们将把该目录的位置指定给 $ORA_CRS_HOME 环境变量。
如上一部分中所述,以下内容假设目录将在根文件系统中创建。这样做是为了简便起见,不建议将其作为通用做法。通常,这些目录将在单独的文件系统中创建。
创建目录之后,您必须为其指定正确的拥有者、组和权限。在两个 Oracle RAC 节点上执行以下命令:
# mkdir -p /opt/app/crs
# chown -R oracle:oinstall /opt/app/crs
# chmod -R 775 /opt/app/crs
在过程结束时,您将看到以下内容:
•/opt 由根目录拥有。
•/opt/app 由根目录拥有。
•/opt/app/crs 由具有 775 权限的 oracle:oinstall 拥有。这些权限是安装 Oracle 集群件所需的,并且在安装过程中将被更改。
为 OCFS2/ 集群件创建挂载点
现在,让我们为 Oracle 集群文件系统第 2 版 (OCFS2) 创建挂载点,它将用于存储两个 Oracle 集群件共享文件。
如上一部分中所述,以下内容假设目录将在根文件系统中创建。这样做是为了简便起见,不建议将其作为通用做法。通常,这些目录将在单独的文件系统中创建。在两个 Oracle RAC 节点上执行以下命令:
# mkdir -p /opt/oradata/orcl
# chown -R oracle:oinstall /opt/oradata/orcl
# chmod -R 775 /opt/oradata/orcl
4.5 修改环境变量
在两个节点上创建“oracle”UNIX 用户帐户后,确保以 oracle 用户身份登录,并使用本部分提供的 .bash_profile 验证环境是否设置得当。
注:当您为每个 Oracle RAC 节点设置 Oracle 环境变量时,请确保为每个 RAC 节点分配唯一的 Oracle SID!对于此示例,我使用:
•rac1:ORACLE_SID=orcl1
•rac2:ORACLE_SID=orcl2
以 oracle 用户帐户登录到每个节点:
# su – oracle
# vi .bash_profile
“oracle”用户帐户的 .bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
alias ls= ls -FA
export JAVA_HOME=/usr/local/java
# User specific environment and startup programs
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORA_CRS_HOME=/opt/app/crs
export ORACLE_PATH=$ORACLE_BASE/common/oracle/sql:.:$ORACLE_HOME/rdbms/admin
export CV_JDKHOME=/usr/local/java
# Each RAC node must have a unique ORACLE_SID. (i.e. orcl1, orcl2,...)
export ORACLE_SID=orcl1
(注意此行,rac2应为:export ORACLE_SID=orcl2)
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
4.6 修改操作系统内核参数和相关配置
以下操作在两台节点均要进行
本部分将集中讨论针对 Oracle RAC 10g 的安装配置两台 Oracle RAC Linux 服务器的步骤。这包括验证足够的交换空间、设置共享内存和信号、设置文件句柄的最大数量、设置 IP 本地端口范围、设置对 oracle 用户的 shell 限制、激活系统的所有内核参数,以及如何验证两个集群节点的日期和时间是否正确。
在本节中,您将注意到可以使用多种方法来配置(设置)这些参数。就本文而言,我将通过把所有命令置于 /etc/sysctl.conf 文件中使所有更改永久有效(通过重新引导)。
对交换空间的考虑因素
•安装 Oracle 数据库 10g 第 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 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 共享内存内核参数。该参数控制系统一次可以使用的共享内存总量(以页为单位)。
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 中的条目硬限制
最大打开文件描述符数nofile65536
可用于单个用户的最大进程数nproc16384
要进行这些更改,以 root 用户身份运行以下命令:
cat >> /etc/security/limits.conf EOF
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
EOF
cat >> /etc/pam.d/login EOF
session required /lib/security/pam_limits.so
EOF
为“oracle”UNIX 帐户更新默认的 shell 启动文件。
•对于 Bourne、Bash 或 Korn shell,通过运行以下命令将以下行添加到 /etc/profile 文件:
cat >> /etc/profile EOF
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 EOF
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) 将首先将软件安装到运行该安装程序的本地节点(即 rac1)。然后,将该软件以远程方式复制到集群中的其余节点(即 rac2)。在远程复制过程中,OUI 将在每个远程节点上执行 UNIX“tar”命令,以提取进行了存档和复制的文件。如果执行安装的节点上的日期和时间大于其要进行复制的节点上的日期和时间,那么 OUI 将在“tar”中引发一个错误,以指示其在试图提取带有时间戳的文件时失败。
Error while copying directory
/opt/app/crs with exclude file list 'null' to nodes 'rac2'.
[PRKC-1002 : All the submitted commands did not execute successfully]
---------------------------------------------
rac2:
/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 服务器并非始终可用。在这种情况下,为集群中的节点手动设置日期和时间,确保要从其中执行软件安装的节点 (rac1) 的时间和日期小于集群中所有其他节点 (rac2)。我一般使二者之间相差 20 秒,如以下示例所示:
设置 rac1 的日期和时间:
# date -s 6/25/2007 23:00:00
设置 rac2 的日期和时间:
# date -s 6/25/2007 23:00:20
本文中所述的双节点 RAC 配置没有使用 Network Time Protocol 服务器。
________________________________________
配置 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 寄存器,该寄存器每接收到一个时钟信号就将计数加一。
安装 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 并无害处。
# 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 rac1 kernel: Hangcheck: starting hangcheck timer 0.9.0 (tick is 30 seconds, margin is 180 seconds).
Jun 25 18:18:31 rac1 kernel: Hangcheck: Using monotonic_clock().
4.7 为远程访问配置节点
在集群中的两个 Oracle RAC 节点上执行以下配置过程!
在可以安装并使用 Oracle 真正应用集群之前,您必须为所有集群节点上的“oracle”UNIX 用户帐户配置安全 shell (RSH) 或远程 shell (RSH)。此处的目的是为“oracle”UNIX 用户帐户设置用户等效性。利用用户等效性 (User equivalence),“oracle”UNIX 用户帐户无需口令就可访问集群中的所有其他节点(运行命令和复制文件)。使用 SSH 或 RSH(其中 SSH 是首选方法)都可实现此配置。Oracle 在 10g 第 1 版中增加了将 SSH 工具套件用于设置用户等效项的支持。在 Oracle 数据库 10g 之前,用户等效性必须使用远程 shell 进行配置。
注意,如果 10g 中的 Oracle Universal Installer 没有检测出存在安全 shell 工具(ssh 和 scp),那么它将尝试使用远程 shell 工具(rsh 和 rcp)。
那么,我们为什么必须设置用户等效性?安装 Oracle 集群件和 Oracle 数据库软件只在 RAC 集群中的一个节点上进行。在特定节点上运行 Oracle Universal Installer (OUI) 时,它将使用 ssh 和 scp 命令(如果使用远程 shell,则用 rsh 和 rcp 命令)在集群内的所有其他节点上运行远程命令并向这些节点复制文件(Oracle 软件)。运行 OUI (runInstaller) 的节点上的“oracle”UNIX 用户帐户必须受到您的 RAC 集群中其他所有节点的信任。这意味着,相对于集群中的所有其他 Linux 服务器,您必须能够在要从其中运行 OUI 的 Linux 服务器上运行安全 shell 命令(ssh 或 scp)或远程 shell 命令(rsh 和 rcp),而不会收到输入口令的提示。
注意,普通 RAC 操作无需使用安全 shell 或远程 shell。然而,对于 RAC 和补丁集安装以及创建集群数据库时,必须启用该配置。
第一步是确定使用哪种远程访问方法 — 安全 shell 还是远程 shell。二者各有利弊。例如,远程 shell 非常易于安装和配置。它的构造只需很少的几步,并当登录到受信任的节点(要从其中执行安装的节点)后,其在终端会话中始终可用。然而,在安装和任何修补过程中,到远程节点的连接不安全。另一方面,安全 shell 可在安装和修补时提供安全连接,但是设置步骤繁琐。此外,每次 oracle 用户登录到受信任的节点后,都需要在终端会话中启用该方法。官方 Oracle 文档仅给出了设置安全 shell 的步骤,并将其作为首选方法。
在以下两个部分对于配置用户等效性的这两种方法进行了介绍:
•使用安全 Shell 方法
•使用远程 Shell 方法
使用安全 Shell 方法
本部分将介绍如何配置 OpenSSH 版本 3。要确定是否 SSH 已安装并运行,可输入以下命令:
# pgrep sshd
2808
如果 SSH 正在运行,那么该命令的响应将是一个进程 ID 编号(一个或多个)列表。请在集群中的两个 Oracle RAC 节点上运行该命令,以验证 SSH 后台程序已安装并正在运行!
在两个 Oracle RAC 节点上创建 RSA 和 DSA 密钥
配置 SSH 的第一步是在集群中的两个 Oracle RAC 节点上创建 RSA 和 DSA 密钥对。执行该操作的命令将为 RSA 和 DSA 各创建一个公共密钥和一个私有密钥(每个节点总共 4 个密钥)。然后,需要将 RSA 和 DSA 公共密钥的内容复制到一个授权密钥文件 中,之后将该文件分发到集群中的两个 Oracle RAC 节点。
使用以下步骤创建 RSA 和 DSA 密钥对。请注意,集群中的两个 Oracle RAC 节点上均需要完成这些步骤:
1.以“oracle”UNIX 用户帐号进行登录。
# su - oracle
2.如果必要,在“oracle”用户的主目录中创建 .ssh 目录,并在其上设置正确的权限:
$ mkdir -p ~/.ssh
$ chmod 700 ~/.ssh
3.输入以下命令,为版本 3 的 SSH 协议生成 RSA 密钥对(公共密钥和私有密钥):
$ /usr/bin/ssh-keygen -t rsa
在提示符下:
o接受针对密钥文件的默认位置。
o输入并确认口令短语。该口令应当与“oracle”UNIX 用户帐户口令不同,但这不是必需的。
该命令会将公共密钥写入 ~/.ssh/id_rsa.pub 文件,将私有密钥写入 ~/.ssh/id_rsa 文件。注意,始终不要将密钥分发给任何人!
4.输入以下命令,为版本 3 的 SSH 协议生成 DSA 密钥对(公共密钥和私有密钥):
$ /usr/bin/ssh-keygen -t dsa
在提示符下:
o接受针对密钥文件的默认位置。
o输入并确认口令短语。该口令应当与“oracle”UNIX 用户帐户口令不同,但这不是必需的。
该命令会将公共密钥写入 ~/.ssh/id_dsa.pub 文件,将私有密钥写入 ~/.ssh/id_dsa 文件。注意,始终不要将密钥分发给任何人!
5.为集群中的两个 Oracle RAC 节点重复以上步骤。
现在,每个 Oracle RAC 节点都包含用于 RSA 和 DSA 的公共和私有密钥,您需要在其中一个节点上创建一个授权密钥文件。授权密钥文件只是一个包含每个人(每个节点)的 RSA 和 DSA 公共密钥的文件。在授权密钥文件包含了所有公共密钥后,将其分发至集群中的所有其他节点。
在集群中的其中一个节点上完成以下步骤,然后分发授权密钥文件。考虑到本文的目的,我将使用 rac1:
1.首先,确定该节点上是否已经存在授权密钥文件 (~/.ssh/authorized_keys)。在多数情况下,该文件是不存在的,因为本文假设您使用的是新安装。如果该文件不存在,那么现在开始创建:
$ touch ~/.ssh/authorized_keys
$ cd ~/.ssh
$ ls -l *.pub
-rw-r--r-- 1 oracle oinstall 603 Aug 31 23:40 id_dsa.pub
-rw-r--r-- 1 oracle oinstall 223 Aug 31 23:36 id_rsa.pub
以上的列表应当显示前一部分中创建的 id_rsa.pub 和 id_dsa.pub 公共密钥。
2.在该步骤中,使用 SSH 将 ~/.ssh/id_rsa.pub 和 ~/.ssh/id_dsa.pub 公共密钥的内容从集群中的两个 Oracle RAC 节点复制到刚才创建的授权密钥文件中 (~/.ssh/authorized_keys)。同样,我将通过 rac1 进行操作。系统将提示您为每个访问的 Oracle RAC 节点输入“oracle”UNIX 用户帐户口令。注意,在使用 SSH 访问您所在的节点 (rac1) 时,第一次将提示输入“oracle”UNIX 用户帐户口令。第二次尝试访问该节点时,将提示输入用于解锁私有密钥的口令短语。对于任何其他节点,系统将始终询问“oracle”UNIX 用户帐户口令。
以下示例将从 rac1 运行,假设这是个双节点集群,即节点 rac1 和 rac2:
$ ssh rac1 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
The authenticity of host 'rac1 (192.168.1.100)' can't be established.
RSA key fingerprint is 61:8a:f9:9e:28:a2:b7:d3:70:8d:dc:76:ca:d9:23:43.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'rac1,192.168.1.100' (RSA) to the list of known hosts.
oracle@rac1's password: xxxxx
$ ssh rac1 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
Enter passphrase for key '/home/oracle/.ssh/id_rsa': xxxxx
$ ssh rac2 cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
The authenticity of host 'rac2 (192.168.1.101)' can't be established.
RSA key fingerprint is 84:2b:bd:eb:31:2c:23:36:55:c2:ee:54:d2:23:6a:e4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'rac2,192.168.1.101' (RSA) to the list of known hosts.
oracle@rac2's password: xxxxx
$ ssh rac2 cat ~/.ssh/id_dsa.pub >> ~/.ssh/authorized_keys
oracle@rac2's password: xxxxx
注:第一次使用 SSH 从特定系统连接到节点时,您可能会看见一条类似如下所示的消息:
The authenticity of host 'rac1 (192.168.1.100)' can't be established.
RSA key fingerprint is 61:8a:f9:9e:28:a2:b7:d3:70:8d:dc:76:ca:d9:23:43.
Are you sure you want to continue connecting (yes/no)? yes
在提示符下输入 yes 进行确认。如果从该系统连接到相同的节点,您将不会再次看到该消息。
3.此时,在 rac1 上,我们在授权密钥文件 (~/.ssh/authorized_keys) 中获得了来自集群中各个节点的 RSA 和 DSA 公共密钥内容。我们现在将其复制到集群中的其余节点。在这个双节点集群示例中,唯一剩下的节点就是 rac2。使用 scp 命令将授权密钥文件复制到集群中的其余所有节点:
$ scp ~/.ssh/authorized_keys rac2:.ssh/authorized_keys
oracle@rac2's password: xxxxx
authorized_keys 100% 1652 1.6KB/s 00:00
4.通过登录到节点并运行以下命令,为集群中的两个 Oracle RAC 节点更改授权密钥文件的权限:
$ chmod 600 ~/.ssh/authorized_keys
5.此时,如果在另一个节点上使用 ssh 登录或运行命令,则会提示您输入在创建 DSA 密钥时指定的口令短语。例如,在 rac1 中测试以下内容:
$ ssh rac1 hostname
Enter passphrase for key '/home/oracle/.ssh/id_rsa': xxxxx
rac1
$ ssh rac2 hostname
Enter passphrase for key '/home/oracle/.ssh/id_rsa': xxxxx
rac2
注:如果除主机名外,您还看到任何其他消息或文本,则 Oracle 安装可能失败了。进行必要的更改,以确保您在输入这些命令时只有主机名显示。您应当确保修改生成任何输出或询问任何问题的登录脚本(一个或多个)的任何部分,以便它们仅当 shell 是交互式 shell 时生效。
为当前 Shell 会话启用 SS