Oracle10gR2 RAC实时应用集群(三)在Redhat Enterprise Linux5 x86_64下的集群(RAW+ASM篇)
(Oracle10gR2 + ClusterWare + RHEL5 + RAW + ASM)
RAC(Real Application Clusters,实时应用集群),是多台主机组成的集群计算环境,是Oracle数据库支持网格计算环境的核心技术。
普通Oracle数据库,只能在一台主机上运行,数据库的实例和数据库文件都在一台主机上,是单实例单数据库。
RAC实时应用集群,可以在多台主机上运行,每台节点主机上运行一个数据库实例,通过共享存储磁盘访问相同的数据库文件,是多实例单数据库,单一节点故障不影响数据库的使用,负载能力也会随节点主机的增加而加强。
RAC集群的关键点:
1.共享存储
2.节点间需要内部通讯,以协调集群正常运行,所以每个节点需要提供外部网络与内部网络.
3.CRS集群软件: 需要集群软件(Clusterware)协调各节点.
4.集群注册文件(OCR): 需要注册集群,保存在共享磁盘上.
5.仲裁磁盘(Voting Disk): 需要协调各节点决定控制权,做为表决器,保存在共享磁盘上.
6.虚拟IP(Virturl IP): 提供客户端连接,IP由集群软件接管,当集群就绪时,虚拟IP可以连接.
共享存储访问方式(存储系统):
1.集群文件系统(CFS:Cluster File System)
2.自动存储管理(ASM:Automatic Storage Management)
3.网络文件系统(NFS)
4.裸设备(RAW)
单机文件系统FAT32,NTFS,ext3不能作为共享存储
选择以下储存方案来建立集群系统:
项目 存储系统 存储位置
Clusterware软件 本地文件系统 本地磁盘
voting disk RAW 共享磁盘
OCR RAW 共享磁盘
数据库软件 本地文件系统 共享磁盘
数据库 ASM 共享磁盘
下面说说Oracle RAC在Redhat Enterprise Linux5 x86_64下的安装过程。
一.配置多主机节点环境
主要为学习测试之用,可以使用虚拟机模拟来实现多台主机,比较好的选择是VMware Workstation8.0.4.
1.使用VMware Virtual Network Editor添加网络适配器(VMnet1,VMnet2),生成两个网段,VMnet1的网段用于节点外部通讯(PublicNet),VMnet2网段用于节点间通讯(PrivateNet).
2.使用VMware创建两台主机,在每台主机上安装Redhat Enterprise Linux5 x86_64系统,每台需要虚拟两张网卡,IP分配如下:
节点主机 主机公网IP 虚拟IP 私网IP(内部网络)
RAC01 192.168.89.166 192.168.89.66 192.168.234.166
RAC02 192.168.89.167 192.168.89.67 192.168.234.167
公网与私网IP设置在网卡上,虚拟IP不用设置.
3.设置DNS解析,修改2台虚拟机rac01,rac02上的/etc/hosts文件,添加以下内容:
192.168.89.166 rac01
192.168.89.167 rac02
192.168.89.66 rac01v
192.168.89.67 rac02v
192.168.234.166 rac01p
192.168.234.167 rac02p
4.在各节点上检查和安装需要用到的软件包
根据Oracle官方文档,需要以下软件包:
binutils-2.17.50.0.6-2.el5
compat-db-4.2.52-5.1
compat-gcc-34-3.4.6-4
compat-gcc-34-c++-3.4.6-4
compat-libstdc++-33-3.2.3-61
compat-libstdc++-33-3.2.3-61(i386)
compat-libstdc++-296(i386)
gcc-4.1.1-52.el5.2
gcc-c++-4.1.1-52.el5.2
glibc-2.5-12
glibc-2.5-12(i386)
glibc-common-2.5-12
glibc-devel-2.5-12
glibc-devel-2.5-12(i386)
glibc-headers-2.5-12
libgcc-4.1.1-52.el5(i386)
libXp-1.0.0(i386)
libXt-1.0.2(i386)
libXtst-1.0.1(i386)
libaio-0.3.106-3.2
libaio-devel-0.3.106-3.2
libgcc-4.1.1-52.el5
libstdc++-4.1.1-52.el5.2
libstdc++-devel-4.1.1-52.el5.2
libgomp-4.1.1-52.EL5
make-3.81-1.1
numactl-devel-0.9.8.x86_64
sysstat-7.0.0-3.el5
以root用户登录系统,执行以下语句检查软件包是否安装
# rpm -q binutils compat-db compat-gcc-34 compat-gcc-34-c++ compat-libstdc++-33 compat-libstdc++-296 gcc gcc-c++
# rpm -q glibc glibc-common glibc-devel glibc-headers libgcc libXp libXt libXtst libaio libaio-devel libgcc
# rpm -q libstdc++- libstdc++-devel libgomp make numactl-devel sysstat
找到Redhat Enterprise Linux5 x86_64安装光盘的Server目录,安装没有安装的软件包
# rpm -ivh compat-db-4.2.52-5.1.x86_64.rpm
5.各节点内核参数修改.
修改文件/etc/sysctl.conf,添加以下内容:
# /etc/sysctl.conf
# for oracle
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144
执行以下语句生效:
# /sbin/sysctl -p
修改文件/etc/security/limits.conf,添加以下内容:
# /etc/security/limits.conf
# for oracle
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
修改文件/etc/pam.d/login
# /etc/pam.d/login
# for oracle
session required pam_limits.so
修改文件/etc/profile,添加以下内容:
# /etc/profile
# for oracle
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi
6.在各节点上添加组和用户
# groupadd oinstall
# groupadd dba
# useradd -g oinstall -G dba oracle
# passwd oracle
7.在各节点上创建文件夹
# mkdir -p /u01/app
# mkdir -p /u01/app/crs
# chown -R oracle:oinstall /u01/app
# chmod -R 775 /u01/app
# chown -R root:oinstall /u01/app/crs
# chmod -R 775 /u01/app/crs
8.配置各节点间ssh通信协议
由于RAC需要互相通信,并且都需要运行在oracle用户下,就需要在各节点oracle用户建立互信机制
<<1>>创建.ssh目录
以oracle用户登录节点,检查/home/oracle/下是否有.ssh目录,如果没有就创建一个.
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
<<2>>生成RSA key
在每个主机节点上执行以下命令创建RSA Key
$ /usr/bin/ssh-keygen -t rsa
全部回车接受默认项,将生成id_rsa.pub文件
<<3>>将生成的RSA Key添加到authorized_keys中
以oracle用户登录节点rac01
$cat id_rsa.pub >> authorized_keys //生成authorized_keys文件
$scp authorized_keys rac02:/home/oracle/.ssh/ //把节点rac01的文件authorized_keys传输到rac02
以oracle用户登录节点rac02
$cat id_rsa.pub >> authorized_keys //添加RSA Key到authorized_keys文件
$scp authorized_keys rac01:/home/oracle/.ssh/ //把节点rac02的文件authorized_keys传回到rac01
<<4>>启用ssh协议
在每个节点上执行以下通信命令,此时需要输入密码.
$ ssh rac01 date
$ ssh rac02 date
$ ssh rac01p date
$ ssh rac02p date
在每个节点上启动ssh代理,并将ssh key装载到内存中
$ exec /usr/bin/ssh-agent $SHELL
$ /usr/bin/ssh-add
再执行上面的通信命令,不再需要密码.
9.创建共享磁盘
关闭主机后建共享磁盘,Disk Mode 选择Independent Persistent,不用缓存,以便多机访问共享.
磁盘总线选择SCSI 1:1或1:x,与本地磁盘(SCSI 0:0)分开
另外需要修改各虚拟机目录中的vmx文件,解除锁并取消缓存,以便多机访问,添加
disk.locking="false"
diskLib.dataCacheMaxSize = "0"
创建后另一台主机也挂载同一个磁盘.
10.磁盘分区
启动主机后使用fdisk命令给共享磁盘分区。
指定为扩展分区,分成三个逻辑分区
# fdisk -l //查看分区
# fdisk /dev/sdb //分区sdb硬盘,逻辑盘sdb5,sdb6,sdb7
两个分区将配置为裸设备,分别存放集群注册(ocr)文件和表决磁盘(votedisk)文件,另一个分区将配置为ASM磁盘,存放数据库文件.
分区后重新启动
11.配置裸设备(raw)
需要配置裸设备服务,并且Oracle用户对裸设备必须有访问权限,在每个节点执行以下步骤.
修改文件/etc/sysconfig/rawdevices,添加以下内容:
# /etc/sysconfig/rawdevices
/dev/raw/raw1 /dev/sdb5
/dev/raw/raw2 /dev/sdb6
设置服务自动启动.
# chkconfig --list rawdevices
启动服务
# service rawdevices restart
设置访问权限.
# chown oracle:dba /dev/raw/raw1
# chown oracle:dba /dev/raw/raw2
# chmod 775 /dev/raw/raw1
# chmod 775 /dev/raw/raw2
# raw -qa
12.安装ASM内核软件包
在oracle官方网站下载asm的软件包安装到各节点主机上.
oracleasm-support-2.1.7-1.el5.x86_64.rpm
oracleasmlib-2.0.4-1.el5.x86_64.rpm
oracleasm-2.6.18-308.el5-2.0.5-1.el5.x86_64.rpm
可以从以下链接下载:
http://www.oracle.com/technetwork/server-storage/linux/asmlib/index-101839.html
13.创建ASM磁盘.
在一个节点执行以下命令
# /etc/init.d/oracleasm enable
# /etc/init.d/oracleasm createdisk VOL1 /dev/sdb7
将在以下路径产生ASM磁盘VOL1.
/dev/oracleasm/disks/VOL1
在其它节点执行以下命令,扫描ASM磁盘.
# /etc/init.d/oracleasm enable
# /etc/init.d/oracleasm configure
# /etc/init.d/oracleasm scandisks
# /etc/init.d/oracleasm listdisks
然后需要在每个节点上设置磁盘的访问权限,否则后面配置磁盘时无法发现磁盘.
# chown oracle:dba /dev/oracleasm/disks/VOL1
还有一种建ASM磁盘的方式是在裸设备上建ASM磁盘.
二.安装RAC.
1.安装RAC集群服务软件Clusterware
<<1>>首先修改目录权限
# chown -R root:oinstall /u01/crs
# chmod -R 775 /u01/crs
# chown -R oracle:oinstall /u01/app/
# chmod -R 775 /u01/app/
# chown -R oracle:oinstall /u01/oradata
# chmod -R 775 /u01/oradata
将软件包10201_clusterware_linux_x86_64.cpio.gz解压到节点rac01.
# gunzip 10201_clusterware_linux_x86_64.cpio.gz
# cpio -idmv <10201_database_linux_x86_64.cpio
<<2>>以oracle用户执行目录clusterware下的runInstaller命令:
$ export LANG=""
$ ./runInstaller
可能会提示错误
Checking operating system version: must be redhat-3, SuSE-9, redhat-4, UnitedLinux-1.0, asianux-1 or asianux-2
Failed <<<<
这是因为Oracle10gR2发布的时候还没有redhat-5,后来Oracle的官方文档有说明支持redhat-5.
解决方案有两种:
第一种方案是修改/etc/redhat-release文件,修改版本为4.
# /etc/redhat-release
Red Hat Enterprise Linux Server release 5.8 (Tikanga)
第二种方案是修改解压后安装文件clusterware/install/oraparam.ini
# clusterware/install/oraparam.ini
[Certified Versions]
Linux=redhat-3,SuSE-9,redhat-4,UnitedLinux-1.0,asianux-1,asianux-2
添加redhat-5.
但第二种方案好像在后面还是有问题。
然后再执行runInstaller,启动安装图形界面.
<<3>>指定crs位置
/u01/app/oraInventory
/u01/app/crs/10.2.0
<<4>>指定集群配置
集群名称 crs
公共节点名 专用节点名 虚拟主机名
rac01 rac01p rac01v
rac02 rac02p rac02v
<<5>>修改网卡eth0接口类型为共用.
<<6>>集群配置存储
指定OCR(Oracle Cluster Registry)文件位置
OCR Configuration: External Redundancy
OCR Location: /dev/raw/raw1
指定表决磁盘(Voting Disk)文件位置
Voting Disk Configuration: External Redundancy
Voting Disk Location: /dev/raw/raw2
<<7>>执行安装
在Configuration Assistant第4步可能失败,这是在公用接口上使用了私有IP,忽略选择下一步,在退出后手动执行VIPCA就可以了.
在crs的bin目录,运行vipca,指定虚拟主机别名及虚拟IP
rac01v 192.168.89.66
rac02v 192.168.89.67
安装过程中提示在rac01和rac02执行以下脚本,另开一个命令窗口以root用户执行.
/u01/crs/oraInventory/orainstRoot.sh
/u01/crs/10.2.0/root.sh
在第二个节点执行root.sh时可能出错,此时runInstaller安装界面不要点OK关闭.
可能出现的几个问题.
(1)以root用户在第二个节点执行root.sh时出错,启动vipca失败,需要手动执行vipca,先不要点OK关闭.
Running vipca(silent) for configuring nodeapps
/u01/app/crs/10.2.0/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
这可能是oracle 10201版本的一个bug,修补方法如下:
将文件/u01/app/crs/10.2.0/bin/vipca中的这一段给注释掉
#Remove this workaround when the bug 3937317 is fixed
LD_ASSUME_KERNEL=2.4.19
export LD_ASSUME_KERNEL
或者在后面添加unset LD_ASSUME_KERNEL
(2)再执行vipca又会出现第二个问题.
[root@rac02 bin]# ./vipca
Error 0(Native: listNetInterfaces:[3])
[Error 0(Native: listNetInterfaces:[3])]
此时需要在节点rac02以root身份执行以下命令来解决
# cd /u01/app/crs/10.2.0/bin
# ./oifcfg iflist
eth0 192.168.89.0
eth1 192.168.234.0
# ./oifcfg setif -global eth0/192.168.89.0:public
# ./oifcfg setif -global eth1/192.168.234.0:cluster_interconnect
# ./oifcfg getif
eth0 192.168.89.0 global public
eth1 192.168.234.0 global cluster_interconnect
(3)在执行root.sh前最好关闭防火墙墙,不然会出现CRS无法启动,导致后面执行vipca出错,目前还没搞懂到底是需要哪些端口.
# ./vipca
PRKH-1010 : 无法与 CRS 服务通信。
[Communications Error(Native: prsr_initCLSS:[3])]
PRKH-1010 : 无法与 CRS 服务通信。
[Communications Error(Native: prsr_initCLSS:[3])]
PRKH-1010 : 无法与 CRS 服务通信。
[Communications Error(Native: prsr_initCLSS:[3])]
<<8>>执行vipca配置虚拟ip
# cd /u01/app/crs/10.2.0/bin
# export LANG=C
# ./vipca
指定网卡eth0.
设置虚拟主机rac01v,rac02v及ip地址.
<<9>>执行完后检查CRS是否成功
vipca运行完后,安装程序runInstaller界面点OK,即可安装完成,完成后确认是否安装成功:
# cd /u01/app/crs/10.2.0/bin
# ./olsnodes
rac01
rac02
# ./crsctl check crs
CSS appears healthy
CRS appears healthy
EVM appears healthy
# ./crs_stat -t -v
Name Type R/RA F/FT Target State Host
----------------------------------------------------------------------
ora.rac01.gsd application 0/5 0/0 ONLINE ONLINE rac01
ora.rac01.ons application 0/3 0/0 ONLINE ONLINE rac01
ora.rac01.vip application 0/0 0/0 ONLINE ONLINE rac01
ora.rac02.gsd application 0/5 0/0 ONLINE ONLINE rac02
ora.rac02.ons application 0/3 0/0 ONLINE ONLINE rac02
ora.rac02.vip application 0/0 0/0 ONLINE ONLINE rac02
表示CRS已成功.
重新启动节点后,可能集群服务不能启动.
# ./crsctl check crs
Failure 1 contacting CSS daemon
Cannot communicate with CRS
Cannot communicate with EVM
这可能存在一个裸设备目录权限的问题,CRS安装后裸设备owner被修改为root.
# chown oracle:oinstall /dev/raw/raw1
# chown oracle:oinstall /dev/raw/raw2
# /etc/init.d/init.crs stop # 停止CRS服务
# /etc/init.d/init.crs start # 启动CRS服务
# /u01/app/crs/10.2.0/bin/crsctl stop crs # 停止CRS服务
# /u01/app/crs/10.2.0/bin/crsctl start crs # 启动CRS服务
# /etc/init.d/init.crs disable # 禁止随系统启动
# /etc/init.d/init.crs enable # 允许随系统启动
2.安装Oracle数据库软件.
<<1>>.编辑Oracle用户环境,编辑.bash_profile文件
# su - oracle
$ vi .bash_profile
添加以下内容
# For Oracle
export DISPLAY=:0.0
export TMP=/tmp;
export TMPDIR=$TMP;
export ORACLE_BASE=/u01/app/oracle;
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1;
export ORACLE_SID=astt;
export ORACLE_TERM=xterm;
export PATH=/usr/sbin:$PATH;
export PATH=$ORACLE_HOME/bin:$PATH;
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib;
<<2>>.将oracle数据库软件解压到节点rac01.
# gunzip 10201_database_linux_x86_64.cpio.gz
# cpio -idmv <10201_database_linux_x86_64.cpio
<<2>>.修改目录权限。
# chown -R oracle:oinstall /u01/app/
# chmod -R 775 /u01/app/
<<3>>.以oracle登入系统,运行database下的runInstaller文件。
$ export LANG=""
$ ./runInstaller
home默认为.bash_profile中设置.
OraDb10g_home1
/u01/app/oracle/product/10.2.0/db_1
节点全选,
检测过程可能出现网络配置的错误:
Recommendation: Oracle supports installations on systems with DHCP-assigned public IP addresses. However, the primary network interface on the system should be configured with a static IP address in order for the Oracle Software to function properly. See the Installation Guide for more details on installing the software on systems configured with DHCP.
解决方案:Oracle默认网络是静态IP的,将/etc/hosts文件中127.0.0.1放在后面可以解决.
选择仅安装数据库软件,后续再通过dbca创建数据库.
安装完执行root.sh,后续可能裸设备owner又被修改,
# chown oracle:oinstall /dev/raw/raw1
# chown oracle:oinstall /dev/raw/raw2
# /u01/app/oracle/product/10.2.0/db_1/bin/localconfig reset
3.设置监听程序.
以oracle用户运行netca命令,配置监听程序,选择集群所有节点.
# /u01/app/oracle/product/10.2.0/db_1/bin/localconfig reset
4.配置ASM自动存储管理
以oracle用户运行dbca,选择配置自动存储管理.
节点选全部.
初始化参数Type of paramenter: Create initialization paramenter file(IFILE)
磁盘参数Disk Dscovery Path: /dev/oracleasm/disks/VOL* # 用于发现磁盘
点Create New创建磁盘组,如果未发现磁盘,需检查磁盘参数Disk Dscovery Path正确和磁盘的权限Oracle用户须可访问.
Create Disk Group创建磁盘组时,冗余策略选择External.
5.创建数据库.
以oracle用户运行dbca.
选择Oracle Real Application Clusters数据库,节点全选.
存储选择使用自动存储管理(Automatic Storage Management(ASM)).
选择磁盘组
数据库文件位置: Use Oracle-Managed Files
6.测试数据库
运行sqlplus,以dba权限登录Oracle系统后执行以下语句查询集群节点状态:
$ ./crs_stat -t -v
$ sqlplus system/password@astt;
SQL> select instance_name,host_name,status from v$instance;
SQL> select instance_name,host_name,status from gv$instance;