1.3 环境准备
大话Oracle Grid:云时代的RAC
RAC的环境准备可以分成4个方面:主机、用户、存储和网络。在准备阶段中,Oracle 11.2和10.2 RAC之间最重要的区别体现在用户这一方面。在Oracle 11.2之前的版本中,只需要创建一个用户oracle和一个用户组dba。而在Oracle 11.2中,需要创建两个操作系统用户oracle和grid,以及至少4个操作系统用户组。这么做的原因会在后面的章节中介绍。
1.3.1 主机环境
主机环境包括硬件环境、软件环境,硬件中包括内存、磁盘空间等。根据官方文档,硬件的要求如表1-1所示。
需要调整操作系统的内核参数如下:
# vi /etc/sysctl.conf
加入这些内容:
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
fs.aio-max-nr = 1048576
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 4194304
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 262144
修改以后让参数生效:
# /sbin/sysctl -p
安装用于Linux系统的cvuqdisk包,这个包位于解压后的grid/rpm目录下。如果不安装 cvuqdisk,集群验证程序是无法发现共享磁盘的,我们会收到“Package cvuqdisk not installed”这样的出错消息。
安装这个包需要先设置变量CVUQDISK_GRP,变量的值是cvuqdisk所有者所在的组(本书为oinstall)。
[root@indexserver1 ~]# export CVUQDISK_GRP=oinstall
[root@indexserver1 ~]# cd /u01/install/grid/rpm/
[root@indexserver1 rpm]# ls
cvuqdisk--1.rpm
[root@indexserver1 rpm]# rpm -ivh cvuqdisk--1.rpm
Preparing... ########################################### [100%]
1:cvuqdisk ########################################### [100%]
1.用户和用户组
在Oracle 11gR2的RAC环境中,我们需要有6个操作系统用户组以及两个操作系统用户。这6个用户组中有两个是可选的,这两个用户与用户组的名称和关系如表1-2所示。
我们需要在所有的节点机器上创建这些用户和用户组。具体操作步骤是先创建用户组,然后再创建用户。本书中没有创建oper用户组。
#/usr/sbin/groupadd -g 505 oinstall
#/usr/sbin/groupadd -g 502 dba
#/usr/sbin/groupadd -g 504 asmadmin
#/usr/sbin/groupadd -g 506 asmdba
#/usr/sbin/groupadd -g 507 asmoper
#/usr/sbin/useradd -u 501 -g oinstall -G asmadmin,asmdba,asmoper grid
#/usr/sbin/useradd -u 502 -g oinstall -G dba,asmdba oracle
最后,还要使用password命令为这两个用户设置密码。
在这一步中我们需要注意以下几点:
保证每个用户组在所有节点上的组ID一样,这就是groupadd使用-G的目的;
要保证每个用户在所有节点上的用户ID一样,这是useradd使用-u的目的;
要确保两个用户的主组是oinstall,这也是useradd使用-g的目的;
保证两个用户在每个节点机上的密码一样,这样做不是必须的,不过可以简化用户等价性的配置过程。
至于为什么会有这么多用户和用户组,可以参考2.1小节中的讨论。
在创建了用户之后,需要设置这两个用户的环境变量,其实就是设置$ORACLE_BASE和$ORACLE_HOME。设置了这两个变量之后,Grid、Database的OUI安装程序就会自动提取这两个变量值,省去了再次手动输入的麻烦。
Grid用户的环境变量如下所示:
export ORACLE_BASE=/u01/app/grid
export ORACLE_HOME =/u01/app/.2/grid
PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin
Oracle用户的环境变量如下所示:
export ORACLE_BASE=/u01/app/database
export ORACLE_HOME=$ORACLE_BASE/.2/product
PATH=$ORACLE_HOME/bin:$PATH:$HOME/bin
仔细看一下,这两个用户的$ORACLE_BASE和$ORACLE_HOME的关系有什么不同?
提示:
Oracle用户的$ORACLEHOME是$ORACLE_BASE的子目录。而Grid用户的$ORACLE
HOME不是$ORACLE_BASE的子目录,这并不是我们有意为之,而是Oracle规定的,也必须这样。
如果读者读过《大话Oracle RAC》和《Oracle DBA突击》这两本书,可能就会发现我对$ORACLE_HOME目录规划的看法发生了变化。之前,我一直喜欢的$ORACLE_HOME规划方式是/oracle/product/.1/db这样的目录结构,而这次我采用的是/u01/app/database/11.2.0.2/
product这样的层级结构,这也是Oracle的目录结构标准,我之所以不再固执己见,是因为我觉得它要比我自己设计的更合理。
再接下来,就是对Oracle用户使用操作系统资源限制的改变,我们需要在/etc/security/limits.conf中添加这些内容:
Oracle soft nproc 2047
Oracle hard nproc 16384
Oracle soft nofile 65536
Oracle hard nofile 63536
oracle soft stack 10240
然后在/etc/pam.d/login文件中添加以下代码:
session required pam_limits.so
2.用户等价性
在Oracle 11.2中,用户等价性要求仍然不变,不过我们这里略过,略过不是省略,而是不再需要像以前那样纯手工的配置方法了,具体的配置步骤后面会有介绍。OUI提供的可视化的配置方法,那是轻松省事多了。
3.调整NTP服务
我们知道,Oracle是事务型数据库,事务操作的先后顺序是靠SCN来记录的,SCN可以看作是时间戳,因此,各个节点机器上的时间一致就是RAC发挥价值的重要基石。所以必须通过技术手段来保证节点的时间一致。在Oracle 11.2版本之前,我们只有一种方法就是NTP,在Oracle 11.2版本之后,Oracle自己又多了一种方法,我们会在后面的章节中深入讨论它。
1.3.2 使用NTP服务
要是坚持使用操作系统自带的NTP服务来保证时间一致,当然完全没有问题。只是有个细节需要重视,我们需要修改一个配置。打开NTP服务的参数文件,在其中的OPTIONS中加上个“-x”标志,就像下面这样。这样做的目的是为了避免向前调整时间。这样改好后,保存配置文件、重新启动NTP服务即可。
编辑/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=""
重启NTP服务:
[root@indexserver3 grid_data]# service ntpd status
ntpd (pid 4250) is running...
[root@indexserver3 grid_data]# service ntpd stop
Shutting down ntpd: [ OK ]
[root@indexserver3 grid_data]# service ntpd start
ntpd: Synchronizing with time server: [ OK ]
Starting ntpd: [ OK ]
[root@indexserver3 grid_data]# ps -ef|grep ntpd
ntp 22244 1 0 17:25 ? 00:00:00 ntpd-x -u ntp:ntp -p /var/run/ntpd.pid
root 22250 15074 0 17:/0 00:00:00 grep ntpd
这是第一种时间配置方法,Oracle自己也提供了一种方法,叫CSST,因为这一章只是演示安装过程,而安装选择的是NTP,所以这里不讨论CSST(见第2章)。
1.3.3 网络环境
在Grid 11.2中,Oracle引入了一些崭新的技术,包括SCAN、GNS、IP Bonding等。对于网络配置的要求也和之前有所变化,这些要求如下:
127.0.0.1这个地址只能映射到localhost或者localhost.localdomain,而不应该是其他的,任何网卡都不应该使用这个地址;
所有节点上用于Public网络的网卡名字应该相同,比如都是eth0;
所有节点上用于Private网络的网卡名字也应该相同,比如都是eth1;
所有节点的所有网卡的MTU应该相同,一般不需额外配置就是相同的;
所有的Public、Virtual、SCAN名字都应该由DNS或者GNS解析,如果SCAN放在DNS解析,就不应该出现在本地的hosts文件中;
更多的要求可以参看文档1054902.1。
1.有关多播
Oracle Grid .2引入了一个新的设计,叫做“Redundant Interconnect Usage”,按照我的理解就是Oracle自己的多网卡绑定技术(读者对这个技术不应该陌生,不同平台的叫法不同,Bonding、Teaming、Etherchannel等)。也就是用多块网卡绑定成一个虚拟的私有网卡,专门用于私有网络的通信。我们都知道私有网络对于RAC稳定的重要性,所以Oracle的这个设计是有意义的。其实在这个设计出来之前,Oracle也会建议用户用OS提供的类似技术实现同样的功能。
不过,Oracle好像把大部分用户的能力估计过高,它最初版本(指的是.2)选择的底层技术是大多数人都很陌生的技术——多播。
这个多播是干嘛使的呢?每个节点的Clusterware栈在启动、加入集群过程中要尝试和集群中的其他节点通信,虽然这时它还不知道有哪些兄弟姐妹存在。这一段的通信使用的就是多播技术,而一旦通信协议道建立起来,也就是它找到了亲人了,它会再转回到用单播模式继续接下来的通信。
因此,如果私有网络不支持多播或者不满足Oracle要求的多播条件,那么集群栈是无法启动的。于是就有可能遇到这种问题:
CRS-4402: The CSS daemon was started in exclusive mode but found an active CSS daemon on node node1, number 1, and is terminating
An active cluster was found during exclusive startup, restarting to join the cluster
Failed to start Oracle Clusterware stack
Failed to start Cluster Synchorinisation Service in clustered mode at /u01/app/crs/
.2/crs/install/crsconfig_lib.pm line 1016.
/u01/app/crs/.2/perl/bin/perl -I/u01/app/crs/11.2.0.2/perl/lib -I/u01/app/crs/
11.2.0.2/crs/install /u01/app/crs/11.2.0.2/crs/install/rootcrs.pl execution failed
说实话,解决多播问题已经超过大部分DBA的能力了,包括对我。大概Oracle自己也觉得强人所难,于是在Oracle .3时,对这个设计进行了加强──同时支持多播和广播,广播我们就都能理解了。如果私有网络支持多播,就优先使用多播技术,如果不支持多播,就使用广播技术。这样,前面这个问题就少多了。
这里谈论的多播、广播仅限于节点的Clusterware栈启动、加入集群、节点间建立连接的这个bootstrap阶段,一旦这一篇翻过去了,之后的通信就都是单播了。
因此,如果你固执地选择Grid .2,那看看note 1212703.1或许有些帮助。如果使用的是Grid 11.2.0.3,就不用再考虑这个问题了。
2.域名和IP
首先,要规划一个域名,在Oracle的术语中叫SCAN地址。用于未来用户找到这个数据库,这里是indexgrid.wxxr.com.cn。
其次,这个SCAN地址要通过DNS解析成IP地址,而且要解析成3个IP地址。
看看我们需要多少个IP地址?像我们这个4个节点的集群,一共需要4×3+3=15个IP地址。加号(+)后面的3就代表SCAN的3个IP地址。
如何配置DNS服务器这里就不演示了,这不在本书的讨论范围之内。而且,不同DNS服务器的配置方法也不尽相同,不过最终的效果应该是一样的。在任何一台机器上用nslookup命令看到的解析结果应该是这样的:
[root@indexserver4 ~]# nslookup indexgrid.wxxr.com.cn
Server: 192.168.123.5
Address: 192.168.123.5#53
Name: indexgrid.wxxr.com.cn
Address: 192.168.123.214
Name: indexgrid.wxxr.com.cn
Address: 192.168.123.215
Name: indexgrid.wxxr.com.cn
Address: 192.168.123.216
而剩下来的4×3=12个IP地址,和之前版本配置方式一样,可以放在/etc/hosts中,比如:
192.168.1.70 indexserver1
192.168.1.71 indexserver2
192.168.1.72 indexserver3
192.168.1.73 indexserver4
10.0.0.70 indexserver1-priv
10.0.0.71 indexserver2-priv
10.0.0.72 indexserver3-priv
10.0.0.73 indexserver4-priv
192.168.1.80 indexserver1-vip
192.168.1.81 indexserver2-vip
192.168.1.82 indexserver3-vip
192.168.1.83 indexserver4-vip
前面说过,Public和Virtual地址也可以交给DNS解析。
3.主机名中不要有下划线(_)
这是一个常见的错误,也是个常识性错误,也是笔者早期常犯的错误,现在列在这里给读者以提醒。
这个规定并不是Oracle的规定,而是Internet 的协议标准(RFC)中约定的:主机名中只能使用字母、数字和横线()。而不能有其他的符号,比如下划线()。
如果主机名有下划线,比如叫beijing_db,那么数据库会经常出现些莫名其妙的问题,典型的问题就是在建库过程中EMCA的配置会失败,会遇到类似如图1-4所示的提醒。
1.3.4 配置存储
存储配置包括两个步骤:基础配置和ASM配置。
在基础配置阶段,我们要做的是配好盘柜、光纤交换机,划分Lun并能在主机上看到Lun,再安装PowerPath,以实现多路径。这部分工作一般都是存储厂商的工程师完成的,不在本书讨论的范围之内,下面要讨论的是ASM配置。
1.ASM配置
配置ASM第一步是安装ASM驱动。下载驱动包时要注意根据操作系统内核版本号选择对应的包。查看OS内核版本号:
[oracle@indexserver1 ~]$ uname -a
Linux indexserver1 -238.el5 #1 SMP Sun Dec 19 14:22:44 EST 2010 x86_64 x86_64 x86_64 GNU/Linux
装好了驱动后,接下来就是配置ASM模块。
在Oracle 11.2中,Grid和Database一般是用不同的操作系统用户安装的,因此在配置ASMLib时就要小心点了。因为Grid是用grid用户安装的,而grid的主组是oinstall,次要组是asmowner和asmdba,于是asmlib需要这样配置:
[root@london1 grid]# /etc/init.d/oracleasm configure
Configuring the Oracle ASM library driver.
Default user to own the driver interface []:grid
Default group to own the driver interface []: asmdba
Start Oracle ASM library driver on boot (y/n) [n]: y
Scan for Oracle ASM disks on boot (y/n) [y]: y
Writing Oracle ASM library driver configuration: done
Initializing the Oracle ASMLib driver: [ OK ]
Scanning the system for Oracle ASMLib disks: [ OK ]
说明:
关于这几个用户和用户组的作用,可以参考第2章中的详细介绍。
配置好后,ASMLib驱动会随着系统启动自动加载,接下来就要创建磁盘。
2.创建ASM磁盘
Oracle 11.2已经放弃了对于裸设备的支持(当然还会保持兼容),只能使用ASM磁盘,所以先要创建磁盘,创建磁盘是个有一定危险的动作,因为如果磁盘上有数据,这些数据就会被破坏。因此,我们必须先确保它没有被用。因此,作为一个谨慎的管理员,我们得先检查一下这个磁盘的使用情况,看它是不是已经属于其他的ASM组了。
使用oracleasm querydisk命令,可以检查某个磁盘是否已经是ASM磁盘,以及属于哪个磁盘组,这个命令有两个可选参数-p和-d,其中-d用来查看设备号,-p查看的是设备路径名。
例如,要想知道/dev/emcpowera1这个分区是否已经是ASM磁盘以及它的名字是什么,可以这么做:
[root@searchdb2 ~]# oracleasm querydisk -v -p /dev/emcpowera1
Device "/dev/emcpowera1" is marked an ASM disk with the label "OCR"
反过来,要想知道哪个磁盘是被命名为OCR的磁盘,可以这么做:
[root@searchdb2 ~]# oracleasm qu erydisk -v -p OCR
Disk "OCR" is a valid ASM disk
/dev/emcpowera1: LABEL="OCR" TYPE="oracleasm"
/dev/sde1: LABEL="OCR" TYPE="oracleasm"
/dev/sdg1: LABEL="OCR" TYPE="oracleasm"
如果用-d,能看到的是设备号,要对应到真正的设备,还需要绕个弯,关于设备号和设备名的对应关系,可以参考其他的资料和文档。
如果不是ASM磁盘,看起来输出是这样的:
[root@searchdb2 ~]# oracleasm querydisk -v -d /dev/emcpowerb7
Device "/dev/emcpowerb7" is not marked as an ASM disk
确认磁盘可用之后,就要创建ASM磁盘了。
[root@searchdb2 ~]# oracleasm createdisk WXXRINDEX1 /dev/emcpowerb7
Writing disk header: done
Instantiating disk: done
创建磁盘就相当于格式化,给这个磁盘盘头写上ASM元数据,这个命令只需要在一台机器上执行就可以了。
其他机器要做的是扫描磁盘,把这个磁盘认出来,当然靠的也是盘头的ASM元数据。在每个机器上都进行如下所示的操作:
[root@searchdb2 ~]# oracleasm scandisks
Reloading disk partitions: done
Cleaning any stale ASM disks...
Scanning system for ASM disks...
然后再这么做:
[root@searchdb1 ~]# oracleasm listdisks
OCR
WXXRDATA1
WXXRDATA2
WXXRDATA3
WXXRDATA4
WXXRDATA5
WXXRINDEX1
确保每个节点上都能看到相同的列表。也就是说,所有节点都能识别出这些ASM磁盘。