2011年(5)
分类: Oracle
2011-03-14 09:04:22
RAC(Oracle Real Application Clusters 真正应用集群)是使多个服务器访问同一个Oracle数据库,这样一方面可以避免一个服务器宕机时数据库不能访问(即高可用性),同时也可以进行并行运算和负载均衡。从软件组件上来讲,一个Oracle集群由多台服务器组成,每台服务器有自己的监听器(Listener),用于监听自己的网络端口;每台服务有自己的Oracle RAC服务,用于数据库的集群访问;每台服务器有自己的集群就绪服务(clusterware),用于集群管理;所有的服务器通过自己的操作系统访问一个共享的存储设备,共享存储设备的存储机制可以使用裸设备(Raw)、Oracle集群文件系统(OCFS)、自动存储管理(ASM)或网络区域存储(NAS)。当有客户端访问时,由上而下依次调用相应的软件。要安装Oracle的集群,至少需要两个软件:Oracle数据库软件(集成了RAC)和Oracle ClusterWare。Oracle clusterware也可以使用经过了RAC认证的第三方集群软件来代替。从逻辑结构上来讲,集群中的每台服务器有一个实例,每台服务器上的实例都对应到同一个数据库。在集群中有两台服务器,每台服务器拥有一个实例,每个实例都访问同一个数据库,数据库存储在共享磁盘上。关于Oracle软件和本地存档日志,既可以存储在本地磁盘上,也可以存储在共享磁盘上,这取决于在安装时选择的存储机制。而客户端首先访问某个实例,让后再通过集群管理软件访问到数据库的数据;节点之间使用内部连接进行通讯。同时为了减少IO的消耗,存在了一个全局缓存服务,因此每一个数据库的instance,都保留了一份相同的数据库cache。
下面先介绍RAC的配置步骤,然后讲述RAC配置过程中遇到的问题和解决方法!
RAC的配置步骤:
一:实验规划
1. 平台:
操作系统: RedHat Enterprise Linux Advanced Server 5.0
内存大小: 2048M
交换空间: 2048M
硬盘空间: 10G
网卡配置: 2(public IP,Vitual IP ,Private IP)
主机结点:2(node1,node2)
存储设备:1 (DB fies)
2. 网络规划:
Node1 公共 192.168.100.110
Node2 公共 192.168.100.112
Node1-vip 虚拟 192.168.100.210
Node2-vip 虚拟 192.168.100.212
Node1-priv 专用 19.168.100.110
Node2-priv 专用 19.168.100.112
二:新建虚拟接
1 .在新建虚拟机的时候要选择自定义的,而且适配器选择LSI Logic,虚拟硬盘选择SCSI,然后要创建出四块共享磁盘,且这四块磁盘的SCSI线不能和本地硬盘的SCSI在同条线上,在independent->persistent 中设置选择1:X即可,其中四块盘分别为:Voting磁盘(表决磁盘,管理节点成员信息和校验,及时发现是否有节点宕机了,解决Split brain闹裂问题)、OCR disk(oracle cluster registry是很重要的,该盘主要包含了集群数据库配置信息及由集群软件管理的进程信息等,主要是记录了每个节点的相关信息,而且该盘是由CRSD服务来管理的)、ASMdisk1(存放数据文件,控制文件和日志文件的)、ASMdisk2(存放闪回区数据)。
并且设置eht0为bridged模式,然后再加一块网卡,用作两台虚拟机之间的通信,选择方式为host-only.
2. 安装RHEL 5.4,在安装的过程中注意要将开发,服务器,基本系统等包都安装上包括他们所有的小包,以防装ORACLE时出问题。在这过程中只需配置eth0和eth1(node1-priv),node1-vip在装集群软件的时候配置。
安装好之后,编辑Red Hat Linux.vmx,添加下面一段,可以使那四个盘真正的作为共享盘:
disk.locking = “false”
disklib.dataCacheMaxSize = “0”
disklib.dataCacheMaxReadAheadSize = “0”
disklib.dataCacheMinReadAheadSize = “0”
disklib.dataCachePageSize = “4096”
disklib.maxUnsyncedWrites = “0”
scsi1:1.deviceType = “disk”
scsi1:2.deviceType = “disk”
scsi1:3.deviceType = “disk”
scsi1:4.deviceType = “disk
3. 对系统进行配置,在/etc/hosts文件中增加两个节点的node/,node-vip,node-priv相对应的IP地址。
4. 修改系统的内核参数:
#vim /etc/sysctl.conf(加上如下一段)
#vim /etc/sysctl.conf(加上如下一段)
Kernel.shmall = 2097152
Kernel.shmmax = 536870912
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 = 1048576
Net.core.rmem_max = 1048576
Net.core.wmem_default = 262144
Net.core.wmem_max = 262144
#sysctl –p (是该文件生效)
#vim /etc/security/limits.conf(加上如下一段)
Oracle soft nproc 2047
Oracle hard nproc 16384
Oracle soft nofile 1024
Oracle hard nofile 65536
#vim /etc/pam.d/login(加上如下一段)
Session required /lib/security/pam_limits.so
还需在/etc/rc.locl中增加一句,挂起检测时间定时器,检测对方有没有宕机
Modprobe hangcheck-timer hangcheck-tick=30 hangcheck_margin=20
5. 为系统增加oracle用户,增加oinstall组合dba组,
Useradd –m –g oinstall –G dba
修改环境变量 在/home/oracle/.bash_profile中增加:
export TMPDIR=/tmp
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1
export ORACLE_SID=RACDB1
export ORACLE_TERM=xterm
export PATH=$ORACLE_HOME/bin:/usr/bin:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin
export
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
ulimit –u 16384 –n 65536
umask 022
做好一切安装oracle的准备工作,然后将磁盘分区,安装ASM驱动程序包,再配制ASM,创建ASM盘,然后配置RAW,
对于raw的配置,在 /etc/udev/rules.d/60-raw.rules(加上如下一段)
ACTION==”add”,KERNEL==”sdb1”,RUN+=”/bin/raw /dev/raw1 %N”
ACTION==”add”,ENV{MAJOR}==”8”,ENV{MINOR}==”17”,RUN+=”/bin/raw /dev/raw/raw1 %M %m” ( 其中的主设备号可以通过ls –l /dev/sd*查看)
ACTION==”add”,KERNEL==”sdc1”,RUN+=”/bin/raw /dev/raw2 %N”
ACTION==”add”,ENV{MAJOR}==”8”,ENV{MINOR}==”33”,RUN+=”/bin/raw /dev/raw/raw2 %M %m”
KERNEL==”raw[1-2]”,OWNER=”oracle”,GROUP=”oinstall”,MODE=”640”
然后执行start_udev,查看 ls –l ./dev/raw
做好一系列准备工作,可以shutdown –h now然后复制出第二台RAC2
三:复制出第二台虚拟机
1.将复制之后的名称为RAC1的改为RAC2,另外编辑Red Hat Linux.vmx查找文件中的RAC1将它改为RAC2,然后编辑RAC2.vmdk将文件中的RAC1改为RAC2,并且在.vmx中修改scsi0:0.filename= “RAC2.vmdk”,displayName=”RAC2”
打开RAC2,选择CREATE,然后开始配置node2,修改hostname,和/etc/hosts中的hostname,然后配置node2的IP和MAC地址,并将node2的.bash_profile中的ORACLE_SID改成RACDB2。
#mv ifcfg-eth0.bak ifcfg-eth0(因为在crate一台虚拟机的时候会自动生成一个相对应的mac地址)
#mv ifcfg-eth1.bak ifcfg-eth1
全部配置好之后,ping node1,node2,node1-priv,node2-priv,都能ping 通。
2.配置时间同步,在双机中,节点之间的时间同步时很重要的,如果时间不同步会使得集群软件安装不上,而且两边的信息同步很可能因为时间的差异而出现错误的判断。
Node2]# ssh node1
Node1]# service xinetd start
Node1]# chkconfig time-stream on
Node1]# chkconfig xinetd on
Node1]#exit
Node2]#crontab –e
0-59/1 * * * * rdate –s 192.168.100.101
Node2]# > /etc/resolv.conf
Node2]# ssh node1
Node1]# > /etc/resolv.conf
四:配置双机信任关系
Node1]#su – oracle
Node1]$ mkdir .ssh
Node1]$ chmod 700 .ssh
Node1]$ ssh-keygen –t rsa
Node1]$ ssh-keygen -t dsa
Node2]#su – oracle
Node2]$mkdir .ssh
Node2]$chmod 700 .ssh
Node2]$ssh-keygen -t rsa
Node2]$ssh-keygen -t dsa
Node1]$ cat /home/oracle/.ssh/id_rsa.pub >> /home/oracle/.ssh/authorized_keys
Node1]$ cat /home/oracle/.ssh/id_dsa.pub >> /home/oracle/.ssh/authorized_keys
Node1]$ssh node2 cat /home/oracle/.ssh/id_rsa.pub >> /home/oracle/.ssh/authorized_keys(注意在这过程中要确保node1 是第一次ssh node2这样才会将node2的信息永久的记录在know-hosts中,否则可能会造成node1不能直接ssh node2,而node2 可以直接node1)
Node1]$ssh node2 cat /home/oracle/.ssh/id_dsa.pub >> /home/oracle/.ssh/authorized_keys
Node1]$ scp /home/oracle/.ssh/authorized_keys node2:/home/oracle/.ssh/authorized_keys
完成上述过称之后要将node1,node-priv,node2,node2-priv四者之间相互ping,自己也要和自己ping
测试:Node1]$date;ssh node2 date;
五:安装Clusterware软件(在node1中安装)
进入安装目录,先进行安装前的检查,进入cluvfy,然后执行(cluvfy 是用来验证oracle集群的一致性)
Node1]$./runcluvfy.sh stage –pre crsinst -n node1.node2 -verbose(这步除了交换空间外其他都要pass)
接着安装Node1]$/oradisk/clusterware/runInstaller -ignoreSysPreReqs
在安装的过程中要注意:(安装crs的目录为/ u01/app/oracle/product/10.2.0/crs_1/)
1. Specify Network Interface Usage中检查一下eth0和eth1的接口类型有没有反,应该eth0为public,eth1为private
2. 指定Votingdisk配置路径为 /dev/raw/raw1,OCRdisk配置路径为 /dev/raw/raw2
3. 安装过程中最重要的:在node2上用ntpdate 192.168.100.101与node1同步(手工进行且最好是每两三秒同步一次)。
4. 当安装完成即出现要执行两个文件的窗口时,在node1节点上执行两个脚本不会有问题,但在node2节点上执行root.sh脚本时会报错,这时只要在vipca文件中增加unset LD_ASSUME_KERNEL,在srvctl中也增加这句话即可。在执行root.sh脚本的时候主要是在各个节点是启动CRS服务,这里也是最容易出错的地方,其中CRS服务是由root来管理的。当执行完改脚本之后,可以查看CRS服务是否启动了./crsctl check crs,通过/ocrcheck来检查节点是否注册成功。
5. 然后配置VIP,进入CRS目录下的bin文件夹,执行./vipca报错),要先配置oracle interfaces configure,具体操作如下:
Node2]#./oifcfg iflist
Node2]#./oifcfg setif -global eth0/192.168.100.0:public
Node2]#./oifcfg setif -global eth1/19.168.100.0:cluster_interconnect
Node2]#./oifcfg getif
Node2]#./vipca (该项配置过程中注意两个vip的配置,完成之后回到node1上的clusterware安装界面点击ok)
在配置VIP的时候会启动GSD(global service daemo 监听客户端所发生命令请求)、ONS(Oracle Notification Service,oracle通知服务)服务.
6. 在安装到68%左右的时候可能会出现错误,错误为:
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
但是请注意,尽管这看起来像 OUI 中一个严重的错误,但您完全可以将其看作是一个警告而忽略。因为在安装 Oracle 集群件、数据库以及随附 CD 期间,Oracle Universal Installer (OUI) 将首先安装运行该安装程序的本地节点(即 linux1)的软件。然后,将该软件以远程方式复制到集群中的其余节点(即 linux2)。“tar”命令 DOES 确实提取了文件;然而,当您在远程节点上执行文件列表时(使用ls -l),它们将缺少时间字段,直到服务器上的时间大于该文件的时间戳。所以在安装之前请尽可能保证节点时间的一致性!
7. 在完成上述过程之后,Clusterware软件安装成功。进行检测:
通过./crsctl check crs 检查crs服务
./ocrcheck 检查节点是否成功的注册了
Node1]#cd /u01/app/oracle/product/10.2.0/crs_1/bin
Node1]#./crs_stat -t (可以看到有六个)
Node1]#ssh node2
Node2]#cd /u01/app/oracle/product/10.2.0/crs_1/bin
Node2]#./crs_stat -t
Node2]#./crs_stop ora.node2.vip
Node2]#./crs_start ora.node2.vip
Node2]#tail -3 /etc/inittab
Node1]#tail -3 /etc/inittab
8. Clusterware卸载
自动卸载:
$/u01/app/oracle/product/10.2.0/crs_1/install/rootdelete.sh
$/u01/app/oracle/product/10.2.0/crs_1/install/rootdeinstall.sh
手工卸载:
#srvctl stop nodeapps –n node1
#rm -rvf /etc/oracle/*
#rm -rvf /etc/init.d/init.*
#rm -rvf /etc/rc3.d/*.crs
#rm -rvf /etc/rc5.d/*.crs
#cp /etc/inittab.orig /etc/inittab
#rm –rvf /tmp/.oracle/*
#rm –rvf /var/tmp/.oracle/*
#rm -rvf /u01/app/oracle/*
#dd if=/dev/zero of=/dev/Votingdisk bs=1024 count=100000
#dd if=/dev/zero of=/dev/OCRdisk bs=1024 count=100000
#dd if=/dev/zero of=/dev/ASMdisk bs=1024 count=2000000
#dd if=/dev/zero of=/dev/ASMdisk2 bs=1024 count=1300000
#shutdown –r now
如果安装失败了,没有别的办法,只能按照上述步骤依次的卸载,而且一点懒都不能偷,要确保该删除的都删除了,否则下次安装怎么都安装不上,会出现很多错误,这是我安装了N次之后得了教训!!!
六:安装数据库软件
Node1]$./runInstaller –ignoreSysPreReqs
注意要关闭防火墙和selinux,并且是注销后oracle用户登入的。安装路径为:
/u01/app/oracle/product/10.2.0/dbs_1
安装的时候选择集群配置(Cluster configuretiong)并且两个节点都选上,仅仅只安装数据库。
七:配置数据库监听
Node1]$netca
选择两个节点,配置监听器,然后增加一个监听器为TCP协议的,端口为1521.配置完成之后,查看./crs_stat –t 会发现多增了两个.lsnr的服务,并且online。
七:配置ASM
进入ORACLE_HOME/bin
用dbca来建立数据库实例,在创建实例的时候注意,实例名为RACDB,选择用ASM方式来管理文件,创建组RAC_VOLCRP1和FLASH_RECOVEY_AREA存放数据。
创建好之后,执行./crs_stat –t发现多了3个服务,两个为.inst服务和一个.db服务,其中.db服务随便挂在那个node上,总共可以看到13个RAC的管理进程。
到这为止,RAC的基本安装就完成了,但是由于用的是虚拟机,网关不存在,会报错,所以要在每个节点的/crs_1/bin目录下修改racgvip文件,如下:
FAIL_WHEN=DEFAULTGW_NOT_FOUND=0 ------(网关不生效)
DEFAULTGW=192.168.100.101 -----(改Ip为node IP)
八:测试RAC切换
Node2断电,不可使用shutdown –h now,要使用非正常关机,否则不会产生飘移。
Node1]$ /u01/app/oracle/product/10.2.0/crs_1/bin/crs_stat –t (等待时间为1-5分钟就可以看到node2的虚拟IP飘移到了node1上)
Node2上电,再来查看,会看到虚拟IP飘移了回来。
九:RAC启停及警告文件
关闭RAC时,先关闭监听,再关闭实例,然后关服务。
Node1]$ ./crs_stat -t
Node1]$ lsnrctl stop
Node2]$ lsnrctl stop
Node1]$./srvctl status database –d RACDB (查看实例的状态)
Node2]$ ./srvctl stop database -d RACDB –o immediate
Node1]$su – root
Node1]#cd /u01/app/oracle/product/10.2.0/crs_1/bin/
Node1]#./crsctl check crs
Node1]#./crsctl stop crs
Node2]$su – root
Node2]#cd /u01/app/oracle/product/10.2.0/crs_1/bin/
Node2]#./crsctl check crs(查看crs 服务)
Node2]#./crsctl stop crs
开启RAC时,先开启服务,再开实例,然后起监听。
Node1]#cd /u01/app/oracle/product/10.2.0/crs_1/bin
Node1]#./crsctl start crs
Node1]#./crsctl check crs
Node2]#cd /u01/app/oracle/product/10.2.0/crs_1/bin
Node2]#./crsctl start crs
Node2]#./crsctl check crs
Node1]$cd /u01/app/oracle/product/10.2.0/crs_1/bin
Node1]$./srvctl start database -d RACDB
Node1]$ ./srvctl status database -d RACDB
Node1]$ lsnrctl start
Node2]$ lsnrctl start
Node1]$ ./crs_stat -t
Crs警告文件:
Node1]$tail –f /u01/app/oracle/product/10.2.0/crs_1/log/node1/alertnode1.log
ASM警告文件:
Node1]$ tail –f /u01/app/oracle/admin/+ASM/bdump/alert_+ASM1.log
数据库警告文件:
Node1]$tail -f /u01/app/oracle/admin/RACDB/bdump/alert_RACDB1.log
十:RAC常见问题
1.如果crs_stat –t 发现ora.node2.vip的host 竟然是飘到到了node1上,而且这时node2是正常状态,这可能说明node2的实例切换到了node1上,这时可以停止ora.node2.vip,但是如果只用./crs_stop ora.node2.vip会报错(该服务已启动不能停止),这时可以强制关闭强制开启,在node2节点上执行./crs_stop -f ora.node2.vip ./crs_start –f ora.node2.vip
2. 如果在rac环境中如果使用crs_stop -all去停rac服务时,很有可能会出现crs中的一些服务的状态是UNKNOWN,这时我们可以采用两种方法去重新启动crs服务:
一种方法是:转换到root用户下用/etc/init.d/init.crs stop先禁用crs,然后再用/etc/init.d/init.crs start去启用crs,启用crs后会自动启动crs的一系列服务,注意此种方法需要在两台节点上都执行;
另一种:是用crs_stop -f 参数把crs中状态是UNKNOWN的服务关掉,然后再用crs_start -f (加一个-f的参数)启动所有的服务就可以。
3.执行./crsctl check crs经常会出现错误
Failure 1 contacting CSS daemon
Cannot communicate with CRS
Cannot communicate with EVM
这是因为CRS服务没用启动,ps –ef|grep crs(查看服务)
如果CRS没用启动会出现错误:
PRKH-1010 : Unable to communicate with CRS services.
CRS-0184 : cannot communicate with CRS daemons
首先:根据log,看能否找到问题的原因。 如果不能清楚的定位问题。 就只能继续分析。
然后: 根据CRS 启动的顺序来分析 在启动的时候,要先启动ASM 实例, 这里牵涉到存储问题。
(1)网络是否正常
(2)存储是否正常的映射到相关的位置, 我的实验采用的是multipath,将存储映射到/dev/mapper/* 目录下。 在遇到问题的时候,会去检查这个问题是否有相关的映射。
(3)存储的权限问题。 因为映射之后,默认是的root用户。 我在/etc/rc.d/rc.local 文件里添加了改变权限的脚本。 开机启动的时候,就将相关映射文件改成Oracle 用户。
如果这些都正常,没有问题, 可以尝试重启CRS 或者重启操作系统。
如果还是不能重启CRS服务,这时要考虑,是否/tmp/.oracle 或是/vat/tmp/.oracle两个目录引起的,因为每次Server重启的时候,会在这两个文件里存放锁的信息。 当某次重启后,这两个文件不能被删除,就会导致锁不能更新,从而不能启动。由此也理解了,在删除Clusterware的时候,为什么需要删除这2个目录了。
当然出现问题时切记要查看Crs警告文件、ASM警告文件、数据库警告文件,找出问题的原因所在,才能从根本上解决问题。
4.客户端TAF(transparent application failover)配置
a.在服务器(两个节点)上确认listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PL***tProc)
(ORACLE_HOME= /u01/app/....)
(PROGRAM = extproc)
)
)
LISTENER_NODE1=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS =(PROTOCOL =TCP)(HOST =NODE1-VIP)(PORT =1521)(IP =FIRST))
(A DDRESS =(PROTOCOL =TCP)(HOST =NODE1)(PORT =1521)(IP =FIRST))
)
)
b.客服端编辑修改tnsnames.ora
RACDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS =(PROTOCOL =TCP)(HOST =192.168.100.210)(PORT =1521)(IP =FIRST))
(A DDRESS =(PROTOCOL =TCP)(HOST =192.168.100.212)(PORT =1521)(IP =FIRST))
)
(CONNECT_DATA =
(SERVER_NAME = ORADB)
(FAILOVER_MODE =
(TYPE = SELECT)
(MTEHOD =BASIC)
)
)
)
在改文件中,host的ip是节点的VIP的地址,客户端连接的是服务器的VIP。
客户端的测试:
Sqlplus kitty/kitty/racdb
SQL>select failover_type,failover_method,failed_over from v$session where sid=159;
其中failed_over是表示服务器是否进行了切换。
5.修改public ip和vip的方法
首先:修改public IP的方法:
先查看当前的public ip
oifcfg getif
eth0 19.168.100.110global public
删除旧ip
oifcfg delif -global eth0
添加新ip
oifcfg setif –global eth0/19.168.100.111:public
而修改vip的方法为:
查看当前vip信息
srvctl config nodeapps -n node1 -a
srvctl config nodeapps -n node2 -a
停库
srvctl stop database -d dbname
停资源
srvctl stop nodeapps -n node1
srvctl stop nodeapps -n node2
修改vip
srvctl modify nodeapps -n node1 -A newvip/255.255.255.0/eth0
srvctl modify nodeapps -n node2 -A newvip/255.255.255.0/eth0