For more information regarding the security incident at F5, the actions we are taking to address it, and our ongoing efforts to protect our customers, click here.

Especial Load Balancing Active-Passive Scenario (II)

Problem this snippet solves:

I share with you one special load balancing scenario that I had to deal with.


Topology:



Requirements:


  • There are two pools configured (Pool_A & Pool_B)
  • The members of each pool will work using Round Robin LB method.
  • One pool will act as active and the other one will be in standby mode.
  • Only the pool with active role will be able to process traffic.
  • If 2 or more members of Pool_A (initially active) are down, Pool_B (initially standby) asumes the role of active.
  • There is no preempt, in case of Pool_B asumes the active role, it will be active until someone decide to roll back to the initial situation (manually).


How to use this snippet:

It's easy to configure. You need to configure a virtual server without default pool and this iRule applied to it.


Considerations:


  • The iRule uses a table variable to keep the state of the current active pool.
  • The code will use Pool_A as active pool in the first execution.
  • You can manually force an active pool disabling the other pool.
  • In case you would like to remove this VS indefinitely, you should manually remove the table variable.


Remove Table Variable:


For deleting the table variable you can replace the irule for this one and execute it once.


when CLIENT_ACCEPTED {
  table delete -all -subtable "[virtual name]"
  log local0. "[virtual name] table was deleted"
}


You can also define a timeout value for the variable instead of using indefinite.

REF - https://devcentral.f5.com/s/articles/v101-the-table-command-advanced-data-expiration


Code :

when CLIENT_ACCEPTED {
    # PICK THE LAST POOL SELECTION
    set selection [table lookup -subtable "[virtual name]" pool_selection]
    # EVAL POOL SELECTION
    if { [active_members ] == 0 } {
        set selection ""
        table replace -subtable "[virtual name]" pool_selection $selection
    } elseif { [active_members ] == 0 } {
        set selection ""
        table replace -subtable "[virtual name]" pool_selection $selection
    } elseif { [active_members ] < 3 } {
        set selection ""
        table replace -subtable "[virtual name]" pool_selection $selection
    }
    # APPLY POOL SELECTION
    switch $selection {
        "" {
            pool 
        }
        "" {
            pool 
        }
        default {
            pool 
            table set -subtable "[virtual name]" pool_selection  indefinite indefinite
        }
    }
}

Tested this on version:

12.1
Published Jun 21, 2019
Version 1.0