1.概述Oracle集群
1.1.什么是Oracle RAC?
Oracle Real Application Cluster (RAC,实时应用集群)用来在集群环境下实现多机共享数据库,以保证应用的高可用性;同时可以自动实现并行处理及负载均衡,并能实现数据库在故障时的容错和无断点恢复。RAC集合了集群软件和存储软件,为用户降低了应用成本。当应用规模需要扩充时,用户可以按需扩展系统,以保证系统的性能。
² 多节点负载均衡
² 提供高可用:故障容错和无缝切换功能,将硬件和软件错误造成的影响最小化
² 通过并行执行技术提高事务响应时间----通常用于数据分析系统
² 通过横向扩展提高每秒交易数和连接数----通常对于联机事务系统
² 节约硬件成本,可以用多个廉价PC服务器代替昂贵的小型机或大型机,同时节约相应维护成本
² 可扩展性好,可以方便添加删除节点,扩展硬件资源。
1.2.集群拓扑结构图
11G RAC结构图
2.集群规划
2.1.1 软件规划
软件名称 |
版本 |
虚拟软件 |
virtualBox 5.1.26 r117224 (Qt5.6.2) |
操作系统 |
Linux 3.10.0-327.el7.x86_64 #1 |
Oracle|Custerware |
12c r2 |
2.2.2 集群网络,文件规划
名称 |
Rac1 |
Rac2 |
公有IP地址(public) |
192.168.2.189 |
192.168.2.199 |
私有IP地址(private) |
192.168.2.100 |
192.168.2.101 |
VIP IP地址 |
10.10.10.10 |
10.10.10.20 |
RAC SID |
Deliora1 |
Deliora2 |
集群实例 |
Deliora |
|
SCN IP |
192.168.2.200 |
|
ASM存储 |
+DATA/+VCR/+ARC/+BACKUP |
3.系统配置
3.1.1 常规配置系统
*每个节点设置IP、主机名、网络服务
*/etc/sysconfig/network
#hostname=rac1.deli.com
或者
hostnamectl set-hostname --static rac1.deli.com(不用重启,需要重新链接)
*关闭防火墙,selinux
*systemctl stop firewalld.service(开机关闭)
*setenfore 0
*网络服务开机启用
3.1.2 配置hosts文件(所有节点)
#RAC1 host 文件
[root@localhost ~]# cat /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#public IP
192.168.2.189 rac1.deli.com delirac1
192.168.2.199 rac2.deli.com delirac2
#private IP
192.168.2.100 rac1-priv.deli.com delirac1-priv
192.168.2.101 rac2-priv.deli.com delirac2-priv
#virtaul IP
10.10.10.10 rac1-vip.deli.com delirac1-vip
10.10.10.20 rac2-vip.deli.com delirac2-vip
#scan IP
192.168.2.200 rac-scan.deli.com delirac-scan
#RAC2 host 文件
[root@localhost ~]# cat /etc/hosts
#127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
#::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
#public IP
192.168.2.189 rac1.deli.com delirac1
192.168.2.199 rac2.deli.com delirac2
#private IP
192.168.2.100 rac1-priv.deli.com delirac1-priv
192.168.2.101 rac2-priv.deli.com delirac2-priv
#virtaul IP
10.10.10.10 rac1-vip.deli.com delirac1-vip
10.10.10.20 rac2-vip.deli.com delirac2-vip
#scan IP
192.168.2.200 rac-scan.deli.com delirac-scan
#结合上面所有的修改,重启系统!(/etc/sysconfig/network)
3.1.3 软件包检测(可忽略,后面检测安装)
# rpm –qa |grep packagename
binutils-2.20.51.0.2-5.11.el6
compat-libcap1-1.10-1
compat-libstdc++-33-3.2.3-69.el6
gcc-4.4.4-13.el6
gcc-c++-4.4.4-13.el6
glibc-2.12-1.7.el6
glibc-devel-2.12-1.7.el6
ksh
libgcc-4.4.4-13.el6
libstdc++-4.4.4-13.el6
libstdc++-devel-4.4.4-13.el6
libaio-0.3.107-10.el6
libaio-devel-0.3.107-10.el6
make-3.81-19.el6
sysstat-9.0.4-11.el6
unixODBC
unixODBC-devel
3.1.4 添加Oracle|grid用户,HOME,目录
3.1.4.1 在每个集群节点创建oracle,grid用户(每个节点)
# groupadd -g 1000 oinstall
# groupadd -g 1020 asmadmin
# groupadd -g 1021 asmdba
# groupadd -g 1022 asmoper
# groupadd -g 1031 dba
# groupadd -g 1032 oper
# useradd oracle -g oinstall -G dba,asmdba,oper -u 501
# useradd grid -g oinstall -G dba,asmdba,asmadmin,asmoper -u 502
3.2在每个集群节点创建所需目录(每个节点)
# mkdir -p /u01/app/11.2.0/grid
# mkdir -p /u01/app/grid
# chown -R grid:oinstall /u01
# mkdir /u01/app/oracle
# chown oracle:oinstall /u01/app/oracle
# chmod -R 775 /u01/
3.3在每个节点赋予oracle,grid账户密码(每个节点)
[root@localhost /]# passwd oracle
Changing password for user oracle.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
[root@localhost /]#
[root@localhost /]#
[root@localhost /]# passwd grid
Changing password for user grid.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
3.1.5 配置Oracle|grid环境变量(所有节点)
#RAC1 ~/.bash_profile(GIRD )
export ORACLE_HOME=/u01/app/11.2.0/product/11.2.0
export ORACLE_SID=+ASM1 --节点2 +ASM2
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#RAC1 ~/.bash_profile(ORACLE)
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0
export ORACLE_SID=deliora1
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#RAC2~/. bash_profile(GIRD )
export ORACLE_HOME=/u01/app/11.2.0/product/11.2.0
export ORACLE_SID=+ASM2 --节点2 +ASM2
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
#RAC2 ~/.bash_profile(ORACLE)
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0
export ORACLE_SID=deliora2
export PATH=$PATH:$ORACLE_HOME/bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
3.1.6 配置Linux内核参数(所有节点)
# vi /etc/sysctl.conf
fs.aio-max-nr = 1048576
fs.file-max = 6815744
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
kernel.sem = 250 32000 100 128
kernel.shmall = 9961472
kernel.shmmax = 1610612736 #最大1.5G
kernel.shmmni = 4096
生效
# sysctl –p
参数 |
解释 |
fs.aio-max-nr = 1048576 |
同时可以拥有的的异步IO请求数目 1024K个 |
fs.file-max = 6815744 |
系统中所允许的文件句柄最大数目 6.5M |
kernel.shmall =9961472 --(主) kernel.shmall =6291456 --(备) |
Total amount of shared memory 总的可用共享内存,单位为page(4K字节) 主库设置为38G 备库设置为 24G |
kernel.shmmax =40802189312 --(主) kernel.shmmax =25769803776 --(备) |
Maximum size of shared shmmax(bytes) = shmmni(page size, default 4k) * shmall (page的个数)
最大共享内存段大小,单位为字节, 主库设置为38G 备库设置为24G |
kernel.shmmni =4096 |
Maximum number of shared memory 共享内存段的最大数量 默认值 |
kernel.sem =250 32000 100 128 |
设置运行的信号量个数,分别对应: SEMMSL:每组信号量的最大信号个数 SEMMNS:整个系统内存的信号量的最大个数 SEMOPM:每组操作最大信号量个数 SEMMNI:整个系统最大信号标记数 取默认值 |
net.ipv4.ip_local_port_range = 9000 65500 |
端口使用范围 |
net.core.rmem_default = 262144 |
TCP数据接收缓存默认大小 |
net.core.rmem_max = 4194304 |
TCP数据接收缓存最大值 |
net.core.wmem_default = 262144 |
TCP数据发送缓冲默认大小 |
net.core.wmem_max = 1048586 |
TCP数据发送缓冲最大值 |
3.1.7 配置shell限制(所有几点)
# vi /etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
oracle soft stack 10240
grid soft nproc 2047
grid hard nproc 16384
grid soft nofile 1024
grid hard nofile 65536
grid soft stack 10240
3.1.8 配置/dev/shm参数(所有节点)
# /etc/fstab就是在开机引导的时候自动挂载到linux的文件系统
#vi /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=5g 0 0
备注说明: /dev/shm/是linux下一个非常有用的目录,采用的是tmpfs。因为这个目录不在硬盘上,而是在内存里。默认大小为内存大小的一半,tmpfs 可以使用RAM,但它也可以使用您的交换分区来存储。
3.1.9 关闭NTP及端口范围参数
Oracle建议使用Oracle Cluster Time Synchronization Service,因此关闭删除NTP
# /sbin/service ntpd stop
# chkconfig ntpd off
# mv /etc/ntp.conf /etc/ntp.conf.bak
# 重启网络
# /etc/rc.d/init.d/network restart
或者
# service network restart
3.2.0 配置Oracle|grid用户ssh等效性
#RAC1 GRID用户配置
mkdir .ssh
chmod 700 .ssh/
cd .ssh/
ssh-keygen -t rsa
cat *.pub >> authorized_keys
rm -rf ./*.pub
执行以上步骤生成了authorized_keys文件,现在需要把其他节点的*.pub文件传送到RAC1,然后合并文件,最后生成的authorized_keys文件下发到每个节点。
#RAC2 GRID用户配置
mkdir .ssh
chmod 700 .ssh/
cd .ssh/
ssh-keygen -t rsa
scp *.pub grid@192.168.2.189:/home/grid/.ssh/ #传送到RAC1
#RAC1 GRID用户配置
cat *.pub >> authorized_keys
scp authorized_keys grid@192.168.2.199:/home/grid/.ssh/
#把RAC2节点的*.pub追加至authorized_keys,因为我这里只有两个节点所以已经OK,现在把authorized_keys下发到RAC2,需要注意所有节点需要删除*.pub的文件。
#RAC2 GRID用户配置
rm -rf ./*.pub
以上已完成grid用户的ssh等效性,以同样的方式配置Oracle用户的等效性~
3.2.1 验证ssh等效性
#RAC1 Oracle
[oracle@rac1 .ssh]$ ssh delirac1 date
[oracle@rac1 .ssh]$ ssh delirac2 date
[oracle@rac1 .ssh]$ ssh delirac1-vip date
[oracle@rac1 .ssh]$ ssh delirac2-vip date
#RAC2 Oracle
[oracle@rac2 .ssh]$ ssh delirac1 date
Fri Sep 28 17:12:03 CST 2018
[oracle@rac2 .ssh]$ ssh delirac2 date
Fri Sep 28 17:12:06 CST 2018
[oracle@rac2 .ssh]$ ssh delirac1-vip date
Fri Sep 28 17:12:09 CST 2018
[oracle@rac2 .ssh]$ ssh delirac2-vip date
Fri Sep 28 17:12:15 CST 2018
以上已完成Oracle用户的ssh等效性验证,以同样的方式测试grid用户的等效性~
3.2.2 配置ASM存储
3.2.2.1 规划ASM磁盘组
官方文档中规定了不同冗余策略下OCR、Voting Disk、Database和Recovery所需求的大小。
因为这里是测试环境,所以这里有sdb 8g,sdc 5g 分别作为OCR和DATA磁盘组。
3.2.2.2 配置ASM磁盘
这里需要说明一下,配置ASM磁盘有两种asmlib和裸设备(裸设备和块设备)。前者用的比较少几乎不用,所以这里只介绍后者。裸设备配置ASM磁盘分本地共享磁盘(udev)和网络iscsi 存储配置(一般有第三方的存储软件)udev + multipath 方式来配置。
获取iscsi_id 在virtualBox和VMware不一样。前者通过:/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdc,后者直接scsi_id --whitelisted --replace-whitespace --device=/dev/sdc(前提是修改了虚拟机vmx文件中添加disk.EnableUUID = "TRUE")
n 使用命令查看所有的块设备 ls -l /dev/sd*(所有节点)
[root@rac1 multipath]# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
1ATA_VBOX_HARDDISK_VB921c6ad1-c9485179
[root@rac1 multipath]# /lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sdc
1ATA_VBOX_HARDDISK_VB5964a173-24bde291
n 修改udev rule文件(RAC每个节点都需要执行)
for i in b c;
do
echo "KERNEL==\"sd*\", BUS==\"scsi\", PROGRAM==\"/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/\$name\", RESULT==\"`/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/sd$i`\", NAME=\"asm-disk$i\", OWNER=\"grid\", GROUP=\"asmadmin\", MODE=\"0660\"" >> /etc/udev/rules.d/99-oracle-asmdevices.rules
done
[root@rac1 multipath]# cat /etc/udev/rules.d/99-oracle-asmdevices.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB921c6ad1-c9485179", NAME="asm-diskb", OWNER="grid", GROUP="asmadmin", MODE="0660"
KERNEL=="sd*", BUS=="scsi", PROGRAM=="/lib/udev/scsi_id --whitelisted --replace-whitespace --device=/dev/$name", RESULT=="1ATA_VBOX_HARDDISK_VB5964a173-24bde291", NAME="asm-diskc", OWNER="grid", GROUP="asmadmin", MODE="0660"
启动:/sbin/start_udev
n 查看ASM磁盘ll /dev/asm-*