Oracle10gR2 RAC实时应用集群(三)在Redhat Enterprise Linux5 x86_64下的集群(RAW+ASM篇)

时间:2021-09-25 08:19:03

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;