Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23523
  • 博文数量: 5
  • 博客积分: 100
  • 博客等级: 入伍新兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-14 09:04
文章分类
文章存档

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 ClusterWareOracle clusterware也可以使用经过了RAC认证的第三方集群软件来代替。从逻辑结构上来讲,集群中的每台服务器有一个实例,每台服务器上的实例都对应到同一个数据库。在集群中有两台服务器,每台服务器拥有一个实例,每个实例都访问同一个数据库,数据库存储在共享磁盘上。关于Oracle软件和本地存档日志,既可以存储在本地磁盘上,也可以存储在共享磁盘上,这取决于在安装时选择的存储机制。而客户端首先访问某个实例,让后再通过集群管理软件访问到数据库的数据;节点之间使用内部连接进行通讯。同时为了减少IO的消耗,存在了一个全局缓存服务,因此每一个数据库的instance,都保留了一份相同的数据库cache

下面先介绍RAC的配置步骤,然后讲述RAC配置过程中遇到的问题和解决方法!

RAC的配置步骤:

一:实验规划

1.       平台:

操作系统: RedHat Enterprise Linux Advanced Server 5.0

内存大小: 2048M

交换空间: 2048M

硬盘空间: 10G

网卡配置: 2public IPVitual IP ,Private IP

主机结点:2node1node2

存储设备: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 中设置选择1X即可,其中四块盘分别为:Voting磁盘(表决磁盘,管理节点成员信息和校验,及时发现是否有节点宕机了,解决Split brain闹裂问题)、OCR diskoracle cluster registry是很重要的,该盘主要包含了集群数据库配置信息及由集群软件管理的进程信息等,主要是记录了每个节点的相关信息,而且该盘是由CRSD服务来管理的)、ASMdisk1(存放数据文件,控制文件和日志文件的)、ASMdisk2(存放闪回区数据)

并且设置eht0bridged模式,然后再加一块网卡,用作两台虚拟机之间的通信,选择方式为host-only.

2.  安装RHEL 5.4,在安装的过程中注意要将开发,服务器,基本系统等包都安装上包括他们所有的小包,以防装ORACLE时出问题。在这过程中只需配置eth0eth1node1-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,然后配置node2IPMAC地址,并将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中检查一下eth0eth1的接口类型有没有反,应该eth0publiceth1private

2.       指定Votingdisk配置路径为 /dev/raw/raw1,OCRdisk配置路径为 /dev/raw/raw2

3.       安装过程中最重要的:在node2上用ntpdate 192.168.100.101node1同步(手工进行且最好是每两三秒同步一次)。

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的时候会启动GSDglobal service daemo 监听客户端所发生命令请求)、ONSOracle Notification Serviceoracle通知服务)服务.

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_VOLCRP1FLASH_RECOVEY_AREA存放数据。

创建好之后,执行./crs_stat –t发现多了3个服务,两个为.inst服务和一个.db服务,其中.db服务随便挂在那个node上,总共可以看到13RAC的管理进程。

到这为止,RAC的基本安装就完成了,但是由于用的是虚拟机,网关不存在,会报错,所以要在每个节点的/crs_1/bin目录下修改racgvip文件,如下:

FAIL_WHEN=DEFAULTGW_NOT_FOUND=0  ------(网关不生效)

DEFAULTGW=192.168.100.101    -----(改Ipnode 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.viphost 竟然是飘到到了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)

      )

    )

)

在改文件中,hostip是节点的VIP的地址,客户端连接的是服务器的VIP

客户端的测试:

Sqlplus kitty/kitty/racdb

SQL>select failover_type,failover_method,failed_over from v$session where sid=159;

其中failed_over是表示服务器是否进行了切换。

5.修改public ipvip的方法

首先:修改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

 

 

 

 

 

 

 

阅读(1589) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:RMAN命令

给主人留下些什么吧!~~