部署 Oracle RAC
青云QingCloud 所提供的 Virtual SAN 其比较典型的应用场景为 Oracle RAC。以下介绍如何在 青云QingCloud 上部署此服务。
Oracle RAC 部署拓扑
一个典型的 Oracle RAC 由多个数据库节点和共享硬盘组成。DB 客户端使用 scan-cluster 域名访问数据,负载均衡由 Oracle 自己控制。
安装前准备
-
云服务器
-
基于 Oracle Linux 6.6 镜像
-
其中两台(node1, node2)作为 oracle 数据库节点,至少 2 核 8G
-
加入连接了路由器的私有网络
-
说明 |
---|
本文为了简化部署拓扑,只使用两个节点。请根据自己的项目需求决定数据库节点数量。 |
-
性能型硬盘
-
4 块通过 Virtual SAN 提供共享存储, 用于部署数据库,具体大小看业务需求
-
1 块用于存放安装文件,大小 10G
-
-
Oracle 安装文件
网络配置
Oracle RAC 需要云服务器加入两个网络,分别用于对外提供服务,和对内数据同步。在青云可以让云服务器同时加入受管,和自管私有网络来满足这个要求。
网络规划
节点 | 受管网络地址 | 自管网络地址 | VIP |
---|---|---|---|
node1 |
192.168.100.2 |
172.16.100.2 |
192.168.100.102 |
node2 |
192.168.100.3 |
172.16.100.3 |
192.168.100.103 |
scan-cluster IP |
192.168.100.210 |
n/a |
n/a |
其中scan-cluster IP 并不是云服务器,只是一个配置了 DNS 域名解析的 IP 地址,作用类似 VIP。在这个例子里面,我们把 Oracle RAC 的域名定为“scan-cluster.localdomain”, 您需要把它替换成适合自己的名字。
由于需要预留一些 IP 段,请修改路由器 DHCP 配置,减少自动分配的 IP 段。具体操作是:
-
打开青云路由器
-
点击“关闭 DHCP 服务”,并再次启动
-
弹出对话框如图。把254改成100, 然后提交
说明 这里推荐修改 DHCP 服务范围为 2~100 是为了方便配置数据库节点的 VIP, 比如 192.168.100.3 对应的 VIP 可以是 192.168.100.103。
配置云服务器网络和地址
用户需要在青云中做如下操作:
-
云服务器 node1 和 node2 加入连接了路由器的受管私有网络(通常这一步创建云服务器时已经完成)。
-
点击私有网络–创建, 在对话框中点击高级选项 ,选择“自管”,创建一个新的自管网络。
-
右击私有网络–添加云服务器。把两个云服务器加到自管网络中。
加入所需的网络后,需要到云服务器的桌面上配置下自管网络的 IP 地址。
说明 |
---|
|
配置私网 DNS 域名
Oracle RAC 对外提供的地址是 scan-cluster 域名,Oracle 会管理 scan-cluster IP 地址,但是要求它能被 DNS 解析。青云路由器提供了私网 DNS 功能,可以方便地在私网里面定义 DNS 记录,用于配置 scan-cluster 域名。
启动私网DNS,并为scan-cluster和每个节点定义私网域名。
说明 |
---|
其中i-xjrahmmp和i-bxjv3vop是node1和node2的机器名。如果需要用自定义的机器名,请使用 [*](#id7).localdomain的格式,比如: node1.localdomain |
应用路由器修改后,如果是第一次启用私网 DNS 功能,需要等待一会儿,或者重启 network-manager 服务,让云服务器从 DHCP 更新 DNS 服务器 IP 地址,然后到node1/node2上面测试 DNS 记录是否可用:
# yum install bind-utils -y
# nslookup 192.168.100.210
Server: 192.168.100.200#53
Address: 192.168.100.200#53
210.100.168.192.in-addr.arpa name = scan-cluster.localdomain.
# nslookup scan-cluster.localdomain
Server: 192.168.100.200
Address: 192.168.100.200#53
Name: scan-cluster.localdomain
Address: 192.168.100.210
修改 /etc/hosts
Grid安装包会从 /etc/hosts
里面找当前节点名字,在 /etc/hosts
文件的 127.0.0.1
这一行结尾添加云服务器名字,比如i-xjrahmmp i-xjrahmmp.localdomain
修改后,内容如下:
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 i-xjrahmmp i-xjrahmmp.localdomain
创建用户、修改用户配置文件
配置用户 配置 RAC 的时候需要安装 Oracle grid infrastructure、Oracle 数据库软件、其中 grid 是一个集群件,需要共享存储。oracle建议以不同的用户分别安装 grid 和数据库软件,这里以 grid 用户安装 grid 软件、oracle 用户安装 oracle 数据库软件。并且 grid、oracle 用户需要属于不同的用户组。在配置 rac 时,还要求这两个用户在不同的节点上 uid、gid 要一致。
-
在两个节点分别运行以下命令:
GRID_PW=grid ORACLE_PW=oracle groupadd -g 1000 oinstall groupadd -g 1200 asmadmin groupadd -g 1201 asmdba groupadd -g 1202 asmoper useradd -u 1100 -g oinstall -G asmadmin,asmdba,asmoper -d /home/grid -s /bin/bash -c "grid Infrastructure Owner" grid echo "$GRID_PW" | passwd --stdin grid echo 'export PS1="`/bin/hostname -s`-> "'>> /home/grid/.bash_profile echo "export TMP=/tmp">> /home/grid/.bash_profile echo 'export TMPDIR=$TMP'>>/home/grid/.bash_profile echo "export ORACLE_SID=+ASM1">> /home/grid/.bash_profile echo "export ORACLE_BASE=/u01/app/grid">> /home/grid/.bash_profile echo "export ORACLE_HOME=/u01/app/11.2.0/grid">> /home/grid/.bash_profile echo "export ORACLE_TERM=xterm">> /home/grid/.bash_profile echo "export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'" >> /home/grid/.bash_profile echo 'export TNS_ADMIN=$ORACLE_HOME/network/admin' >> /home/grid/.bash_profile echo 'export PATH=/usr/sbin:$PATH'>> /home/grid/.bash_profile echo 'export PATH=$ORACLE_HOME/bin:$PATH'>> /home/grid/.bash_profile echo 'export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib'>> /home/grid/.bash_profile echo 'export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib'>> /home/grid/.bash_profile echo "export EDITOR=vi" >> /home/grid/.bash_profile echo "export LANG=en_US" >> /home/grid/.bash_profile echo "export NLS_LANG=american_america.AL32UTF8" >> /home/grid/.bash_profile echo "umask 022">> /home/grid/.bash_profile groupadd -g 1300 dba groupadd -g 1301 oper useradd -u 1101 -g oinstall -G dba,oper,asmdba -d /home/oracle -s /bin/bash -c "Oracle Software Owner" oracle echo "$ORACLE_PW" | passwd --stdin oracle echo 'export PS1="`/bin/hostname -s`-> "'>> /home/oracle/.bash_profile echo "export TMP=/tmp">> /home/oracle/.bash_profile echo 'export TMPDIR=$TMP'>>/home/oracle/.bash_profile echo "export ORACLE_HOSTNAME=node1.localdomain">> /home/oracle/.bash_profile echo "export ORACLE_SID=devdb1">> /home/oracle/.bash_profile echo "export ORACLE_BASE=/u01/app/oracle">> /home/oracle/.bash_profile echo 'export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1'>> /home/oracle/.bash_profile echo "export ORACLE_UNQNAME=devdb">> /home/oracle/.bash_profile echo 'export TNS_ADMIN=$ORACLE_HOME/network/admin' >> /home/oracle/.bash_profile echo "export ORACLE_TERM=xterm">> /home/oracle/.bash_profile echo 'export PATH=/usr/sbin:$PATH'>> /home/oracle/.bash_profile echo 'export PATH=$ORACLE_HOME/bin:$PATH'>> /home/oracle/.bash_profile echo 'export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib'>> /home/oracle/.bash_profile echo 'export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib'>> /home/oracle/.bash_profile echo "export EDITOR=vi" >> /home/oracle/.bash_profile echo "export LANG=en_US" >> /home/oracle/.bash_profile echo "export NLS_LANG=american_america.AL32UTF8" >> /home/oracle/.bash_profile echo "export NLS_DATE_FORMAT='yyyy/mm/dd hh24:mi:ss'" >> /home/oracle/.bash_profile echo "umask 022">> /home/oracle/.bash_profile id grid id oracle
说明 生成环境请修改代码中的密码。
-
脚本执行后会输出 uid/gid, 请比较两个节点,看是否如下:
uid=1100(grid) gid=1000(oinstall) groups=1000(oinstall),1200(asmadmin),1201(asmdba),1202(asmoper) uid=1101(oracle) gid=1000(oinstall) groups=1000(oinstall),1201(asmdba),1300(dba),1301(oper)
-
创建软件安装目录、改权限,在两个节点分别运行以下命令。
mkdir -p /u01/app/grid mkdir -p /u01/app/11.2.0/grid mkdir -p /u01/app/oracle chown -R oracle:oinstall /u01 chown -R grid:oinstall /u01/app/grid chown -R grid:oinstall /u01/app/11.2.0 chmod -R 775 /u01
-
修改 /etc/security/limits.conf,在两个节点分别运行以下命令。
cp /etc/security/limits.conf /etc/security/limits.conf.bak echo "oracle soft nproc 2047" >>/etc/security/limits.conf echo "oracle hard nproc 16384" >>/etc/security/limits.conf echo "oracle soft nofile 1024" >>/etc/security/limits.conf echo "oracle hard nofile 65536" >>/etc/security/limits.conf echo "grid soft nproc 2047" >>/etc/security/limits.conf echo "grid hard nproc 16384" >>/etc/security/limits.conf echo "grid soft nofile 1024" >>/etc/security/limits.conf echo "grid hard nofile 65536" >>/etc/security/limits.conf
-
修改 /etc/pam.d/login 配置文件,在两个节点分别运行以下命令。
cp /etc/pam.d/login /etc/pam.d/login.bak echo "session required /lib/security/pam_limits.so" >>/etc/pam.d/login echo "session required pam_limits.so" >>/etc/pam.d/login
-
修改 /etc/profile 文件,在两个节点分别运行以下命令
cp /etc/profile /etc/profile.bak echo 'if [ $USER = "oracle" ]||[ $USER = "grid" ]; then' >> /etc/profile echo 'if [ $SHELL = "/bin/ksh" ]; then' >> /etc/profile echo 'ulimit -p 16384' >> /etc/profile echo 'ulimit -n 65536' >> /etc/profile echo 'else' >> /etc/profile echo 'ulimit -u 16384 -n 65536' >> /etc/profile echo 'fi' >> /etc/profile echo 'fi' >> /etc/profile
-
修改内核配置文件,在两个节点分别运行以下命令。
cp /etc/sysctl.conf /etc/sysctl.conf.bak echo "fs.aio-max-nr = 1048576" >> /etc/sysctl.conf echo "fs.file-max = 6815744" >> /etc/sysctl.conf echo "kernel.shmall = 2097152" >> /etc/sysctl.conf echo "kernel.shmmax = 1054472192" >> /etc/sysctl.conf echo "kernel.shmmni = 4096" >> /etc/sysctl.conf echo "kernel.sem = 250 32000 100 128" >> /etc/sysctl.conf echo "net.ipv4.ip_local_port_range = 9000 65500" >> /etc/sysctl.conf echo "net.core.rmem_default = 262144" >> /etc/sysctl.conf echo "net.core.rmem_max = 4194304" >> /etc/sysctl.conf echo "net.core.wmem_default = 262144" >> /etc/sysctl.conf echo "net.core.wmem_max = 1048586" >> /etc/sysctl.conf echo "net.ipv4.tcp_wmem = 262144 262144 262144" >> /etc/sysctl.conf echo "net.ipv4.tcp_rmem = 4194304 4194304 4194304" >> /etc/sysctl.conf sysctl -p
-
停止 NTP 服务,否则安装的时候检查环境会通不过,在两个节点分别运行以下命令。
service ntpd stop chkconfig ntpd off rm -f /etc/ntp.conf
-
配置 oracle grid 用户 ssh 的对等性,即在 grid 和 oracle 用户下创建密钥,上传公钥,两个用户的节点间互访都不需要密码,具体操作自行处理。请分别以 grid 和 oracle 用户运行下面命令。
sed -i 's/UserKnownHostsFile \/dev\/null//g' /etc/ssh/ssh_config sed -i 's/StrictHostKeyChecking no/StrictHostKeyChecking ask/g' /etc/ssh/ssh_config ssh-keygen -N "" -f ~/.ssh/id_rsa ssh-keygen -N "" -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub cat ~/.ssh/id_rsa.pub
此处需要手动把生成的公钥都加到 node1/node2 的 ~/.ssh/authorized_keys 里面,再分别到 node1 和 node2 以 grid 和 oracle 用户执行下面命令。
INSTANCE_ID_NODE1=i-xjrahmmp INSTANCE_ID_NODE2=i-bxjv3vop ssh $INSTANCE_ID_NODE1 date ssh $INSTANCE_ID_NODE2 date ssh $INSTANCE_ID_NODE1.localdomain date ssh $INSTANCE_ID_NODE2.localdomain date ssh node1-priv date ssh node2-priv date ssh node1-priv.localdomain date ssh node2-priv.localdomain date
说明 请替换里面的
i-xjrahmmp
和i-bxjv3vop
为 node1node2 的云服务器 id。node1 除了信任 node2, 还要信任自己,反之也是。请多次运行以上命令,直到能正确返回时间,并且不再提示 “RSA key fingerprint…Are you sure you want…”
存储配置
本例共需要 5 块性能型硬盘,1 块本地硬盘用于存储数据库安装文件,4 块共享存储。对应本地硬盘,请挂载到 node1 上面,并拷贝和解压安装文件。
说明 |
---|
对于您具体需要多少块共享硬盘,和具体的大小,请咨询 dba. |
-
创建并挂载共享存储。将 4 块硬盘全部加载到 node1 和 node2 , 然后把那块本地硬盘挂到 node1。挂完之后,node1 应该是这样子(其中 vdc 是本地硬盘)。
# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 10G 0 disk sdb 8:16 0 10G 0 disk sdc 8:32 0 10G 0 disk sdd 8:48 0 10G 0 disk vda 251:0 0 20G 0 disk └─vda1 251:1 0 20G 0 part / vdb 251:16 0 8G 0 disk [SWAP] vdc 251:32 0 10G 0 disk └─vdc1 251:33 0 10G 0 part
-
运行下面命令创建配置文件
99-oracle-asmdevices.rules
echo "options=--whitelisted --replace-whitespace">/etc/scsi_id.config rm -f /etc/udev/rules.d/99-oracle-asmdevices.rules i=1 id='' for x in a b c d do id=`scsi_id --whitelisted --replace-whitespace --device=/dev/sd$x` echo "KERNEL==\"sd*\", SUBSYSTEM==\"block\", PROGRAM==\"/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"$id\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\"">>/etc/udev/rules.d/99-oracle-asmdevices.rules let i++ done /sbin/start_udev
以上代码中,
a b c d
代表加载的共享硬盘 sda ~ sdd 。请根据实际情况修改。硬盘必须是新硬盘(无分区,没有被格式化),否则 Grid 无法安装。 -
检查udev是否正常配置
# ll /dev/asm* brw-rw---- 1 grid asmadmin 8, 48 3月 12 21:15 /dev/asm-disk1 brw-rw---- 1 grid asmadmin 8, 16 3月 12 21:20 /dev/asm-disk2 brw-rw---- 1 grid asmadmin 8, 32 3月 12 21:20 /dev/asm-disk3 brw-rw---- 1 grid asmadmin 8, 48 3月 12 21:20 /dev/asm-disk4
-
安装依赖包
yum install -y sysstat libstdc++-devel libaio-devel gcc-c++ compat-libstdc++-33 elfutils-libelf-devel smartmontools compat-libcap1 ksh nfs-utils
-
环境准备结束,可以开始安装软件了。
安装 Oracle 软件
请把安装文件下载并解压到 node1 的 /mnt/vdc 目录。
[root@i-xjrahmmp vdc]# ll
total 4531520
drwxr-xr-x 7 root root 4096 7月 7 2014 database
drwxr-xr-x 7 root root 4096 6月 10 2013 grid
-rw-r--r-- 1 root root 1361028723 3月 12 11:51 linuxamd64_12c_database_1of2.zip
-rw-r--r-- 1 root root 1116527103 3月 12 11:37 linuxamd64_12c_database_2of2.zip
-rw-r--r-- 1 root root 1750478910 3月 11 19:52 linuxamd64_12c_grid_1of2.zip
-rw-r--r-- 1 root root 201673595 3月 11 19:52 linuxamd64_12c_grid_2of2.zip
drwx------ 2 root root 16384 3月 11 19:38 lost+found
安装前预检查配置信息
oracle grid infrastructure 提供了一个脚本,检查,并修复环境问题。
-
在 node1 执行下面命令(请替换 i-xjrahmmp,i-bxjv3vop 为实际用的 instance id )。
su - grid cd /mnt/vdc/grid ./runcluvfy.sh stage -pre crsinst -n i-xjrahmmp,i-bxjv3vop -fixup -verbose
-
通常会检查出一些问题,oracle 会自动提供修复脚本,例如修复用户组,内核参数等。
若出现以下提示:
Press ENTER key to continue after execution of "/tmp/CVU_12.1.0.1.0_grid/runfixup.sh" has completed on nodes "i-xjrahmmp,i-bxjv3vop"
表示需要以 root 用户在节点
i-xjrahmmp
,i-bxjv3vop
上面运行/tmp/CVU_12.1.0.1.0_grid/runfixup.sh
。 运行完成后,回到这个 terminal, 按回车键。 -
修复完后再次检查,如果还是有问题,请自行查看是否有 fail 的地方,并自行解决。
安装 Grid Infrastructure
从此步骤开始正式安装 Grid 软件,请使用青云的 web terminal 登录 node1 的桌面,执行以下安装步骤。
-
以 grid 用户登录图形界面,执行
grid/runInstaller
进入 OUI 图形安装界面。请按以下截图选择: -
由于 Grid 安装包从 /etc/hosts 中读取本地节点 (Local node) 名字,跟系统设置可能不匹配。如果提示
[INS-40907] Local node not included in the list of host names for grid installation
错误,请检查是否完成了本文修改 /etc/hosts 一节所需的配置后,在进行如下步骤。 -
如果 VSAN 挂载的硬盘已经被分区或者格式化,Grid 安装包会忽略所有 VSAN 的硬盘,导致硬盘列表里面不显示硬盘。请确保挂载的硬盘都是新硬盘。
-
当前步骤会再次检查环境。若发现问题,点击 fix & check again 按钮,根据提示在两个节点上面用 root 运行一个脚本后,重新检查环境。
说明 grid 安装环境检查脚本在 Oracle Linux 6 上面的一个 bug 导致错误
PRVF-9802
无法解决,具体原因请见 [Debug Cluvfy error ERROR: PRVF-9802](http://www.hhutzler.de/blog/debug-cluvfy-error-error-prvf-9802/) 。 -
为了继续安装,需勾选 Ingore All 忽略当前错误,进行下一步。
-
安装到 79% 时,会提示以 root 用户到两个节点运行脚本。此时必须从 node1 开始执行,全部执行完后,然后再去 node2 执行。
说明 第二个脚本需要十多分钟的执行时间,请耐心等待。
-
脚本执行完成后,到安装界面继续并完成安装。安装完成后,以 grid 用户运行下面命令确认集群已启动。
-> crs_stat -t Name Type Target State Host ------------------------------------------------------------ ora....SM.lsnr ora....er.type ONLINE ONLINE i-bxjv3vop ora.DATA.dg ora....up.type ONLINE ONLINE i-xjrahmmp ora....ER.lsnr ora....er.type ONLINE ONLINE i-bxjv3vop ora....N1.lsnr ora....er.type ONLINE ONLINE i-xjrahmmp ora.MGMTLSNR ora....nr.type ONLINE ONLINE i-xjrahmmp ora.asm ora.asm.type ONLINE ONLINE i-xjrahmmp ora.cvu ora.cvu.type ONLINE ONLINE i-xjrahmmp ora....OP.lsnr application ONLINE ONLINE i-bxjv3vop ora....vop.ons application ONLINE ONLINE i-bxjv3vop ora....vop.vip ora....t1.type ONLINE ONLINE i-bxjv3vop ora....MP.lsnr application ONLINE ONLINE i-xjrahmmp ora....mmp.ons application ONLINE ONLINE i-xjrahmmp ora....mmp.vip ora....t1.type ONLINE ONLINE i-xjrahmmp ora.mgmtdb ora....db.type ONLINE ONLINE i-xjrahmmp ora....network ora....rk.type ONLINE ONLINE i-bxjv3vop ora.oc4j ora.oc4j.type ONLINE ONLINE i-xjrahmmp ora.ons ora.ons.type ONLINE ONLINE i-bxjv3vop ora.proxy_advm ora....vm.type ONLINE OFFLINE ora.scan1.vip ora....ip.type ONLINE ONLINE i-xjrahmmp
说明 在 12c 版本中, ora.proxy_advm 被用到时才会启动,所以安装完显示为 OFFLINE ,并不代表出了问题。
安装 oracle 数据库软件
-
以 oracle 用户登录,执行 database/runInstaller 进入图形安装界面。
-
开始安装,根据提示用 root 用户身份,在两个节点执行相应的脚本,执行完后结束安装。
创建 asm 磁盘组
以 grid 用户创建 asm 磁盘组,创建的磁盘组为 Oracle 数据库提供存储。
-
以 grid 用户登录图形界面,执行 asmca。
-
Disk Groups ,Create 创建新的磁盘组。
-
输入名称 G1,冗余选 external,磁盘选择 asm-disk3。
-
继续创建磁盘组,名称 FLASH,冗余选 external,磁盘选 asm-disk4。
-
至此,3 个磁盘组全部被 RAC mount。
创建 rac 数据库
-
以 oracle 用户登录图形界面,执行 dbca ,进入 DBCA 图形界面:
-
下一步,选中创建 sample schema,后续步骤全部保持默认即可,完成数据库创建。
测试数据库是否正常
使用 oracle 用户运行 sqlplus 连接数据库。输入用户名(system)和安装时定义的密码后,进入 sql terminal 。通过输入 sql 语句,以验证数据库是否正常。
+
SQL> CREATE TABLE users;
(
user_id varchar(255) PRIMARY KEY NOT NULL,
user_name varchar(255) NOT NULL
); 2 3 4 5
Table created.
SQL> drop table users;
Table dropped.