demystifying oracle rac workload management by alex gorbachev, pythian | nocoug 2010 spring...

Post on 11-May-2015

5.016 Views

Category:

Technology

2 Downloads

Preview:

Click to see full reader

DESCRIPTION

This presentation starts with a brief overview of connection management in Oracle RAC and then focuses on workload management, including exploiting cluster services, connection load balancing, and run-time workload balancing. Finally, it shows how to create your own run-time workload management, using the standard load balancing advisory framework. The presentation goes through demonstrations using a live Oracle RAC cluster, illustrating the internals of workload management and how to monitor it. The live demos simplify understanding of this rather complex topic.

TRANSCRIPT

Demystifying Oracle RAC

Workload Management

North California Oracle User Group

20-May-2010

Alex Gorbachev

© 2009/2010 Pythian

Alex Gorbachev today...

• CTO, The Pythian Group

• Blogger

• OakTable Network member

• Oracle ACE Director

• BattleAgainstAnyGuess.com

• Vice-president, Oracle RAC SIG

2

© 2009/2010 Pythian

Why Companies Trust Pythian• Recognized Leader:

• Global industry-leader in remote database administration services and consulting for Oracle, Oracle Applications, MySQL and SQL Server

• Work with over 150 multinational companies such as Forbes.com, Fox Interactive media, and MDS Inc. to help manage their complex IT deployments

• Expertise:

• One of the world’s largest concentrations of dedicated, full-time DBA expertise.

• Global Reach & Scalability:

• 24/7/365 global remote support for DBA and consulting, systems administration, special projects or emergency response

3

© 2009/2010 Pythian

Where we are...

!Client-side basics

• Oracle Cluster Services

• Server-side CLB

• FAN - HA & LBA events

• Thin JDBC RLB

• ONS Subscriber

• Your own LBA!

© 2009/2010 Pythian

Simple example

• Establishing one connection

• Dedicated server

• Several RAC nodes

© 2009/2010 Pythian

Client-side CLB

(DESCRIPTION= (ADDRESS_LIST= (LOAD_BALANCE=ON) (FAILOVER=ON) (ADDRESS=(PROTOCOL=TCP)(HOST=lh1-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=lh2-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=lh3-vip)(PORT=1521)) (ADDRESS=(PROTOCOL=TCP)(HOST=lh4-vip)(PORT=1521)) ) (CONNECT_DATA=(SERVICE_NAME=service10g)) )

6

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vip

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vip

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vip

LOAD_BALANCE=OFF

FAILOVER=OFF

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vip

LOAD_BALANCE=OFF

FAILOVER=OFF

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vipLOAD_BALANCE=OFF

FAILOVER=ON

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vipLOAD_BALANCE=OFF

FAILOVER=ON

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vip

LOAD_BALANCE=ON

FAILOVER=ON

© 2009/2010 Pythian

Client-side connection balancing

and connection-time failover

lh1

LISTENER_G41

lh2

LISTENER_G42

lh3

LISTENER_G43

lh4

LISTENER_G44

lh1-vip

lh2-vip

lh3-vip

lh4-vip

LOAD_BALANCE=ON

FAILOVER=ON

© 2009/2010 Pythian

Summary – client-side business

•Client chooses between several addresses

•Why• Failure tolerance

• Distribution across several listeners

•How• Several connection points in connection descriptor

• LOAD_BALANCE=ON

• FAILOVER=ON

© 2009/2010 Pythian

Listener – where to direct request?

lsnrctl status……

Service "service10g" has 2 instance(s).

Instance "g41", status READY, has 1 handler(s) for this service...

Instance "g42", status READY, has 1 handler(s) for this service...

……

© 2009/2010 Pythian

Where we are...

!Client-side basics

!Oracle Cluster Services

• Server-side CLB

• FAN - HA & LBA events

• Thin JDBC RLB

• ONS Subscriber

• Your own LBA!

© 2009/2010 Pythian

Orders processing example

• Business areas

• Customers’ order (web)

• Content display (web cached on app-tier)

• Feedback (web)

• Orders fulfillment (back-office)

• Data extraction batches

11

© 2009/2010 Pythian

Services: preferred & available

DB1 DB4DB3DB2

NEW_ORD NEW_ORD NEW_ORD NEW_ORD

CONTENT CONTENT CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORDPROC_ORD

BATCHBATCH

FEEDBACKFEEDBACK

12

© 2009/2010 Pythian

Node affinity

DB1 DB4DB3DB2

NEW_ORD NEW_ORD

CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORDPROC_ORD

BATCH

13

© 2009/2010 Pythian

Service failover

DB1 DB4DB3DB2

NEW_ORD NEW_ORD

CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORDPROC_ORD

BATCH

14

© 2009/2010 Pythian

Service failover

DB1 DB4DB3DB2

NEW_ORD NEW_ORD

CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORDPROC_ORD

BATCH

NEW_ORD

14

© 2009/2010 Pythian

Service failover

DB1 DB4DB3DB2

NEW_ORD NEW_ORD

CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORDPROC_ORD

BATCH

NEW_ORD

14

© 2009/2010 Pythian

Service failover

DB1 DB4DB3DB2

NEW_ORD NEW_ORD

CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORD

NEW_ORD

PROC_ORD

BATCH

14

© 2009/2010 Pythian

Service failover

DB1 DB4DB3DB2

NEW_ORD NEW_ORD

CONTENT CONTENT

FEEDBACK FEEDBACK

PROC_ORD

NEW_ORD

PROC_ORD

BATCH

14

© 2009/2010 Pythian

Demo 1 - Services Automation

• HA events introduction

• Logging example

• Using server-side FAN HA events callouts

15

© 2009/2010 Pythian

Server-side FAN HA events

• Server-side callout can be used for:

• Relocating services back to preferred nodes

• Smart services handling

• Notify and move sessions after service Down

• Rebalance sessions on service up

• Accommodate workload re-balancing for legacy applications

16

© 2009/2010 Pythian

Services & Resource Manager

DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING (DBMS_RESOURCE_MANAGER.SERVICE_NAME, 'NEW_ORD', 'NEW_ORD_GROUP');

DBMS_RESOURCE_MANAGER.SET_CONSUMER_GROUP_MAPPING (DBMS_RESOURCE_MANAGER.SERVICE_NAME, 'CONTENT', 'CONTENT_GROUP');

...

• Works on instance level - not RAC-aware

• Doesn’t account for >1 instances per node

17

© 2009/2010 Pythian

Services abstraction for apps

• Applications don’t need to know current services configuration!

• Listeners know services status

• Listeners control which instance gets a new connection

18

© 2009/2010 Pythian

Where we are...

!Client-side basics

!Oracle Cluster Services

!Server-side CLB

• FAN - HA & LBA events

• Thin JDBC RLB

• ONS Subscriber

• Your own LBA!

© 2009/2010 Pythian

Remote listener registration

lh1

G41

LISTENER_G41

lh2

G42

LISTENER_G41

© 2009/2010 Pythian

Remote listener registration

Local registrationG41.local_listener=LISTENER_G41

G42.local_listener=LISTENER_G42

G43.local_listener=LISTENER_G43

G44.local_listener=LISTENER_G44

lh1

G41

LISTENER_G41

lh2

G42

LISTENER_G41

© 2009/2010 Pythian

Remote listener registration

Local registrationG41.local_listener=LISTENER_G41

G42.local_listener=LISTENER_G42

G43.local_listener=LISTENER_G43

G44.local_listener=LISTENER_G44

lh1

G41

LISTENER_G41

lh2

G42

LISTENER_G41

Remote registration*.remote_listener=LISTENERS_G4

© 2009/2010 Pythian

Correct listener configuration(google for Pythian video VIP)

lsnrctl service

Service "service10g.oracloid.com" has 2 instance(s). Instance "g41", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready REMOTE SERVER (ADDRESS=(PROTOCOL=TCP)(HOST=lh1-vip)(PORT=1521)) "DEDICATED" established:0 refused:0 state:ready LOCAL SERVER Instance "g42", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready REMOTE SERVER (ADDRESS=(PROTOCOL=TCP)(HOST=lh2-vip)(PORT=1521)) Instance "g43", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 state:ready REMOTE SERVER (ADDRESS=(PROTOCOL=TCP)(HOST=lh3-vip)(PORT=1521)) Instance "g44", status READY, has 1 handler(s) for this...

© 2009/2010 Pythian

Server-side CLB

G41

LISTENER_G44

G42 G43 G44

22

© 2009/2010 Pythian

Server-side CLB

G41

LISTENER_G44

G42 G43 G44

Which instance?

22

© 2009/2010 Pythian

Server-side CLB

G41

LISTENER_G44

G42 G43 G44

Which instance?

• <= 10gR1

• Instance load

• Node load

22

© 2009/2010 Pythian

Server-side CLB

G41

LISTENER_G44

G42 G43 G44

Which instance?

• <= 10gR1

• Instance load

• Node load

• 10gR2

• Service Metrics

• AWR

22

© 2009/2010 Pythian

Tracing listener

lsnrctl trace user

nsglgrDoRegister: inst loads: ld1:145 mld1:5120 ld2:5 mld2:170

nsglgrDoRegister: inst loads: ld1:58 mld1:5120 ld2:4 mld2:170

•No notion of instance name in trace !

• ld1 – Load Data 1, mld1 – Max Load Data 1

• ld2 – Load Data 2, mld2 – Max Load Data 2

• Load data is instance load and node load

Demo helper

© 2009/2010 Pythian

PREFER_LEAST_LOADED_NODE

• listener.ora parameter

• PREFER_LEAST_LOADED_NODE_%

• ON (default)

• ld1 => node, ld2 = > instance

• OFF

• ld1 => instance, ld1 => node

Demo helper

© 2009/2010 Pythian

Instance and node loads

• Instance load• Number of user sessions

• TYPE<>BACKGROUND

•Max instance load• Max number of sessions

• SESSIONS init.ora

• Node load

• Index based probably on load average

• Max node load

• Max CPU capacity

• cpu_count*5K

Demo helper

© 2009/2010 Pythian

Uneven connection distribution

• PREFER_LEAST_LOADED_NODE_...=ON

• Default

• Listener uses CPU load to balance connections to the machine with more CPU capacity left

• Can work fine with differently sized nodes

• But what if connections are “permanent”?

Demo helper

© 2009/2010 Pythian

“Even” connection distribution

PREFER_LEAST_LOADED_NODE_LISTENER_G41=OFF

PREFER_LEAST_LOADED_NODE_LISTENER_G42=OFF

• Load based on number of sessions left until maximum is reaches

• init.ora parameter SESSIONS

• Can configure SESSIONS differently for every node and influence distribution

Demo helper

© 2009/2010 Pythian

Demo 3 - 9i style CLB

• listener trace

• PREFER_LEAST_LOADED_NODE

• instance load

• node load

• PMON trace 10257 event

28

© 2009/2010 Pythian

9i and 10gR1 CLB summary

• PMON reports to listener

• instance load

• node load

• PREFER_LEAST_LOADED_NODE

• ON - node load (default)

• OFF - instance load

• lsnrctl trace user

• PMON: 10257 trace name context forever, level 16

29

© 2009/2010 Pythian

DB_DOMAIN and bug 5593693

• db_domain init.ora parameter is set

• service_name is not FQDN

• that’s what srvctl does

• Listener appends default domain

• Service metrics updates are lost

• on the way from PMON => listener

• Result: fallback to instance / node load

• Fixed - 10.2.0.4 & 11.1.0.6

30

© 2009/2010 Pythian

10gR2 and 11g server-side CLB

• Service metrics for each service

• GOODNESS

• Attractiveness of the instance for this service

• Higher is worse (should be BADNESS)

• DELTA

• Estimate of “badness” increase for additional session

• FLAGS (bit map)

• 0 – all good

• 1 – blocked

• 2 – crossed threshold

• 4 – goodness unknown (usually when no sessions connected)

31

© 2009/2010 Pythian

Connection life-time

• Short living sessions

• Persistent / Oracle Forms / long connections

• Connection pool

• Oracle standard connection pool

• Custom connection pool

• Application server connection pool

© 2009/2010 Pythian

Connection classification & CLB

• Long connections

• idle most of the time (!)

• persistent connections (non-pooled)

• over-allocated connection pools

• Short connections

• active most of the time

• dynamic connection pools

• Batch-like connection

• long but always active

• under-allocated connection pools (!)

33

© 2009/2010 Pythian

CLB goal

• CLB_GOAL_LONG

• equal distributions of sessions

• CLB_GOAL_SHORT

• based on Service Metrics and LBA goal (!)

• GOAL_NONE

• GOAL_SERVICE_TIME

• GOAL_THROUGHPUT

34

© 2009/2010 Pythian

Demo 4 - Service Metrics & CLB

• CLB_GOAL_LONG

• CLB_GOAL_SHORT

• listener trace

• PMON trace

• V$SERVICEMETRIC

35

© 2009/2010 Pythian

10g services load balancing

• For each service defined:

• Connection load balancing goal

• CLB_GOAL_SHORT

• CLB_GOAL_LONG

• Load Balancing Advisory - LBA

• GOAL_SERVICE_TIME

• GOAL_THROUGHPUT

© 2009/2010 Pythian

V$SERVICEMETRIC

• For each service and instance contains

• Short interval (5 seconds)

• Long interval (60 seconds)

• INTSIZE_CSEC

• CPUPERCALL

• DBTIMEPERCALL

• CPUPERSEC

• DBTIMEPERSEC

© 2009/2010 Pythian

V$SERVICEMETRIC (cont’d)

• GOODNESS

• Attractiveness of the instance for this service

• Higher is worse (should be BADNESS)

• DELTA

• Estimate of “badness” increase for additional session

• FLAGS (bit map)

• 0 – all good

• 1 – blocked

• 2 – crossed threshold

• 4 – goodness unknown (usually when no sessions connected)

© 2009/2010 Pythian

GOODNESS and CLB_GOAL

• LONG

• GOODNESS=number of connected sessions

• DELTA=1

• SHORT

• Calculated based on

• GOAL_SERVICE_TIME

• GOAL_THROUGHPUT

• GOAL_NONE

© 2009/2010 Pythian

GOODNESS and CLB_GOAL_SHORT

• According to my observations

• GOAL_SERVICE_TIME

• “per call” metrics used

• CPUPERCALL

• DBTIMEPERCALL

• GOAL_THROUGHPUT

• “per second” metrics used

• CPUPERSEC

• DBTIMEPERSEC

© 2009/2010 Pythian

Listener trace… again

• We can see goodness and delta when instance/service started

nsglgrDoRegister: Creating new service: service10g

nsglgrDoRegister: service:service10g

flag:2 goodness:0 delta:0

• During service updatesnsglgrDoRegister: service:service10g what:4 value:1

nsglgrDoRegister: service:service10g what:2 value:47

• what: 2 = goodness

• what: 4 = delta

© 2009/2010 Pythian

How does listener know about it?

• MMON is the “calculator”

• V$SERVICEMETRIC

• PMON is the “messenger”• 10257 trace name context forever, level 16

© 2009/2010 Pythian

PMON trace example

• 11g trace

*** 2007-09-19 05:52:24.797

kmmlrl: update for session drop delta:

111 106 10 10 82

kmmlrl: service11g.oracloid.com goodness 8

kmmlrl: update for service goodness

kmmlrl: 55 processes

kmmlrl: node load 358

kmmlrl: instance load 19

kmmlrl: nsgr update returned 0

© 2009/2010 Pythian

Service Metrics & CLB

• CLB_LONG

Target - equal number of sessions per instance

GOODNESS=number of session, DELTA=1

• CLB_SHORT + GOAL_NONE

Target - equalize CPU utilization

GOODNESS and DELTA => based on run-queue / load average

• CLB_SHORT + GOAL_SERVICE_TIME

Target - minimize response time

GOODNESS + DELTA <= LBA _PER_CALL (?)

• CLB_SHORT + GOAL_THROUGHPUT

Target - maximize throughput

GOODNESS + DELTA <= LBA _PER_SEC (?)

© 2009/2010 Pythian

Nodes with different capacity

• Works with instance load

• use different SESSIONS in init.ora

• Works with node load

• based on CPU_COUNT

• Service Metrics?

• bug 6613950

• CLB_GOAL_SHORT is slower than node load (my observations)

• CLB faster than RLB

45

© 2009/2010 Pythian

Where we are...

!Client-side basics

!Oracle Cluster Services

!Server-side CLB

!FAN - HA & LBA events

• Thin JDBC RLB

• ONS Subscriber

• Your own LBA!

© 2009/2010 Pythian

Clusterware processes

Diagram from Barb Lundhild’s presentation

© 2009/2010 Pythian

ONS Configuration

•$ORA_CRS_HOME/opmn/conf/ons.config

localport=6101

#10g

#remoteport=6201

loglevel=9

useocr=on

• $ORA_CRS_HOME/bin/onsctl start/stop/ping

• $ORA_CRS_HOME/bin/racgons add_config/remove_config

48

© 2009/2010 Pythian

Demo 6 - LBA events

• ONS logeventType: database/event/servicemetrics/service10gVERSION=1.0 database=g4 { {instance=g42 percent=34 flag=GOOD} {instance=g43 percent=33 flag=GOOD} {instance=g41 percent=33 flag=GOOD} } timestamp=2008-02-11 03:24:18

• SYS.SYS$SERVICE_METRICS_TAB

49

© 2009/2010 Pythian

Using FAN events on app-tier

• ONC – Oracle Notification Client

• Java ONS API

• C ONS API

• Can be used to manage non-pooled connections or home-grown pools

• Can be standalone ONC – no JDBC/OCI

• – – – local ONS is required (at least with 10g)

© 2009/2010 Pythian

Where we are...

!Client-side basics

!Oracle Cluster Services

!Server-side CLB

!FAN - HA & LBA events

!Thin JDBC RLB

• ONS Subscriber

• Your own LBA!

© 2009/2010 Pythian

Establishing a Connection

52

Java Connection Pool

Instance InstanceInstance

© 2009/2010 Pythian

Establishing a Connection

52

Java Connection Pool Client-side connection load balancing(if not using 11gR2 SCAN listener)

Instance InstanceInstance

© 2009/2010 Pythian

Establishing a Connection

53

Java Connection Pool

Instance Instance Instance

© 2009/2010 Pythian

Establishing a Connection

53

Java Connection Pool

Instance Instance Instance

SCAN Listener

© 2009/2010 Pythian

Establishing a Connection

53

Java Connection Pool 11gR2 -> hando" to SCAN listener(optionally)

Instance Instance Instance

SCAN Listener

© 2009/2010 Pythian

Establishing a Connection

53

Java Connection Pool

Instance Instance Instance

SCAN Listener

SCAN listener is not doing CLB instead of the client itself

© 2009/2010 Pythian

Establishing a Connection

53

Java Connection Pool

Instance Instance Instance

SCAN Listener

Server-side CLB by listeners

© 2009/2010 Pythian

RLB - connection gravitation

54

Connection Pool (90 sessions)

© 2009/2010 Pythian

RLB - connection gravitation

54

Connection Pool (90 sessions)

Establishing connections

© 2009/2010 Pythian

RLB - connection gravitation

54

Connection Pool (90 sessions)

30 30 30

instance 1 instance 2 instance 3

Establishing connections

© 2009/2010 Pythian

RLB - connection gravitation

54

Connection Pool (90 sessions)

30 30 30

33% 33% 34%

instance 1 instance 2 instance 3

LBA event

© 2009/2010 Pythian

RLB - connection gravitation

54

Connection Pool (90 sessions)

30 30 30

20 20 20

33% 33% 34%

instance 1 instance 2 instance 3

DB tra#c

© 2009/2010 Pythian

RLB - connection gravitation

54

Connection Pool (90 sessions)

30 30 30

20 20 20

33% 33% 34%

instance 1 instance 2 instance 3

© 2009/2010 Pythian

RLB - connection gravitation

55

Connection Pool (90 sessions)

50% 25% 25%

instance 1 instance 2 instance 3

© 2009/2010 Pythian

RLB - connection gravitation

56

Connection Pool (90 sessions)

80% 10% 10%

instance 1 instance 2 instance 3

© 2009/2010 Pythian

RLB - connection gravitation

56

Connection Pool (90 sessions)

80% 10% 10%

instance 1 instance 2 instance 3

?

© 2009/2010 Pythian

RLB - connection gravitation

56

Connection Pool (90 sessions)

80% 10% 10%

instance 1 instance 2 instance 3

?

Connection pool must be over-allocated!

© 2009/2010 Pythian

RLB - how is workload gravitated?

57

0

3.0

6.0

9.0

12.0

INST1 INST2 INST3

Time

Cum

ula

tive c

onnecti

ons g

iven

50%

25%

25%

© 2009/2010 Pythian

CLB options for RLB

58

Connection Pool

instance 1 instance 2 instance 3

CLB_SHORT

© 2009/2010 Pythian

CLB options for RLB

58

Connection Pool

instance 1 instance 2 instance 3

CLB_SHORT

Establishing connections

© 2009/2010 Pythian

CLB options for RLB

58

Connection Pool

instance 1 instance 2 instance 3

CLB_SHORT

Establishing connections

Connections requests burst - most go to the node with the lowest goodness

© 2009/2010 Pythian

CLB options for RLB

58

Connection Pool

instance 1 instance 2 instance 3

CLB_SHORT

Establishing connections

Connections requests burst - most go to the node with the lowest goodness

© 2009/2010 Pythian

CLB options for RLB

59

Connection Pool

instance 1 instance 2 instance 3

CLB_LONG

Connections requests distributed equally across all instances running a service

© 2009/2010 Pythian

CLB options for RLB

59

Connection Pool

instance 1 instance 2 instance 3

CLB_LONG

Connections requests distributed equally across all instances running a service

© 2009/2010 Pythian60

Rule of thumb

use CLB_LONG with connection pools

© 2009/2010 Pythian

JDBC Implicit Connection Cache

•Standard JDBC drivers + ons.jarods.setConnectionCachingEnabled(True);

ods.setFastConnectionFailoverEnabled(True);

ods.setONSConfiguration

("nodes=lh1:6201,lh2:6201");

Properties prop = new Properties();

prop.setProperty("MinLimit", MIN_CONN);

prop.setProperty("MaxLimit", MAX_CONN);

prop.setProperty("InitialLimit", INIT_CONN);

prop.put (oracle.net.ns.SQLnetDef.TCP_CONNTIMEOUT_STR, "1000")); // 1 second

ods.setConnectionCacheProperties(prop);

© 2009/2010 Pythian

Demo 7 - JDBC RLB

• Implicit Connection Cache

• Enabling FCF

• Subscribe with ONS

• Tracing LBA events in JDBC

62

© 2009/2010 Pythian

ONS JDBC bugs

• Bug 6151350 - RESTRICTION ON SETONSCONFIGURATION

• Bug 6315760 - SETONSCONFIGURATION ONLY REGISTERS A MAXIMUM OF THREE NODES

• -Doracle.ons.maxconnections=5

63

© 2009/2010 Pythian

Are we there yet?

!Client-side basics

!Oracle Cluster Services

!Server-side CLB

!FAN - HA & LBA events

!Thin JDBC RLB

!ONS Subscriber

• Your own LBA!

© 2009/2010 Pythian

Demo 8 - ONC JDBC API

• Local ONS is required on client

• Subscribing to events

• How to filter only required events

• Parsing events

65

© 2009/2010 Pythian

Are we there YET???

!Client-side basics

!Oracle Cluster Services

!Server-side CLB

!FAN - HA & LBA events

!Thin JDBC RLB

!ONS Subscriber

!Your own LBA!

© 2009/2010 Pythian

Demo 9 - your own LBA

67

• Maximum flexibility of LBA

• ONS Publisher

• Oracle doesn’t know how to balance you workload better than you!

• This is not documented anywhere and likely unsupported

© 2009/2010 Pythian

Are we there yet?

!Oracle Cluster Services

!Establishing a connection

!FAN - HA & LBA events

!Thin JDBC RLB

!ONS Subscriber

!Your own LBA!

!NO :)

© 2009/2010 Pythian

11g New Features

• SCAN Listener

• Universal Connection Pool

• Connection Affinity in LBA (web sessions, XA)

• Reduces Cache Fusion overhead

• Requires UCP

• Data Guard Broker integration with FAN events

• Policy-Based Cluster and Capacity Management

69

© 2009/2010 Pythian

Are we there yet?

© 2009/2010 Pythian

Bonus - WebLogic Server Connection Management

71

© 2009/2010 Pythian72

Source - WebLogic Server 10.3.1 documentation

© 2009/2010 Pythian

WebLogic Configurations Options for Oracle RAC

73

• 4 Supported Data Source Configurations

MDS XA

MDS no-XA

RAC Services

Oracle native

Load balancing Y Y Y N

Failover Y Y Y Y

XA support Y N Y N

JDBC Store N Y Y Y

RAC Services N N Y Y

© 2009/2010 Pythian

WebLogic Multi Data Source with Oracle RAC

74

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• App uses MDS

• MDS routes connection to one of its DS

• failover or load balancing

• DS online management

• Suspend

• Shutdown

• Add

• Remove

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

Data Source 3

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

Data Source 3

© 2009/2010 Pythian

WebLogic MDS for Failover with Oracle RAC

75

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Failover MDS

• DS health checks

• failure => DS dead

• Can manually disable DS

• Dead DS are re-tested

• default 120 seconds

Data Source 3

Data Source 1

© 2009/2010 Pythian76

© 2009/2010 Pythian

WebLogic Multi Data Source with Oracle RAC

77

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Load Balancing

• MDS routes connection to all active DS

• round-robin

• failover is supported

• no performance base load balancing like Oracle RLB

• DS size doesn’t affect LB

© 2009/2010 Pythian78

Oracle RAC: JDBC Pool vs WebLogic Multi DS

Oracle JDBC WLSMulti-DS

Connect failover connect time failover

MDS failover

Connection load balancing JDBC CLB none

Server-side CLB based on service metrics / performance

Listener none

Control connections layout RAC Services MDS config / members

Reconnect on failure FCF MDS managed

Run-time load balancing based on service performance

RLB / LBA MDS LBround-robin

Use new (or recovered) instance not until reconnect

automated by MDS

© 2009/2010 Pythian

WebLogic Connections to RAC Services

79

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

• Initial Capacity = 0

• DS must exist for every node that can run the service

• Services layout change requires WLS reconfiguration

• XA supported

• branches of the same XA transactions are routed to the same instance

• MDS for load balancing

• Failover makes little sense

MY_SRV MY_SRV

© 2009/2010 Pythian

WebLogic Connections to RAC Services

80

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Multi Data Source

Data Source 1

Data Source 3

Data Source 2

BOB_SRV

© 2009/2010 Pythian

WebLogic Unmanaged DS with Oracle RAC

81

Database

Instance 1 Instance 2 Instance 3

WebLogic Server

Unmanaged Data Source• JDBC native CLB

• DB Server - CLB_GOAL_LONG

• Failover - FCF

• Based on HA events

• RLB does not work

• Connection testing not required

Oracle JDBC “unmanaged” pool

© 2009/2010 Pythian

What’s next?

• Book draw

• Leave me your business cards

Q & A

Email me - gorbachev@pythian.com

Read my blog - http://www.pythian.com

Follow me on Twitter - @AlexGorbachev

Join Pythian fan club on Facebook & LinkedIn

82

top related