cancel
Showing results for 
Search instead for 
Did you mean: 

iRule logic to use multiple pools to force GTM failover on VIP

Kevin_Basler
Altostratus
Altostratus

I have a VIP that has no status because the pool that it uses is determined by a policy. To add state to the VIP I've added the following iRule:

 

when HTTP_REQUEST {

if { [active_members pool1] == 0 } {

# log

 

The VIP now shows a status of green (UP). When I disable the pool members in pool1, the VIP goes down and the GTM routes traffic to another data center.

 

Since I have a VIP that has multiple pools, I need to fail the VIP if any one pool member is down.

 

I've tried these examples:

 

if { [active_members pool1] == 0 } {

# log

elseif { [active_members pool2] == 0 } {

# log

elseif { [active_members pool3] == 0 } {

# log

elseif { [active_members pool4] == 0 } {

# log

}

}

 

and...

 

when HTTP_REQUEST {

if { [active_members pool1] == 0 or [active_members pool2] == 0 or [active_members pool3] == 0 }r 

# log

}

}

 

When I take any one pool down, the VIP remains up.

 

Any suggestions?

 

Thanks

 

Kevin

1 REPLY 1

Hi Kevin,

 

  • Create an iRule:
ltm rule irule_poolstatus { when HTTP_REQUEST { if { [active_members pool1] == 0 || [active_members pool2] == 0 || [active_members pool3] == 0 || [active_members pool4] == 0} { HTTP::respond 200 content "down" } else { HTTP::respond 200 content "up" } } }
  • Create a Virtual Server with IP x.y.z.t and bind the iRule:
ltm virtual vs_poolstatus { destination 1.2.3.4:http ip-protocol tcp mask 255.255.255.255 profiles { http { } tcp { } } rules { irule_poolstatus } serverssl-use-sni disabled source 0.0.0.0/0 source-address-translation { type automap } translate-address enabled translate-port enabled }
  • Create a monitor with receive string:
ltm monitor http monitor_status { adaptive disabled defaults-from http interval 5 ip-dscp 0 recv up recv-disable none send "GET /\r\n" time-until-up 0 timeout 16 }
  • Create a pool, add the virtual server IP address as pool member and bind the monitor:
ltm pool pool_status { members { 1.2.3.4:http { address 1.2.3.4 session monitor-enabled } } monitor monitor_status }
  • Create second iRule:
when HTTP_REQUEST { if { [active_members pool_status] == 0} { # log } }
  • Add the iRule to main virtual server

 

first iRule and virtual server: for "up/down response"

pool and monitor: for receive a request to the virtual server and to see the "up/down" status

 

I couldn't find a shorter solution.