资深Oracle数据库专家 OCM认证大师 10年数据库相关服务及开发经验 各类数据库相关方案的编写,管理及实施 数据中心数据库日常运维、大型项目割接、性能优化等方面有丰富的实战经验 客户包括: 电信,银行,保险,航空,国网,汽车,烟草等 想要一起学习探讨数据安全技术的请加qq群 256041954
全部博文(163)
分类: Oracle
2016-05-05 18:06:27
之前有网友在我Blog 留言说我的RAC 搭建中没有写SCAN 配置,这个之前应该是有写过,但刚搜了一下,没找到,正好重新整理一下,并做下实验,实验就用Oracle 12c 进行测试。
在Oracle 11g 之前,我们去连接RAC 集群,都是配置如下的内容:
dave_rac=
(DESCRIPTION =
(ADDRESS_LIST =
(LOAD_BALANCE = yes)
(FAILOVER=ON)
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.68)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.69)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dave)
(failover_mode=(type=select)(method=basic))
)
)
这里的68和69 是VIP 的地址,是PUBLIC 网卡上的虚拟IP。 那我们这里只有2个节点,如果我们增加了RAC的集群数,那么就需要修改所有的客户端的配置,这个就很麻烦。
所以在Oracle 11gR2 中,引入了SCAN(Single ClientAccess Name)的特性。SCAN是一个域名,可以解析至少1个IP,最多解析3个SCAN IP,客户端可以通过这个SCAN 名字来访问数据库,另外SCAN ip必须与public ip和VIP在一个子网。
启用SCAN 之后,会在数据库与客户端之间,添加了一层虚拟的服务层,就是SCAN IP和SCAN IP Listener,在客户端仅需要配置SCAN IP的tns信息,通过SCANIP Listener,连接后台集群数据库。这样,不论集群数据库是否有添加或者删除节点的操作,均不会对客户端产生影响,也就不需要修改配置。
配置SCAN有3种方法:
1. 使用/etc/hosts文件
这个是我们目前用的最多的方式,但是缺点只能对应一个SCAN IP,该方法Oracle 不推荐,但是简单,不需要单独的DNS 服务器,使用该方法,客户端还是需要VIP来链接。 Oracle 推荐使用其他的2种方法来实现SCAN 功能。
2. 在DNS中定义域名,只需要在DNS中配置即可实现SCAN 功能。
3. 通过Grid Naming Server(GNS),需要配置DNS 和DHCP才能实现SCAN 功能。
配置好之后,直接在客户端的tnsnames里写SCAN NAME就可以了,如下:
RACSCAN =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.gns.cndba.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dave)
)
)
以后RAC 增加删除节点,客户端都不需要修改。
在启用SCAN 特性之后,除了多几个SCAN IP 之外,还会多几个SCAN IP Listener,每个SCAN IP对应一个SCAN IP Listener,为了性能考虑,每个SCAN IP以及其对应的SCAN IP Listener将被独立的分配到各个节点上。
如果Cluster中其中某个运行SCAN IP的节点出现异常,则其余正常的SCAN IP节点将自动接管。
如果客户端是11g R2的版本,则客户端只需在tns中配置域名解析,即可实现failover,如果客户端版本低于11g R2,则无法通过域名解析出多个SCAN IP地址,因此如果要实现failover,必须在客户端的tns中配置3个SCAN IP的地址进行解析,这也是为何Oracle强烈建议在使用11g R2数据库时,客户端也最好使用11g R2的原因。
上图是SCAN 的工作流程图,图的右边是一个4个节点的RAC 集群,所以有4个Local Listener。 配置了3个SCAN IP和3个 SCAN Listeners。这3个SCAN IP 是随机的落在RAC节点上。
客户端链接的时候,会随机的连接到某一个某一个SCAN IP及起对应的SCAN IP Listner上, SCAN IP Listener接收到连接请求时,会根据 LBA 算法(least loaded instance),将该客户端的连接请求,转发给对应的Instance上的VIP Listener,从而完成了整个客户端与服务器的连接过程。
简单点就是:
client -> scan listener -> locallistener -> local instance
SCAN VIP,即SCAN IP,是由DNS或者GNS、hosts解析出来的IP地址。目前SCANVIP最多能有三个,它们循环地被客户端所请求到。
SCAN VIP数量和节点数没有关系,正如上图所示,4个节点,3个SCAN VIP,SCAN VIP是随机的落在哪个节点上的,这个过程也是动态变化的。
GNS VIP同SCAN VIP, GNS VIP是提供GNS服务的IP地址,它绑定到某个节点的PUBLIC IP所在网卡上,当节点出现故障,GNS资源会自动切换到其他正常的节点继续提供GNS解析服务。如果我们不使用GNS解析方法,那么也不会存在GNS VIP。
SCAN监听器,实现SCAN的负载均衡功能。如果RAC上有三个SCAN VIP,那么SCAN监听器也有三个,它们各自监听SCAN VIP的连接请求。
SCAN监听器的注册是由REMOTE_LISTENER参数控制的,任何实例都会向所有的SCAN监听器注册,所以SCAN LISTENER 会包含所有实例的名称。
这样SCAN监听器可以实时了解所有实例的运行情况的,因此能够准确地将连接重定向到空闲服务器的本地监听器上。
SCAN监听器是跟着SCAN VIP随机分配到节点服务器上,如果某个节点发生故障,运行在此节点上的SCANVIP会进行漂移,这时候SCAN监听器也跟着漂移到正常的节点上,继续为SCAN VIP监听连接请求,当PMON进程下次动态更新实例信息到该SCAN监听器之后,它又重新接受客户端的连接。
Oracle 参数,设置该参数之后,任何实例都会向SCAN监听器注册,所以SCAN监听器能够负载均衡地分发连接请求到节点本地监听器上。
因为SCAN IP有多个,他们对应的是同一个域名,因此在数据库中,需要使用easyconnect naming method方式,需要修改sqlnet.ora的配置文件添加ezconnect,如:
NAMES.DIRECTORY_PATH=(tnsnames,ezconnect)。
设置格式:REMOTE_LISTENER=SCAN:PORT,如REMOTE_LISTENER=rac-scan.cndba.cn:1521。
配置之后,RAC数据库的每个节点的PMON进程,会用广播的方式向每个SCAN Listener进行注册,同时CRS的后台进程ONS,会采集各个节点的负载状况,通知SCAN Listener,以便SCAN Listener根据负载情况,将新连接分配到当前负载最低的节点上。
管理理论部分,就这么多,接下来,会整理2篇Oracle 12c 环境下使用DNS和GNS 实现SCAN 的Blog,具体的了解下如何实现这种功能。
参考:
Grid Infrastructure Single ClientAccess Name (SCAN) Explained (文档 ID 887522.1)
本文描述Oracle 12c RAC 集群使用DNS 实现SCAN.
DNS 的配置工作,就是分配SCAN IP地址,并映射到一个域名上。
SCAN IP最多有3个,我的环境,只有2个节点,这个也没关系,我照样弄3个SCANIP。
当前IP规划:
[root@rac2 raw]# cat /etc/hosts
127.0.0.1 localhost
192.168.56.5 rac1
192.168.57.5 rac1-priv
192.168.56.7 rac1-vip
192.168.56.6 rac2
192.168.57.6 rac2-priv
192.168.56.8 rac2-vip
192.168.56.9 rac-scan
SCAN IP 要和PUBLIC IP一个网段,所以这里从56网段拿3个IP:
192.168.56.20
192.168.56.21
192.168.56.22
解析域名用scan.cndba.cn
Redhat 下安装DNS 需要安装如下3个包:
bind-9.3.6-4.P1.el5.i386.rpm --提供核心的二进制程序
bind-chroot-9.3.6-4.P1.el5.i386.rpm --提供安装性
caching-nameserver-9.3.6-4.P1.el5.i386.rpm--提供模板文件
这里直接用yum 安装:
[root@rac1 yum.repos.d]# yum search bind-
Loaded plugins: refresh-packagekit,security
====================================================================N/S Matched: bind-=====================================================================
bind-chroot.x86_64 : A chroot runtimeenvironment for the ISC BIND DNS server, named(8)
bind-devel.i686 : Header files andlibraries needed for BIND DNS development
bind-devel.x86_64 : Header files andlibraries needed for BIND DNS development
bind-dyndb-ldap.x86_64 : LDAP back-endplug-in for BIND
bind-libs.x86_64 : Libraries used by theBIND DNS packages
bind-libs.i686 : Libraries used by the BINDDNS packages
bind-sdb.x86_64 : BIND server with databasebackends and DLZ support
bind-utils.x86_64 : Utilities for queryingDNS name servers
[root@rac1 sbin]# yum install bind-chroot.x86_64
依赖的包会自动解决。
[root@rac1 etc]# rpm -qa | grep"^bind"
bind-chroot-9.8.2-0.30.rc1.el6.x86_64
bind-9.8.2-0.30.rc1.el6.x86_64
bind-libs-9.8.2-0.30.rc1.el6.x86_64
bind-utils-9.8.2-0.30.rc1.el6.x86_64
[root@rac1 etc]#
安装完成后,bind的主配置文件是/etc/named.conf;区域类型配置文件是/etc/named.rfc1912.zones;区域配置文件在/var/named/下;
[root@davedns ~]#cat /etc/named.conf
//
// named.conf
//
// Provided by RedHat bind package to configure the ISC BIND named(8) DNS
// server as a cachingonly nameserver (as a localhost DNS resolver only).
//
// See/usr/share/doc/bind*/sample/ for example named configuration files.
//
options {
// listen-on port 53 { 127.0.0.1; };默认监听IP为127.0.0.1,用//需注释掉
// listen-on-v6 port 53 { ::1; };注释掉
directory "/var/named";存放区域配置文件的目录
dump-file "/var/named/data/cache_dump.db";
statistics-file"/var/named/data/named_stats.txt";
memstatistics-file"/var/named/data/named_mem_stats.txt";
// allow-query { localhost; };允许查询的客户端的IP,默认为本机,注释掉。
recursion yes; 是否开启迭代查询功能
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file"/etc/named.iscdlv.key";
managed-keys-directory"/var/named/dynamic";
};
logging {
channel default_debug {
file"data/named.run";
severity dynamic;
};
};
//这里必须注释掉原来的file,重新加上file
zone "."IN {
type hint;
// file "named.ca";
file "/dev/null";
};
include"/etc/named.rfc1912.zones";
include"/etc/named.root.key";
修改Zone 文件:/etc/named.rfc1912.zones, 添加正向解析和反向解析的Zone 定义。
--配置正向解析Zone
zone "cndba.cn" IN{
typemaster;
file"cndba.cn.zone";
allow-update{ none; };
};
-- 注意,这个域名要和后面配置的一致
--配置反向解析Zone
zone "56.168.192.in-addr.arpa" IN{
typemaster;
file"56.168.192.local";
allow-update{ none; };
};
这里需要注意的是,反向解析从左到右读取ip地址时是以相反的方向解释的,所以需要将ip地址反向排列。这里,192.168.56.*网段的反向解析域名为"56.168.192.in-addr.arpa”。
在之前的name.conf 配置中指定的区域文件目录是:/var/named。 所以在这个目录里创建正向解析的区域文件。
文件名就是在Zone中定义的file名。
[root@davedns ~]#touch /var/named/cndba.cn.zone
添加如下内容:
$TTL 86400
@ IN SOA dns.cndba.cn. root.cndba.cn. (
42 ; serial (d.adams)
3H ; refresh
15M ; retry
1W ; expiry
1D) ; minimum
IN NS dns.cndba.cn.
dns IN A 192.168.56.6
scan IN A 192.168.56.20
scan IN A 192.168.56.21
scan IN A 192.168.56.22
参数说明:
$TTL 86400 :-- 最小的存活的时间是86400S(24H)
@ IN SOA tianlesoftware.com root.tianlesoftware.com(
--这是一笔SOA记录,只允许存在一个SOA记录
@:代表要解析的这个域本身(tianlesoftware.com)
IN:Internet记录。
SOA: 是初始授权记录,指定网络中第一台DNS Server。
localhost: DNS服务器的名字。
root.localhost: 是指管理员的邮箱。
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
这些部分主要是用来主DNS和辅助DNS做同步用的.
42: 序列号,当主DNS数据改变时,这个序列号就要被增加1,而辅助DNS通过序列号来和主DNS同步。
3H 刷新,主DNS和辅助DNS每隔三小时同步一次。
15M 重试,3H之内,没有同步,每隔15M在尝试同步
1W 过期,1W之内,还没有同步,就不同步了
1D 生存期,没有这条记录,缓存的时间。
@ INNS server1.example.com. :
这是一笔NS记录,指定nameserver为server1.example.com
在/var/named 目录下创建反向解析的区域文件,文件名也是之前在Zone中定义的:56.168.192.local。
[root@davedns ~]# touch/var/named/56.168.192.local
添加如下内容:
$TTL 86400
@ IN SOA dns.cndba.cn. root.cndba.cn. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400) ; Minimum
IN NS dns.cndba.cn.
20 IN PTR scan.cndba.cn.
21 IN PTR scan.cndba.cn.
22 IN PTR scan.cndba.cn.
[root@davedns ~]# chkconfig named on
[root@davedns ~]# service named restart
Stopping named: . [ OK ]
Starting named: [ OK ]
[root@rac2 named]#
在所有节点的/etc/resolv.conf 文件中添加如下内容:
[root@rac2 /]# cat /etc/resolv.conf
domain cndba.cn
nameserver 192.168.56.200
options rotate
options timeout:2
options attempts:5
[root@rac2 /]# nslookup scan.cndba.cn
Server: 192.168.56.200
Address: 192.168.56.200#53
Name: scan.cndba.cn
Address: 192.168.56.22
Name: scan.cndba.cn
Address: 192.168.56.20
Name: scan.cndba.cn
Address: 192.168.56.21
[root@rac1 /]# nslookup scan.cndba.cn
Server: 192.168.56.200
Address: 192.168.56.200#53
Name: scan.cndba.cn
Address: 192.168.56.20
Name: scan.cndba.cn
Address: 192.168.56.21
Name: scan.cndba.cn
Address: 192.168.56.22
在所有节点都验证成功。
现在就可以安装使用DNS的SCAN 的RAC 集群了。
12c RAC 安装的详细步骤参考如下链接:
Oracle 12c RAC 搭建手册
http://blog.csdn.net/tianlesoftware/article/details/41675693
我们这里贴出不同的地方:
[grid@rac1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
Name Target State Server Statedetails
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
ora.ASMNET1LSNR_ASM.lsnr
ONLINE ONLINE rac1 STABLE
ONLINE ONLINE rac2 STABLE
ora.LISTENER.lsnr
ONLINE ONLINE rac1 STABLE
ONLINE ONLINE rac2 STABLE
ora.OCR.dg
ONLINE ONLINE rac1 STABLE
ONLINE ONLINE rac2 STABLE
ora.net1.network
ONLINE ONLINE rac1 STABLE
ONLINE ONLINE rac2 STABLE
ora.ons
ONLINE ONLINE rac1 STABLE
ONLINE ONLINE rac2 STABLE
ora.proxy_advm
ONLINE ONLINE rac1 STABLE
ONLINE ONLINE rac2 STABLE
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE rac2 STABLE
ora.LISTENER_SCAN2.lsnr
1 ONLINE ONLINE rac1 STABLE
ora.LISTENER_SCAN3.lsnr
1 ONLINE ONLINE rac1 STABLE
ora.MGMTLSNR
1 OFFLINE OFFLINE STABLE
ora.asm
1 ONLINE ONLINE rac1 STABLE
2 ONLINE ONLINE rac2 STABLE
3 OFFLINE OFFLINE STABLE
ora.cvu
1 ONLINE ONLINE rac1 STABLE
ora.oc4j
1 ONLINE ONLINE rac1 STABLE
ora.rac1.vip
1 ONLINE ONLINE rac1 STABLE
ora.rac2.vip
1 ONLINE ONLINE rac2 STABLE
ora.scan1.vip
1 ONLINE ONLINE rac2 STABLE
ora.scan2.vip
1 ONLINE ONLINE rac1 STABLE
ora.scan3.vip
1 ONLINE ONLINE rac1 STABLE
--------------------------------------------------------------------------------
[grid@rac1 ~]$
[grid@rac1 ~]$ srvctl config scan
SCAN name: scan.cndba.cn, Network: 1
Subnet IPv4:192.168.56.0/255.255.255.0/eth0
Subnet IPv6:
SCAN 0 IPv4 VIP: 192.168.56.21
SCAN name: scan.cndba.cn, Network: 1
Subnet IPv4:192.168.56.0/255.255.255.0/eth0
Subnet IPv6:
SCAN 1 IPv4 VIP: 192.168.56.22
SCAN name: scan.cndba.cn, Network: 1
Subnet IPv4:192.168.56.0/255.255.255.0/eth0
Subnet IPv6:
SCAN 2 IPv4 VIP: 192.168.56.20
[grid@rac1 ~]$