8、Service的创建
像其他Database objects一样,Services也是通过data dictionary和动态性能视图来维护并追踪的。
每个Service都有一个唯一的name用于辨识它在本地cluster和全局data guard中的位置。
对于single-instance oracle,可以通过DBMS_SERVICE包创建Services。
在startup Instance时,也会根据初始化参数SERVICE_NAMES的值隐式的创建Services。
对于RAC环境中的高可用性特点,应该要么通过DBCA,要么通过命令行工具SRVCTL来创建Services。这个定义过程也隐式的创建了高可用性业务规则,并将通过CRS进行自动管理从而保持Services的可用性。高可用性业务规则被保存在OCR中。
1)用DBCA创建Services
在使用DBCA创建RAC Database时,可以添加或是删除Services,建立非常好的的设置,为Services配置透明的应用故障转移(transparent Application failover TAF)。在用DBCA创建、修改或是删除Service时,它会为Services配置CRS资源,同时设置net Service实体,并将其start。当用DBCA删除Services时,DBCA stop Service,删除CRS为其分配的资源,并删除网络服务实体。
在数据库被创建以后,也可使用DBCA执行关于Database Services 简单的管理操作。
2)用SRVCTL创建Services

图中建立了两个Services,AP和GL,存储在cluster repository中,并通过CRS管理。AP的首选Instance是RAC01,可用Instance是RAC02。
此外在oracle 10g中,RAC中一个Service可以有多个primary nodes。
note:还可使用SRVCTL的-P选项设置一个Service的transparent Application failover,该参数值可以是NONE、BASIC、PRECONNECT。

图中,初始化定义了ERP Service,其preferred Instances是RAC01和RAC02,available Instances是RAC03和RAC04。
起初,ERP连接都是指向RAC01和RAC02的。当RAC02失败并down机后,CRS检测到RAC02的的失败,由因为ERP的基数是2,则CRS会在一个available Instance上重建一个Service,这里选用了RAC03 。此时,ERP的连接请求被指向了RAC01和RAC03上,用于提供当前的服务。尽管CRS可以restart RAC02,但是ERP Service并不会回退给RAC02。此时,RAC02和RAC04是available Instances。
note:可以手工的发起SRVCTL命令relocate Service,使服务回退给RAC02 。
9、everything switches to Services
* data dictionary 为Services提供维护
* automatic workload repository(AWR)管理着Services的性能。AWR记录了Service相关的SQL执行时间、等待类型和资源开销。当响应时间超过某个阙值,AWR会发出alerts。特定的动态性能视图显示了当前Service在历史一小时内的状态信息。
* Database resource Manager可用于Services的管理从而优化Instance中的应用工作量。
* 此外,jobs scheduler 、并发进程、streams queue也可在Service下运行。
* RAC的高可用性架构确保了Services在一个site是可用的。
* data guard broker与RAC相结合,可以通过转移primary Service到其他data guard site从而获得容灾性。
10、在client 应用中使用Services
应用程序和中间层连接池通过使用TNS连接描述符选择Service。例如:
ERP=(DESCRIPTION=
(LOAD_BALANCE=on)
(ADDRESS=(PROTOCOL=TCP)(HOST=node-1vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-2vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-3vip)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=node-4vip)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=ERP)))
注意,address列表中不应该使用hostname,而应该使用虚拟ip(VIP)从而确保当连接的node宕机后能得到及时的ip迁移,从而快速返回timeout。
下面显示的分别是thick和thin JDBC连接描述:
url=”jdbc:oracle:oci:@ERP”
url=”jdbc:oracle:thin:@ERP”
note:LOAD_BALANCE=ON 用于oracle net,从而随机的将请求发到连接描述符的地址。这被称作是client的负载平衡。