雖然應用keepalived搞定了後端服務負載均衡和高可用性問題,可是在具體應用的時候,仍是要注意不少問題。不少應用都用tcp或者http的長鏈接,由於創建tcp鏈接或者http鏈接開銷比較大,而應用端實際上是須要頻繁跟server端通信的,這時候保持長鏈接無疑是很是合適的。通過摸索lvs & keepalived 長鏈接的配置主要在三個地方:
1、client端的SoTimeout , 就java來講就是java.net.Socket的setSoTimeout方法設置的, setSoTimeout(0)就是代表超時時間無限大。這個值是爲讀取阻塞設置超時的。
2、lvs的設置:
查看是ipvsadm --list --timeout, 好比個人機器就會返回以下結果:
# ipvsadm --list --timeout
Timeout (tcp tcpfin udp): 7200 5 60
這就代表個人tcp session的timeout時間是7200秒。
設置timeout:
ipvsadm --set 7200 5 60
這個值若是設置過小,你的client將會收到 connection reset by peer此類的錯誤提示。
3、keepalived的配置:
就是virtual_server的persistence_timeout ,意思就是在這個必定時間內會講來自同一用戶(根據ip來判斷的)route到同一個real
server。對於長鏈接類的應用,你確定須要這麼作。配置值最好跟lvs的配置的timeout一致。
4、具體實例以下:
virtual_server 172.19.1.19 5222 {
delay_loop 2
lb_algo wrr
lb_kind DR
persistence_timeout 7200
protocol TCP
real_server 172.19.1.8 5222 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
real_server 172.19.1.9 5222 {
weight 1
TCP_CHECK {
connect_timeout 10
nb_get_retry 3
delay_before_retry 3
}
}
}html
http://blog.chinaunix.net/uid-25723371-id-5749631.htmljava