Forum Discussion
Kai_Wilke
Aug 28, 2017MVP
Hi swjo,
To get a "true" Round-Robin mechanism for pool member selection and HOST-Header overwrites you have to implement some shared
[table]
-based RR counters, so that the individual TMM-cores (each of them will process a subset of the client connections) can become teamed. The shared RR counters will then be used to perform a handcrafted RR pool member selection followed by the RR based injection of the HOST-Header values.
Note: You have to perform a handcrafted pool member selection, since LTM's build-in "Round Robin" load balancing algorythm does not share the RR counters across multiple TMM cores. It will just Round-Robin the request accordingly with that specific TMM instance...
when RULE_INIT {
array set static::apisky_hostheaders {
"0" "api31sky.whypaymore.co.kr"
"1" "api32sky.whypaymore.co.kr"
"2" "api33sky.whypaymore.co.kr"
"3" "api34sky.whypaymore.co.kr"
}
set static::apisky_hostheaders_count [array size static::apisky_hostheaders]
}
when HTTP_REQUEST {
Fetching a list of the currently available pool members
if { [set pool_active_members [active_members -list [LB::server pool]]] ne "" } then {
Increasing the global RR counter for load balancing decission
set pool_rr_counter [table incr "pool_rr_[LB::server pool]"]
Reset the global RR counter for load balancing decission as needed.
if { $pool_rr_counter > 1000000 } then {
The RR counter has exceded the maximum allowed value. Reset it back to 1
set pool_rr_counter [table set "pool_rr_[LB::server pool]" 1]
}
Performing a Load-Balancing decision based on the global RR counter value for load balancing decission and the list of currently available pool members.
set pool_selected_member [lindex $pool_active_members [expr { ( $pool_rr_counter - 1 ) % [llength $pool_active_members]}]]
Using the RR selected pool member as the current node
pool [LB::server pool] member [lindex $pool_selected_member 0] [lindex $pool_selected_member 1]
Increasing the global and per-pool_member RR counter for HOST-Header selection
set member_rr_counter [table incr "member_rr_$pool_selected_member"]
Reset the global and per-pool_member RR counter for HOST-Header selection as needed.
if { $member_rr_counter >= 1000000 } then {
The RR counter has exceded the maximum allowed value. Reset it back to 1
set member_rr_counter [table set "member_rr_$pool_selected_member" 1]
}
Resolve the HOST-Header based on the values of $static::apisky_hostheaders() by selecting a modulus of the current RR counter value
HTTP::host $static::apisky_hostheaders([expr { ( $member_rr_counter - 1 ) % $static::apisky_hostheaders_count }])
Log the current node selection and choosen HOST-Header value
log local0.debug "Current Node: $pool_selected_member | New HOST-Header: [HTTP::host]"
} else {
The pool is unavailable...
HTTP::respond 503 content "The pool is currently unavailable..." "Content-Type" "text/html"
}
}
Log File:
Aug 28 13:47:13 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:13 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:13 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:14 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:14 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:14 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:14 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:15 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:15 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:15 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:15 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:15 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:16 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:16 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:16 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:16 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:16 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:16 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:17 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:17 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:17 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api31sky.whypaymore.co.kr
Aug 28 13:47:17 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:17 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:17 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:18 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api32sky.whypaymore.co.kr
Aug 28 13:47:18 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:18 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:18 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:18 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api33sky.whypaymore.co.kr
Aug 28 13:47:19 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 1.1.1.1%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:19 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 2.2.2.2%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:19 f5-02 debug tmm[25655]: Rule /Common/my_rule_rule : Current Node: 3.3.3.3%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Aug 28 13:47:19 f5-02 debug tmm1[25655]: Rule /Common/my_rule_rule : Current Node: 4.4.4.4%1 80 | New HOST-Header: api34sky.whypaymore.co.kr
Note: You can clearly see that pool members as well as the HOST-Header values are switched in a "true" Round-Robin manner, even in the case that multiple TMM core will procress this connection (tmm and tmm1 in my case).
Cheers, Kai