ORACLE RAC 架构高性能应用系统环境

   这段时间,我在更改各省的datasource.xml 发现花样百出,缺乏统一的规范和标准。

后面要做的是,就是建立规范,监督执行,和持续改进。

    规范的标准

        连接oracle数据库工厂要用c3p0

        连接sybase数据库工厂要用 direct

        有ref应用,再写明细就没有用了

<SYCHWORKFLOW  type = "oracle" ref="Default"> 
      <property name = "driver">oracle.jdbc.driver.OracleDriver</property > 
      <property name = "url"><![CDATA[jdbc:oracle:thin:aaa/aaa@255.255.255.255:1521:sid]]></property> 
</SYCHWORKFLOW>

        以上这个例子就是错误的,用了ref 引用了default ,后面的东西就有用了

        用ref 引用前面的说明的时候 需要添加pool ,复用原来的链接池。

   <SYCHWORKFLOW  ref="pool:Default"/> </SYCHWORKFLOW>

    这样做的好处是,可以有效降低 数据库服务进程数量。减少服务器的内存开销。

    在研究oracle相关技术文档后,我发现这样的做法,可以提高 不解析的 百分比。这点太重要了。

不解析,比软解析和硬解析不仅仅是快的问题,对数据库的性能消耗也少,带来的性能提升效果是链式的。

    内存释放出来以后,可以分配更多的pga 和sga,在目前数据没有高效的存储前提下,只有通过

sga,pga 来改善磁盘IO了.一张RPT表几条记录,64K空间,不用索引,全表扫描,2次IO,很奢侈。性能

就是这样被一点一点消耗的。

    

    前面说了,datasource.xml的引用和池问题。下面重点关注一下

      <property name = "url"><![CDATA[jdbc:oracle:thin:aaa/aaa@255.255.255.255:1521:sid]]></property> 

    在rac 环境下,如何写好上面这句话呢?我们先简单的了解一下  几个专用名词和rac 的架构。

    数据库名:    用户数据,和数据库服务器数据的集合。

        举个例子, 电影文件是数据吧。

            老爸老妈罗曼史  是一个数据库

            仙剑奇侠传3  是一个数据库

    实例名:正在运行的数据库服务器程序的名称

       举个例子:(正在运行的)(((暴风影音程序的)进程的)名字)

                                             定语        定语     定语

            定语太多了,我打括号

            开两个暴风影音的窗口 ,就是两个暴风影音实例

            开三个wps文档程序,就是 三个wps文档实例

            两台小型机各运行一个数据库服务器程序,就是两个数据库实例

    服务名:9i以后提出了服务的概念。服务的概念类似于现在很热的云。客户不需要知道具体是哪个实例提供数据库服务的,只要使用这个服务就可以了。就像现在用的电,你只要从电网交钱取电就可以,而不需要知道你现在用的电是从哪个煤电厂或者核电厂,风电厂发出来的。

    具体到数据库,数据库实例提供了一种访问数据库的方法,同时也提供了访问数据库的服务,一个实例可以提供多个服务,也可以用多个实例捆绑成一个服务。

    SQL> show parameter service

            NAME                                 TYPE        VALUE
            ------------------------------------ ----------- ------------------------------
            service_names                        string      oralab
    SQL> alter system set service_names=oralab,ysyf,gl,zjgc,rpt,zjgk,zcgl,tmszc,khhs,xmhs,tmsfzwf;

    service_names         是服务器动态参数。可以随时更改。

    

这样在监听程序里面:

LSNRCTL> status
正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=xiaomxruntoocm)(PORT=1521)))
LISTENER 的 STATUS
------------------------
别名                      LISTENER
版本                      TNSLSNR for 32-bit Windows: Version 10.2.0.4.0 - Production
启动日期                  14-5月 -2011 11:01:16
正常运行时间              0 天 0 小时 9 分 9 秒
跟踪级别                  off
安全性                    ON: Local OS Authentication
SNMP                      OFF
监听程序参数文件          D:/oracle/product/10.2.0/db_1/network/admin/listener.ora
监听程序日志文件          D:/oracle/product/10.2.0/db_1/network/log/listener.log
监听端点概要...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xiaomxruntoocm)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=xiaomxruntoocm)(PORT=15210)))
服务摘要..
服务 "GL" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "KHHS" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "RPT" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "TMSFZWF" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "TMSZC" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "XMHS" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "YSYF" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ZCGL" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ZJGC" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...
服务 "ZJGK" 包含 1 个例程。
  例程 "oralab", 状态 READY, 包含此服务的 1 个处理程序...

     这是一个实例 提供了多个服务,包括:管理, KH核算,报表,TMS辅助流程,TMS资产,项目核算,

应收应付,资产管理,在建工程,资金管控 这些服务。

再来看一下 tnsname.ora 服务名配置的 例子

ORALAB =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 15200))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 25200))

      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 25200))

      (LOAD_BALANCE = yes)
    )
    (CONNECT_DATA =
      (SERVICE_NAME = oralab)
    )
  )

用netmgr 编辑以上的 服务名,会发现旁边有一个高级按钮,点击出来一个 地址列表选项窗口。

    按顺序尝试每个地址,直到有一个地址成功                    failover 故障转移 ,

                       但tnsnames.ora里面没有写任何failover=yes的选项

    随机尝试每个地址,直到成功           均衡负载,加故障转移

                     (LOAD_BALANCE = yes),没有写任何failover=yes的选项

    随机选择尝试一个地址                                                 负载均衡,但不故障转移

                     (LOAD_BALANCE = yes)(FAILOVER = false)

    按顺序使用每个地址,直至到达目标          (SOURCE_ROUTE = yes)(FAILOVER = false)

    只使用第一个地址                不故障转移(FAILOVER = false)

                

    failover 只有在flase 的时候才会写出来。负载均衡只有在yes的时候才会写出来

        RAC特性:

架构:
多个数据库实例运行在各自的主机上,共同访问共享磁盘上的数据库。
多个数据库实例要协同工作,引入CRS集群软件。
CRS集群就绪软件通过三个模块来实现多实例的协同工作:
GRD 全局资源目录 global resource directory
存放集群数据库资源在各个实例的使用情况,动态更新数据库资源被那一个实例主控。
GCS 全局缓存服务  global cache services
在各实例之间通过内联高速网络传递数据块。
GES 全局队列服务  global enqueue services
管理数据字典锁,库缓存锁,队列。
RAC下的数据查询:
当用户在实例A提交查询语句,实例A发现自己的高速缓存中没有需要的数据块(NEEDBLOCKS)时,优先调用GRD询问其他实例是否缓存了数据块。这时实例B的高速缓存中有实例A需要的数据块,实例B通过GCS服务的内存融合技术,直接把数据块通过内联网络传递到实例A。实例A就不需要去磁盘抓取数据。如果此时实例B正在修改数据块(NEEDBLOCK),而实例A查询的是老版本的数据块,那么实例B会从UNDO表空间的回滚段中取出老版本数据块,传送给实例A。就回造成全局一致性读的等待事件。所以变化频繁的热点数据最好只在一个数据库实例上被应用系统访问。

    

分析系统中各业务模块的数据库结构设计。把对数据库对象访问相似的业务模块
归类在一起,集中访问RAC中的一个实例。在业务上做垂直切割,各业务模块只使用自己
的数据库实例。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值