请原谅我对F5及其实施的零知识。我们有4个Web服务器,我们希望使用F5来分配负载。我们正在取代Apache Camel软件负载均衡器。
当前实施:
当客户启动交互并将SOAP请求发送到SW LB URL时,每个客户端都会创建一个会话ID。 http://Server1:7001/WebService
SW负载均衡器使用循环算法从以下4个目的地中查找合适的服务器,并创建服务器端点和会话ID的映射。 http://Server1:9080/WebService http://Server2:9080/WebService http://Server3:9080/WebService http://Server4:9080/WebService
SW LB维持此会话10分钟。在此时间内,如果请求再次出现相同的会话ID,则使用相同的目标服务器来处理请求。因此,通过这种方式,如果用户与Server2进行会话 - 此服务器将继续为他提供服务,直到用户结束会话(或会话超时)。
在Server1上可以看到我们有负载均衡器+ Web服务。我们正在降低SW负载均衡器以便在F5上进行微分。
以上方案可以在F5上实施吗? F5会给我们一个新的URL吗?我们将与客户分享以接收请求?像http://[new_IP_HW_LB]:[new_port]/WebService
一样是否能够从传入请求中提取会话ID并且可以维护粘性会话映射?
答案 0 :(得分:2)
是的,您可以用F5替换Apache Camel,您的设置非常标准。创建4个节点,一个包含4个成员的池和虚拟服务器。
除非Server1放弃地址,否则F5将需要一个新的IP地址[URL]。您还可以使用标准端口(HTTP为80,HTTPS为443)。
最难的部分是会话ID持久性。您需要创建具有600秒超时的通用持久性配置文件(本地流量»配置文件»持久性)并创建iRule以基于XML格式创建记录。 iRules可能很棘手,但DevCentral社区已经有了一个可以适应的解决方案。
来自Stanislas的DevCentral: how get response parameters。此iRule将捕获<uid>
XML标记内的参数。
when HTTP_RESPONSE {
# Trigger collection for up to 1MB of data
if {[HTTP::header exists "Content-Length"] && [HTTP::header "Content-Length"] <= 1048576}{
set content_length [HTTP::header "Content-Length"]
} else {
set content_length 1048576
}
# Check if $content_length is not set to 0
if { ([HTTP::status] == 200) && ($content_length > 0)} {
HTTP::collect $content_length
}
}
when HTTP_RESPONSE_DATA {
# do stuff with the payload
#find the application unique identifier between <uid> and </uid> (5 is the length of <uid> string)
persist add uie [string trim [findstr [HTTP::payload] "<uid>" 5 "</uid>"]]
}
when HTTP_REQUEST {
persist uie [string trim [findstr [HTTP::payload] "<uid>" 5 "</uid>"]]
}