Oracle RAC 建设过程中必须应知、应做(上)  


数据库建设过程中缺少可以遵循的实践标准,知识点和经验点散落四处难以快速形成逻辑性强的参照标准,面对项目令人无从下手。本文拟从各个层面进行总结和分析,为日后从事数据库建设的项目提供一个参考思路。

内容较长,作者将分为三部分撰写及发布。今天发布(中)篇


4.操作系统层的关键优化项

4.1 兼容性检查

在Oracle建设实施之前,根据操作系统平台对即将采用的相关数据库技术进行兼容性检查。下面的link是官方的Matrix,分别针对Linux平台和Unix平台:

http://www.oracle.com/technetwork/database/clustering/tech-generic-linux-new-086754.html

http://www.oracle.com/technetwork/database/clustering/tech-generic-unix-new-166583.html

4.2 平台版本及补丁

当我们选择了具体的操作系统平台以及具体的数据库版本之后,接下需要做的事情就是要根据官方提供的文档来检查我们的系统补丁以及相关软件包是否齐全准确:

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=184026698780346&parent=DOCUMENT&sourceId=1526555.1&id=169706.1&_afrWindowMode=0&_adf.ctrl-state=bjsizj5t_240

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=184190072886338&parent=DOCUMENT&sourceId=1526555.1&id=1393041.1&_afrWindowMode=0&_adf.ctrl-state=bjsizj5t_338

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=184287678146090&parent=DOCUMENT&sourceId=1526555.1&id=282036.1&_afrWindowMode=0&_adf.ctrl-state=bjsizj5t_436

Oracle官方对所有数据库集群及RDBMS等建议的最新补丁列表:

https://support.oracle.com/epmos/faces/DocumentDisplay?_afrLoop=202212137729856&parent=DOCUMENT&sourceId=1526083.1&id=756671.1&_afrWindowMode=0&_adf.ctrl-state=yi6z8ecqc_839#r11204

另外在AIX平台上有一个不容忽视的地方,那就是必须保障Hacmp没有安装或者没有任何残留痕迹。

4.3 时间同步设置项

NTP是11gr2之前必须的选项,用来同步节点之间的时间。而到了11gr2之后,不仅仅可以采用NTP也可以采用CTSSD(Cluster Time Synchronization Daemon)代替NTP。如果NTP启用的话,Oracle会采用NTP,CTSSD自动处于观察模式。但是在NTP的启用模式上,我们需要采用渐进式模式(需要利用启动参数-x)。可以参照下面的配置:

1. /etc/sysconfig/ntpd

# Drop root to id 'ntp:ntp' by default.

OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"

# Set to 'yes' to sync hw clock after successful ntpdate

SYNC_HWCLOCK=no

# Additional options for ntpdate

NTPDATE_OPTIONS=""

4.4 ASLR (Address Space Layout Randomization)

ASLR是REL5 Linux以上版本中默认开启的一个特性,是参与保护缓冲区溢出问题的一个计算机安全技术。是为了防止攻击者在内存中能够可靠地对跳转到特定利用函数。ASLR包括随机排列程序的关键数据区域的位置,包括可执行的部分、堆、栈及共享库的位置。ASLR通过制造更多让攻击者预测目标地址的困难以阻碍一些类型的安装攻击。而在ORACLE的进程管理当中,多个进程共享相同地址的共享内存,开启ASLR特性之后,Oracle就无法保障共享内存可用。从而导致ORA-00445错误发生。要在Linux上关闭这个特性需要添加或修改以下两个参数到/etc/sysctl.conf文件:

kernel.randomize_va_space=0

kernel.exec-shield=0

4.5 HugePage

大多数操作系统采用了分段或分页的方式进行管理。分段是粗粒度的管理方式,而分页则是细粒度管理方式,分页方式可以避免内存空间的浪费。相应地,也就存在内存的物理地址与虚拟地址的概念。通过前面这两种方式,CPU必须把虚拟地址转换程物理内存地址才能真正访问内存。为了提高这个转换效率,CPU会缓存最近的虚拟内存地址和物理内存地址的映射关系,并保存在一个由CPU维护的映射表中。为了尽量提高内存的访问速度,需要在映射表中保存尽量多的映射关系。

Linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会按照LRU算法在适当的时候将物理内存中不经常使用的内存页自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。

通常情况下,Linux默认情况下每页是4K,这就意味着如果物理内存很大,则映射表的条目将会非常多,会影响CPU的检索效率。因为内存大小是固定的,为了减少映射表的条目,可采取的办法只有增加页的尺寸。因此Hugepage便因此而来。也就是打破传统的小页面的内存管理方式,使用大页面2m,4m等。如此一来映射条目则明显减少。如果系统有大量的物理内存(大于8G),则物理32位的操作系统还是64位的,都应该使用Hugepage。

那么如何控制Oracle数据库对HugePage的利用呢?主要分为以下几个步骤:

1.需要在/etc/security/limits.conf 中设置memlock值(单位KB),该值小于内存大小。

2. 如果你使用11G及以后的版本,AMM已经默认开启,但是AMM与Hugepages是不兼容的,必须先关闭AMM。

3.编辑/etc/sysctl.conf 设置 vm.nr_hugepages参数的具体值。

4.停止实例并重启OS系统,并通过以下命令检查设置是否生效:

# grep HugePages /proc/meminfo 

HugePages_Total:    1496 

HugePages_Free:      485 

HugePages_Rsvd:     446 

HugePages_Surp:       0

5.通过以下参数控制数据库对HugePage的使用方式(11gr2之后):

use_large_pages = {true/only/false/auto}

默认值是true,如果系统设置Hugepages的话,SGA会优先使用hugepages,有多少用多少。如果设置为false, SGA就不会使用hugepages。如果设置为only 如果hugepages大小不够的话,数据库实例是无法启动的。设置为auto,这个选项会触发oradism进程重新配置linux内核,以增加hugepages的数量。一般设置为true。

SQL> alter system set use_large_pages=true scope=spfile sid='*';

4.6 Transparent HugePage

透明大页管理和前面所述的标准大页管理都是操作系统为了减少页表转换消耗的资源而发布的新特性,虽然Oracle建议利用大页机制来提高数据库的性能,但是Oracle却同时建议关闭透明大页管理。这二者的区别在于大页的分配机制,标准大页管理是预分配的方式,而透明大页管理则是动态分配的方式。

对于数据库来讲这种动态的分配方式在系统负载很高的情况下非常有可能导致数据库出现严重的性能问题。这在Oracle官方文档1557478.1当中有详细的记载。

那么如何来关闭系统的透明大页管理呢?只要修改如下参数即可:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

4.7 vm.min_free_kbytes

该参数是Linux内核当中用来控制保留最小空闲内存的数量,Oracle建议调大该值为512M。这样的设置有利于相对加快内存的回收速度,从而降低内存吃紧的压力。

4.8 AIX虚拟内存参数

这一项主要是针对AIX的内存管理。AIX内存管理和Linux的内存管理机制不一样,它采用计算内存和非计算内存方式来管理内存。IBM对Oracle的建议值为以下方案:

minperm%=3

maxperm%=90

maxclient%=90

lru_file_repage=0

lru_poll_interval=10

strict_maxperm=0

strict_maxclient=1

page_steal_method=1

minperm和maxperm控制非计算内存中的文件页的下限和上限;maxclient控制非计算内存中的客户页面;lru_file_repage表示分页替换守护进程将根据其内部重新分页表来确定选择何种类型的分页进行操作。strict_maxperm&strict_maxclient表示无论是否有空闲内存,都会严格限制文件页以及客户页的最大占有比率不得超越限制。page_steal_method表示换页时的策略,0为全部页面,1为非计算持久页面。以上参数放方案表示费计算持久页面的上限为90%,下限为3%;客户机页面上限为90%;采用非严格持久页面上限控制策略;严格客户机页面上限控制策略。lru_file_repage & page_steal_method配合使用表示LRUD在寻找空闲页时,只寻找费计算内存当中的持久内存页面。

vmm_klock_mode=2

这个参数是是否对内核页进行加锁的控制。0则表示不进行加锁,那么内核页有可能被错误换出从而导致Page Fault发生;1则表示部分内核页面加锁;2则表示对所有内核页面进行加锁。在Oracle RAC环境下或者EMC的存储作为系统的Swap Device的时候,IBM强烈建议将该参数设置为2。

4.9 PowerVM环境下的参数调整

PowerVM环境下,由于其利用Hypervisor实现了很多虚拟化的功能,这些功能大多从灵活性及扩展型来考虑,但是如果我们运行的是Oracle Rac的话,那么还是有很多关键点需要注意。

1. cpu folding

虚拟处理器折叠功能,当系统负载比较低的时候,AIX系统自动休眠一些虚拟处理器,以减少Hypervisor的开销,提升PowerVM平台整体性能。但是在某些情况下,当数据库的负载变化非常快的时候,CPU折叠或者打开的速度反而会影响数据库甚至系统的性能,严重导致系统挂起。下面是IBM针对该BUG的一个补丁,主要针对AIX5.3 & 6.1。

https://www-01.ibm.com/support/docview.wss?uid=isg1fixinfo105201

4.10 Linux内核参数

以下是Oracle官方针对Linux平台内核参数设置的一个通用方案:

fs.aio-max-nr = 1048576

fs.file-max = 6815744

kernel.shmall = 2097152

kernel.shmmax = 4294967295

kernel.shmmni = 4096

kernel.sem = 250 32000 100 128

net.ipv4.ip_local_port_range = 9000 65500

net.core.rmem_default = 4194304

net.core.rmem_max = 4194304

net.core.wmem_default = 4194304

net.core.wmem_max = 4194304

kernel.shmmax:是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值。设置应该足够大,能在一个共享内存段下容纳下整个的SGA ,设置的过低可能会导致需要创建多个共享内存段,这样可能导致系统性能的下降。

至于导致系统下降的主要原因为在实例启动以及ServerProcess创建的时候,多个小的共享内存段可能会导致当时轻微的系统性能的降低(在启动的时候需要去创建多个虚拟地址段,在进程创建的时候要让进程对多个段进行“识别”,会有一些影响),但是其他时候都不会有影响。

64位linux系统:可取的最大值为物理内存值-1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为12G物理内存,可取210241024*1024-1=12884901887,SGA肯定会包含在单个共享内存段中。 

kernel.shmall: 该参数控制可以使用的共享内存的总页数。Linux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是16G,那么需要共享内存页数是16GB/4KB=16777216KB /4KB=4194304(页),也就是64Bit系统下16GB物理内存,设置kernel.shmall = 4194304才符合要求(几乎是原来设置2097152的两倍)。这时可以将shmmax参数调整到16G了,同时可以修改SGA_MAX_SIZE和SGA_TARGET为12G(您想设置的SGA最大大小,当然也可以是2G~14G等,还要协调PGA参数及OS等其他内存使用,不能设置太满,比如16G)。

kernel.shmmni:该参数是共享内存段的最大数量。shmmni缺省值4096,一般肯定是够用了。

fs.file-max:该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量。

fs.aio-max-nr:此参数限制并发未完成的请求,应该设置避免I/O子系统故障。

kernel.sem:以kernel.sem = 250 32000 100 128为例:250是参数semmsl的值,表示一个信号量集合中能够包含的信号量最大数目。32000是参数semmns的值,表示系统内可允许的信号量最大数目。100是参数semopm的值,表示单个semopm()调用在一个信号量集合上可以执行的操作数量。128是参数semmni的值,表示系统信号量集合总数。

net.ipv4.ip_local_port_range:表示应用程序可使用的IPv4端口范围。

net.core.rmem_default:表示套接字接收缓冲区大小的缺省值。

net.core.rmem_max:表示套接字接收缓冲区大小的最大值。

net.core.wmem_default:表示套接字发送缓冲区大小的缺省值。

net.core.wmem_max:表示套接字发送缓冲区大小的最大值。

5.配置集群层的关键点

5.1 diagwait

在集群进行驱逐节点时,节点发生重新启动的场合下,操作系统需要转储CrashDump,这个参数就是集群需要等待操作系统转储的时间参数。对于版本 10gR2 和 11gR1,所有平台上的最佳实践都是将 CSS diagwait 参数设置为小于等于13。对于11gR2已经不要求对该参数进行设置。

5.2 ORA_CRS_HOME

对于这个变量,Oracle官方给出的建议是:不要设置 ORA_CRS_HOME 环境变量(在所有平台上)。设置此变量将使各个 Oracle 组件出现问题,而且 CRS 程序完全不需要此变量,因为它们都有包装脚本。

5.3 关于组播和多播

Oracle11gR2私网采用的是组播方式通讯,组播地址段为230.0.1.0 或 224.0.0.251网段,为了保障集群私网通讯的正常及稳定,一方面这个网段的网络配置需要支持组播,另外一方面不要让主机的任何其他网络配置和这两个网段冲突。曾经遇到过浪潮的X86服务器的带外管理的某个地址也正好利用了这个网段,结果导致了Oracle Rac节点的异常重启。这种问题一般会显示为私网通讯报错,但是正常状况下只要带外管理收集日志工具不启动的话,那么是不会发现这个问题的,属于偶发性问题。所以我们需要特别小心此类问题,不要等到发生时候再去花费大量实践调查。

6.安装集群时的关键点

6.1 cluvfy

如果安装过10g以后的RAC环境,应该对这个工具并不陌生。在安装Cluster和Database之前通常会执行runcluvfy.sh脚本来检查当前系统是否满足安装条件。runcluvfy.sh将cluvfy工具的功能在shell中实现,使得用户在数据库和CLUSTER安装之前就可以利用这个工具的功能。这个工具的主要作用就是验证系统是否满足安装的条件,尤其是检查网络和域名解析,如果网络和域名解析在安装之前没有正常的配置,通常直接导致安装的失败。主要用法如下所列两个功能:

# runcluvfy.sh stage -list 

# runcluvfy.sh comp -list

6.2 升级顺序问题

安装完集群软件也好,RDBMS也好,打补丁是必然要做的事情。但是究竟是等安装完所有的组件之后再统一打补丁呢还是说将每一个组件都按照安装&补丁升级的顺序依次做完呢?Oracle给的建议是:在执行 11gR2 之前的安装时,建议在执行任何 RDBMS 或 ASM 主目录安装前应用补丁程序将 Clusterware 主目录升级到所需的级别。

6.3 root.sh & rootupgrade.sh

安装或者升级期间,最后的步骤就是要执行以上的脚本。当然按照安装文档的要求必须是用超级用户root来执行。但是可能有些人认为只要利用root的权限去执行就可以了,很想当然的用了su root -c或者是sudo等去执行,结果导致执行失败,日志报错crsd.bin crashes。因为脚本的执行不仅仅是要用超级用户root的权限,还要利用root用户的环境配置等。

6.4 /etc/init.cssd

11.2 之前再AIX系统上,OPROCD 默认不在 AIX 全局运行队列运行 ,这可能会导致 OPROCD 错误地重启节点。(Bug 13623902)。此问题的更正操作是修改 /etc/init.cssd 文件,加入如下参数:

RT_GRQ=ON

export RT_GRQ

但是AIX6.1 TL4以上的版本就自带了对该问题的修正程序。所以当我们采用低版本的AIX操作系统时,需要特别注意这个配置文件。

转载自:talkwithtrend(ID:talkwithtrend)

作者赵海社区个人主页:http://www.aixchina.net/home/space.php?uid=353923

本文地址:http://www.aixchina.net/Article/178289