Forum Discussion
cjunior
Nov 12, 2019Nacreous
Here it is:
when RULE_INIT {
# Pool to probe VS addr wich have virtual server addresses
set static::pool_vs_members "pool_probe_vs_loadbalance"
# Map virtual server destination and name
array set static::map_vs_name {"10.10.10.1 80" vs_name1}
array set static::map_vs_name {"10.10.10.2 80" vs_name2}
array set static::map_vs_name {"10.10.10.3 80" vs_name3}
# Cookie name persistence
set static::persist_cookiename "LBserverAddr_${static::pool_vs_members}"
# Enable debug to write log
set static::enable_debug 1
}
when HTTP_REQUEST {
# Check if you are persisted
if { [HTTP::cookie exists $static::persist_cookiename] } {
set virtual_destination [string map {\" ""} [HTTP::cookie value $static::persist_cookiename]]
if { $static::enable_debug } { log local0.debug "Persisted member: $virtual_destination" }
} else {
set virtual_destination "NONE"
}
# Get the active members from probe pool
set member_list [active_members -list $static::pool_vs_members]
if { $static::enable_debug } { log local0.debug "Active members in $static::pool_vs_members: $member_list" }
# Check if there are members UP
if { $member_list eq "" } {
log local0.err "There is no active members in pool $static::pool_vs_members"
HTTP::respond 200 content {<html><body><h2>We are unavailable :(</h2><p>Please try again...</body></html>} Connection close
return
}
# Check if persisted member is UP
if { $static::enable_debug } { log local0.debug "Check if member $virtual_destination is UP" }
set idx [lsearch $member_list "$virtual_destination"]
if { $idx eq -1 } {
#No previous member, select new one
if { $static::enable_debug } { log local0.debug "Load balance round robin new member" }
#Incr table
set idx [table incr "$static::pool_vs_members"]
#Check if index greater than list count
if { $idx >= [llength $member_list] } {
#Reset table and get first member on pool
set idx 0
table set "$static::pool_vs_members" $idx
}
if { $static::enable_debug } { log local0.debug "RR member index: $idx" }
set virtual_destination [lindex $member_list $idx]
set send_cookie 1
} else {
set send_cookie 0
}
if { $static::enable_debug } { log local0.debug "Selected virtual server: $virtual_destination / Name: $static::map_vs_name($virtual_destination)" }
# Move it to virtual server
virtual $static::map_vs_name($virtual_destination)
}
when HTTP_RESPONSE {
if { $send_cookie } {
if { $static::enable_debug } { log local0.debug "Persist address $virtual_destination" }
HTTP::cookie insert name $static::persist_cookiename value $virtual_destination
}
}