database's docs

3.4.0 RAC-系统配置


1. 系统配置

1) oracle rac database 11g r2 需要的环境包

yum groupinstall base core -y
yum install -y cloog-ppl libXxf86misc compat-libcap1 libXxf86vm compat-libstdc++-33 libaio-devel cpp libdmx gcc libstdc++-devel gcc-c++ mpfr glibc-devel make glibc-headers ppl kernel-headers xorg-x11-utils libXmu xorg-x11-xauth libXt libXv ksh libXxf86dga

2) 关闭selinux

setenforce 0
vim /etc/selinux/config
******************************************************
SELINUX=disabled
******************************************************

3) 防火墙配置

vim /etc/sysconfig/iptables
******************************************************
# Generated by iptables-save v1.4.7 on Fri Dec 23 09:17:06 2016
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [25:2660]
# 允许public网络每个节点的ip通过bond0连接
-A INPUT -s 172.168.33.103/32 -i bond0 -j ACCEPT
-A INPUT -s 172.168.33.104/32 -i bond0 -j ACCEPT
# 允许private网络每个节点的网卡设备的所有连接
-A INPUT -i eth3 -j ACCEPT
-A INPUT -i eth4 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
# 允许private网段到Oracle's Multicast address IPs: 230.0.1.0 and 224.0.0.251的连接
-A INPUT -s 172.16.44.0/24 -d 230.0.1.0 -j ACCEPT
-A INPUT -s 172.16.48.0/24 -d 224.0.0.251 -j ACCEPT
-A INPUT -s 172.16.44.0/24 -d 230.0.1.0 -j ACCEPT
-A INPUT -s 172.16.48.0/24 -d 224.0.0.251 -j ACCEPT
# 允许bond0到Oracle's Multicast address IPs: 230.0.1.0 and 224.0.0.251的连接
-A INPUT -i bond0 -d 230.0.1.0 -j ACCEPT
-A INPUT -i bond0 -d 224.0.0.251 -j ACCEPT
# 允许ssh/https端口
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
# Enable Oracle SCAN Listener Port 1521 for Oracle DB client access
-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.33.121 --dport 1521 -j ACCEPT
# Enable Oracle Enterprise Manager 11g Port 1158 for Oracle DB client access
-A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.33.121 --dport 1158 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
******************************************************

ORACLE MULTICAST ADDRESS DOC

4) 设置虚拟内存

需要调节内核的5个参数来调优虚拟内存,虚拟内存被用于oracle rac集群内部。特别需要注意的是,以下推荐的值只是调优的一个起点。

以下是虚拟内存调优参数的简单介绍和建议值:

  • SWAPPINESS,值范围在0-100,代表了系统的swaps级别,高值,倾向于系统性能,会在内存不活动时主动的将其传输出物理内存暂存起来。低值,倾向于交互性,会尽可能的延长数据在内存中的时间,来降低访问的延时。默认值是60,oracle推荐设置为0
  • DIRTY DATA,代表了已经被修改,为了性能保存在页缓存中的数据,一旦此数据被写入硬盘中,转换为clean data。
  • DIRTY_RATIO,包含占系统总内存的百分比,即生成磁盘写入的进程它会开始写出脏数据的页面数。 默认值为20,推荐值为80。
  • DIRTY_BACKGROUND_RATIO,包含占系统总内存的百分比,即后台写回服务它会开始写出脏数据的页面数。 推荐值为3。
  • DIRTY_EXPIRE_CENTISECS,定义脏数据在内存中保持多久后有资格被写出的时间,默认是3000,单位是百分之一秒。oracle推荐为500.
  • DIRTY_WRITEBACK_CENTISECS,定义脏数据被写出内存到磁盘间的间隔时间,默认是500,单位是百分之一秒。oracle推荐为100.
## 集群中各节点上执行
# 备份原配置文件
cp /etc/sysctl.conf /etc/sysctl.conf.bak

# 修改配置优化虚拟内存设置
vim /etc/sysctl.conf
******************************************************
vm.swappiness = 0
vm.dirty_background_ratio = 3
vm.dirty_ratio = 80
vm.dirty_expire_centisecs = 500
vm.dirty_writeback_centisecs = 100
******************************************************

# 使配置立即生效
sysctl -p

5) 设置共享内存

共享内存允许进程间通过将内存区域放置到内存段中来彼此通信。在oracle这里,共享内存被System Global Area (SGA)拿来存储输入数据和控制信息。Oracle SGA的大小影响要在系统中设置的共享内存页和共享内存段的数量。默认情况下,RHEL6会提供一个很大的共享内存页数和共享内存段数,然而,一个系统在此方面合适的分配数量还是取决于RAM的大小。为了在oracle集群节点上分配合适的共享内存,我们需要优化以下三个参数。

  • SHMALL,全部共享内存页的页数最大值
  • SHMMAX,一个单独共享内存段容量的最大值,单位是bytes
  • SHMMNI,全部共享内存段的段数最大值

在oracle集群的节点中,为了在每个系统的内存页容量(bytes)中决定共享内页的数量,以下这个命令会帮助我们获得系统的内存页数量。

getconf PAGE_SIZE
4096

接下来我们计算三个参数的值

# 计算SHMALL公式:TOTAL RAM IN BYTES / PAGE_SIZE
echo "`cat /proc/meminfo |awk '/MemTotal/{print $2}'` * 1024 / `getconf PAGE_SIZE`" | bc
125486

# 计算SHMMAX公式:HALF OF TOTAL RAM IN BYTES
echo "`cat /proc/meminfo |awk '/MemTotal/{print $2}'` * 1024 / 2" | bc
256995328

# 至于SHMMNI, Oracle 推荐设置 SHMMNI 为 4096.

特别需要注意的是,如果你发现/etc/sysctl.conf中的值大于自己计算的值,请不要改动此项参数。

最终,发现系统配置的shmallshmmax都要比自己计算的大,于是不改动这两个参数,只需要添加shmmni即可

# 最终编辑参数为
vim /etc/sysctl.conf
******************************************************
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
kernel.shmmni = 4096
******************************************************

# 使其立即生效
sysctl -p

6) 设置信号量

RHEL6 提供了semaphores(信号量)用于在进程间同步信息。内核参数sem由以下4个部分组成

  • SEMMSL,每个信号量集合的最大信号量数
  • SEMMNI,系统的信号量集合的最大数目
  • SEMMNS,系统的最大信号量数,等于SHMMNI * SHMMSL
  • SEMOPM,每个semop系统调用执行的信号量操作的总数

设置以下的参数来确保oracle集群节点拥有足够的信号量

# 在/etc/sysctl.conf中配置
vim /etc/sysctl.conf
******************************************************
kernel.sem = 250 32000 100 128
******************************************************

# 使其立即生效
sysctl -p

7) 设置短期端口使用范围

oracle推荐设置此项来确保oracle和其他应用默认的端口被避开,推荐设置为

# 在 /etc/sysctl.conf 中增加
vim /etc/sysctl.conf
******************************************************
net.ipv4.ip_local_port_range = 9000 65500
******************************************************

# 使其立即生效
sysctl -p

8) 优化网络设置

oracle通过设定RMEMWMEM,来优化应用程序sockets的缓存默认值和缓存最大值。

  • RMEM,receive buffer size
  • WMEM,send buffer size

oracle做如下推荐

# /etc/sysctl.conf
vim /etc/sysctl.conf
******************************************************
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
******************************************************

# 使其立即生效
sysctl -p

9) 提升异步I/O请求

内核参数FS.AIO-MAX-NR设定当前异步I/O请求的最大数量。
oracle推荐如下设置

# /etc/sysctl.conf
vim /etc/sysctl.conf
******************************************************
fs.aio-max-nr = 1048576
******************************************************

# 使其立即生效
sysctl -p

10) 提升文件句柄

内核参数FS.FILE-MAX设置分配给Red Hat Enterprise Linux 6操作系统的打开文件句柄的最大数目,oracle推荐在RHEL6操作系统已分配的数目之外,额外增加512 * PROCESSES,数据库实例中的PROCESSES指的是Oracle用户可以并发连接到Oracle RAC数据库的最大进程数。PROCESSES默认值是150.

# 如何获取当前的最大文件打开数
cat /proc/sys/fs/file-max
46892

# 参考每个服务器拥有一个oracle database instance,两个服务器就是150 * 2
# 计算FS.FILE-MAX
echo "`cat /proc/sys/fs/file-max` + $[512*300]" | bc
200492

需要注意的是,因为目前还没有创建oracle rac database cluster,可以暂时使用150 PROCESSES,可以在增加oracle database instance之后再行调整。

然而,FS.FILE-MAX的值,oracle推荐不低于6815744,因为我们计算的值小于此值,所以最终,我们将其设置为6815744

# 修改内核配置文件/etc/sysctl.conf
vim /etc/sysctl.conf
******************************************************
fs.file-max = 6815744
******************************************************

# 使其立即生效
sysctl -p

需要注意的是,oracle ASMLib不是根据每个设备来打开文件描述符,而是为每个oracle进程来打开文件描述符。在oracle rac database cluster安装期间,FS.FILE-MAX内核参数最小设置为6815744

当我们因为oracle RAC database instances增加而增加PROCESSES的值时,需要重新调整FS.FILE-MAX的值

11) 设置反向路径过滤

RHEL6默认使用严格的反向路径过滤。之所以默认使用严格模式是因为预防DDOS的ip欺骗攻击。然而,开启此模式有时会引起互联通信的中断。所以推荐设置RP_FILTER将严格模式切换到松散模式。不需要太多的关注切换到松散模式所带来的安全问题,因为独立的private网络只能在oralce cluster节点之间通信。

# 编辑/etc/sysctl.conf
vim /etc/sysctl.conf
******************************************************
net.ipv4.conf.eth3.rp_filter = 2
net.ipv4.conf.eth4.rp_filter = 2
******************************************************

# 使其立即生效
sysctl -p