1、问题背景
曾经在某移动SOA项目碰到一个多数据源failover切换问题,其实每月深度巡检SOA套件都发现OSB和SOA环境所使用的数据源存在连接失败或连接超时问题,甚至无法进行failover切换。OSB和SOA这四个domain采用的是多数据源配置,一旦其中一个RAC中的节点出现了故障,无法进行failover切换,最后会导致大量流程调用失败,流程因此受阻,直接影响到了日常业务办理。
系统环境信息:
操作系统:HP-UX B.11.31
JDK版本:JDK1.7.0.03
中间件版本:weblogic10.3.6.0.12
SOA11.1.1.6.0
OSB11.1.1.6.0
集群:是
2、问题分析过程
在巡检日志文件中发现大量关于数据源的错误及警告信息,主要分布在SOA/OSB涉及的四套domain服务日志文件AdminServer.log,domain和server等日志中。但每天都会频繁产生中间件数据源无法连接RAC1节点数据库异常问题,客户也反馈业务时常不可用,流程调用失败,影响到了业务。
以下是weblogic日志中筛选出来的报错信息:
同时也在weblogic控制台监视到了OSB和SOA这几个domain实例的数据源,RAC1对应的数据源存在大量连接失败。可想期间中间件数据源与数据库之间出现断连现象。问题期间存在网络不稳定或是数据库异常问题。最后导致RAC1数据源连接不上数据库节点实例,但连接rac0的数据源连接都正常。后面有向客户提出网络是否稳定?数据库是否异常?当时客户安排了网络工程师和DBA一起来排查问题。网络工程师排查了网络没有出现丢包和网络不稳定问题。DBA排查发现RAC1节点确实有不稳定现象。想想不对啊,虽然数据库不稳定,但我们中间件是多数据源可以实时failover切换啊,为什么不行了。现在抛出数据库问题不管,我们本身中间件的多数据源故障转移机制是否存在问题,针对这种情况我们查了SOA和weblogic很多服务日志和翻阅了很多文档,查到是多数据源的机制出现问题了。
以下是报错截图:
3、问题原因
由于客户的数据库其中某个节点不稳定,而SOA和OSB服务采用多数据源配置,无法进行数据源failover切换。针对WebLogic10.3.4后数据源配置官方建议对于RAC仅支持多数据源/GridLink数据源配置,而多数据源是ORACLE 10G RAC以下版本常用的方法,而使用多数据源功能对于容错和负载均衡相对有限。目前应用端使用多数据源来连接ORACLE 11G RAC可能会存在failover局部切换不稳定的问题。因此我们提出建议客户使用GridLink数据源。
4、优化建议
1、我们提出让客户将原来的多数据源改造成GridLink数据源,以防数据库RAC节点异常,中间件数据源自动切换正常数据库节点。整个改造过程发了半个月左右,将原来SOA和OSB所用到的多数据源替换成了GridLink数据源,数据库连接地址统一用scan ip和service_name。切换成功后,经过几轮业务高峰期观察,数据库断连问题消除了。以后数据库有异常都能够正常切换,对业务无影响。
2、解决数据库异常问题。
通过这次问题我们引入了GridLink组件解决了数据源failover切换问题,接下来简单介绍一下GridLink数据源是一个什么好东西。
5、GridLink数据源介绍
GridLink是WebLogic 10.3.4新推出的数据源类型,引入Jdbc 11g version驱动,全面支持Oracle 11G RAC AWM的特性,提供了针对Oracle RAC数据库与WLS之间的连接功能。GridLink通过Oracle通知服务(ONS)来获取Oracle RAC实例的状态变化。WLS可以通过Oracle RAC灵活的数据库服务设计来满足其需求,也可以由数据库服务的增加而扩展而不需要关注RAC 集群中的物理结构变化。
Weblogic10.3.4以前的版本是没有这个功能的,请关注下图:
6、GridLink数据源特性
1.简化和统一了对RAC连接配置的模块。
2.支持Fast Connection Filover(FCF)。
3.支持Runtime Connection Load Balancing(RCLB)。
4.支持Single Client Access Name(SCAN)。
5.Oracle RAC停机的正常处理。
此图源于网络:
7、GridLink数据源优势
WebLogic 10.3.4中,为了增强对RAC的支持,Oracle推出了Gridlink数据源,取代原先的多数据源。原来的多数据源的工作原理是为每台RAC的结点配置一个数据源,然后把所有的这些数据源聚合起来配置一个多数据源。虽然多数据源也提供容错和负载均衡,但是它的功能相对才是有限。
1)配置简易
只需要配置一个Gridlink 数据源,它就会处理与后台的RAC数据库的通讯。相对多数据源管理员的工作量减少很多。
如果配置了Oracle的SCAN服务就更简单了,RAC结点的添加删除都是自动完成,因为对Gridlink数据源来说,它只知道一个SCAN地址就好了。就好象一个域名一样,你不需要知道后面用了多少IP来实现。而多数据源需要配置多个VIP地址和数据库instnace。
2)高效容错
使用ONS,Gridlink数据源可以实时的捕捉到RAC端的信息。如果有数据库节点出错,Gridlink数据源很快将与其对应的连接标识为不可用。
多数据源需要开启测试连接功能,当应用向一个数据源申请一个连接的时候,WebLogic需要先测试这个连接再返回。如果测试失败,WebLogic会重建一个连接。如果重建再失败,数据源就会被标识成dead,然后WebLogic自动Failover到下一个多数据源里面的数据源。在使用连接中需要不断主动测试连接,保证获取正常可用连接,但是这样会带来的资源开销。
3)实时负载
Gridlink 数据源相对来说更有效率,因为它很大程度上借助了数据库的功能。它使用了Oracle的ONS(Oracle Notification Service)的特征。Gridlink数据源可以知道哪些RAC节点很忙,哪些很闲,于是它可以有效的将哪些来自空闲RAC的连接分配给应用请求,实现实时负载均衡。
多数据源如果一个应用开启了多个连接,那么根据轮询的原则,这多个连接可能会来自多个不同的数据库节点。这个实际上有性能上的影响。
4)沉稳应对RAC节点的关闭
如果是有计划关闭RAC节点,Gridlink数据源会等当前活动的事务结束再关闭连接。新的连接请求将被发送到其他的RAC节点。
如果是突发的RAC节点关闭,Gridlink数据源也会沉着的将当前的事务rollback,然后将新的连接请求发送到其他的RAC节点。
5)全局事务唯一
Gridlink数据源在一个事务的第一个连接创建后会将该事务的所有后续连接请求发送到同一个RAC节点上。这样可以减少后台同步处理,提高全局事务的运行效率
多数据源的轮询策略会造成同一个事务的多个连接被发送到不同的RAC节点上。
8、GridLink数据源参考文档
http://docs.oracle.com/middleware/12212/wls/JDBCA/gridlink_datasources.htm#JDBCA373
http://www.oracle.com/technetwork/middleware/weblogic/wls-jdbc-gridlink-howto-333331.html
欢迎大家关注我的微信公众号,里面有很多相关的技术干货,也能随时联系到我。谢谢!