分类: Oracle
2017-11-23 14:26:40
RAC利用vip或者scan ip漂移实现数据库故障转移的高可用性,应用连接到数据库通常是连接vip(10g)或者scan ip(11g)并指定服务名为db_unique_name,连接会根据负载均衡自动分配到RAC集群的任一节点,某节点出现故障时vip漂移,实现应用连接透明切换。
这种连接方式的好处是在节点间实现负载均衡,将数据库压力分摊,不会导致某个节点因为连接过多而出现压力过载的问题。而缺点则是会增大节点间的通信和传输压力。
RAC架构实现数据一致性需要在节点间同步缓存,称为缓存融合。例如在节点1插入的数据,在节点2查询时,数据库会先在本地缓存查找,没找到则会到其他节点的缓存查找,再没找到才会去读取磁盘信息。应用的连接随机在某个节点,当查询时节点间的缓存同步将增多,当业务的操作很频繁时,这样的传输往往很耗性能。
service连接主要是在不同的节点设置不同的service名,指定不同的应用连接到固定的节点,方便连接管理,资源分配,减少节点间的缓存同步带来的开销。
使用service连接的好处在于,数据库正常情况下可以使应用总是连接到固定节点,可以设置service的首选节点和备用节点,数据库正常情况下,service运行在首选节点,通过该服务连接的应用会话就在该节点,这样就会很大程度的减少节点间的缓存传输。当数据库出现故障时,service可向备用节点进行漂移,服务不中断。
语法:srvctl add service -d db_unique_name -s service_name -r preferred_list
[-a available_list] [-P TAF_policy]
在集群的各个节点添加不同名称的service,例如在节点1添加testsv1,节点2添加testsv2
$ srvctl add service -d dbname -s testsv1 -r rac1 -a rac2 -P basic
$ srvctl add service -d dbname -s testsv2 -r rac2 -a rac1 -P basic
参数解释:
-d,集群数据库名
-s,需要添加的服务名
-r,首选节点,正常情况下该服务运行在该节点上
-a,备用节点,异常情况服务可漂移到该备用节点
-P,服务切换策略
集群的Failover(故障转移)功能,分为3种,分别为Client-Side Connect time Failover,TAF,service—side TAF。
其中Client-Side Connect time Failover为默认配置,在应用发起连接时感知到节点故障,则在tnsname里的地址表中尝试下一个,只在连接发起时才会起作用,当连接建立后如果节点故障,则会话会断开,需要重新进行连接。
在应用运行过程中如果节点故障,则连接到该节点的用户会自动切换到其他节点,对应用而言,这个过程是透明的,仅是未提交事务回滚。
实现该功能,在客户端的tnsnames.ora文件添加FAILOVER_MODE的配置项即可,该选项有的配置有4个参数需定义:
1、METHOD
basic:感知到节点故障时创建到其他实例的连接,切换有时间延迟
preconnect:连接建立时即在其他节点也创建一个不活动的连接,故障时可立即切换到其他实例,但不活动的连接也占用资源。
2、TYPE
定义故障发生时对select语句的处理。
select:故障时正在执行的select语句不中断,继续在其他实例上返回剩余的结果集
session:故障时正在执行的select语句中断,转移后需重新执行select语句
3、DELAY
重试间隔时间
4、RETRIES
重试次数
与客户端的TAF类似,只是在服务器端配置而已,Service-Side TAF 通过结合Service,在数据库里保存FAIL_MODE的配置,把所有的TAF配置保存在数据字典中,从而省去了客户端的配置工作,现在客户端的TNS文件就不需要任何TAF的配置选项了。
使用srvctl 创建service时,service-side TAF配置选项需要通过dbms_service包来配置。
Begin
Dbms_service.modify_service(
Service_name='>testsv1',
Failover_method=>dbms_service.failover_method_basic,
Failover_type=>dbms_service.failover_type_select,
Failover_retries=>180,
Failover_delay=>5
);
End;
语法:srvctl start service -d db_unique_name -s service_name
在集群任一节点启动服务,service会根据首选节点配置在对应节点启动
$ srvctl start service -d dbname -s testsv1
$ srvctl start -d dbname -s testsv2
说明:在数据库启动初期,service会根据节点上实例的启动先后顺序,在先启动的节点上自动启动,无论是不是首选节点,而当首选节点上的实例启动时,service不会自动漂移回首选节点,需手动切换。
例如:testsv1的首选节点是rac1,当集群重启时,节点rac2先启动完成,则testsv1会在rac2上启动,当rac1后启动时,testsv1不会自动切换回到rac1,需手动切换。
通过srvctl 对service的管理十分方便,包括起停增删改等。
srvctl config service:查看service配置
srvctl stop service:停止指定的service
srvctl remove service:删除service,如果删除不掉,可以加上-f参数
srvctl disable service:使service不可用
srvctl enable service:使service可用
srvctl modify service:修改service配置
srvctl relocate service:重新加载service
srvctl status service:查看service状态
客户端使用tnsnames.ora文件配置来解析oracle的连接信息,通过指定service name来连接,其中service_name参数需与添加的service名称相同。
tnsnames.ora配置参数如下:
TESTSV1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname1-vip)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = hostname2-vip)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = testsv1)
使用service管理连接,可以方便对应用进行分类和管理,同时,使用service来配置TAF(Transparent Application Failover),应用客户端的故障转移可以统一配置,在需要对服务端连接信息进行微调时,只需配置服务器端的tnsnames,而不需要对客户端一一进行配置。将应用正常连接时固定在同一节点,也能提高应用连接的性能。