F5 – Oracle RAC Load Balancing

I’m briefly going to show you the recommended settings by both F5 and Oracle for a RAC Load Balancing setup. But it’s important to mention before implementing any configuration into production, always test since all environments are different, well most. It’s important to work with all teams who are in charge of the settings on the server side and Oracle side because there are buffer settings and timeouts that you will need. For example, see below for both Oracle 12c and the OS which in my case is RedHat 7:

Oracle 12c Defaults and Best Practice:
TCP.CONNECT_TIMEOUT = 60 Seconds (F5 keeps mentioning that Oracle states this should be 10 seconds but I couldn’t find it anywhere. Even their best practice/tuning doc states 60)
SQLNET.EXPIRE_TIME = 10 Minutes
RECV_BUF_SIZE = OS Specific
SEND_BUF_SIZE = OS Specific

From Oracle’s Best Practices for Database Performance and Scalability Guide:
Oracle TCPTimeout

From Oracle’s Documentation:
Oracle SQLNETExpire

Redhat Linux 7:
RECEIVE BUFFER:
net.core.rmem_default = 262144 = 256K
net.core.rmem_max = 4194304 = 4096K

SEND BUFFER:
net.core.wmem_default = 262144 256K
net.core.wmem_max = 1048576 1024K

From RedHat’s Documentation:
RedHat Specs

Let’s get to the configuration.

Health Monitor:
Interval = TCP.CONNECT_TIMEOUT x 3 + 1 (60 x 3 + 1= 181)
Work with your Oracle DB’s to get the Send, Receive, Connecting Strings.
Receive Row/Receive Column is used for returns from the SQL query that may have multiple results. I used 1.

F5 OracleRAC Health

Pool:
Action On Service Down = Reject
Load Balancing Method = Least Connection(node)
Priority Group Activiation = Less Than
Available Members = set to 1 :this is the minimum number of nodes at a specific Priority Level that should be available before the pool chooses a lower priority level
Add the member nodes and don’t forget to give them specific Priorities. In this case PRIMARY=100 STANDBY=50

F5 OracleRAC Pool 1

F5 OracleRAC Pool 2

TCP Profile:
There are two TCP Profiles, one for the Client and one for the Server.

Maximum Syn Retransmissions = TCP.CONNECT_TIMEOUT = 60 Seconds = DID NOT TOUCH
Idle Timeout = SQLNET.EXPIRE_TIME = 10 Minutes = Changed to 660 which equals 11 Minutes since it needs to be slightly larger
Send Buffer = SEND_BUF_SIZE = OS Dependent = For me I’m looking at RedHat Linux 7 which is 256K but I set the F5 to RedHat’s max
Receive Window = RECV_BUF_SIZE = OS Dependent = For me I’m looking at RedHat Linux 7 which is 256K but I set the F5 to RedHat’s max

Client:
F5 OracleRAC TCPProfile Client

Server:
F5 OracleRAC TCPProfile Server

Virtual Server:
Protocol Profile (Client) = oracleRAC_client_tcpprofile
Protocol Profile (Server) = oracleRAC_server_tcpprofile
Source Address Translation = Auto Map
Default Pool = oracleRAC_primary-standby_pool
Default Persistence Profile = dest_addr
Fallback Persistence Profile = source_addr

F5 OracleRAC VS1

F5 OracleRAC VS2

F5 OracleRAC VS3