天天看點

lvs & keepalived的tcp 長連接配接的問題解決辦法

雖然應用keepalived搞定了後端服務負載均衡和高可用性問題,但是在具體應用的時候,還是要注意很多問題。很多應用都用tcp或者http的長連接配接,因為建立tcp連接配接或者http連接配接開銷比較大,而應用端其實是需要頻繁跟server端通訊的,這時候保持長連接配接無疑是非常合适的。經過摸索, lvs & keepalived 長連接配接的配置主要在三個地方:

client端的SoTimeout, 就java來說就是java.net.Socket的setSoTimeout方法設定的, setSoTimeout(0)就是表明逾時時間無限大。

這個值是為讀取阻塞設定逾時的。

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此類的錯誤提示。

keepalived的配置:

就是virtual_server的persistence_timeout,意思就是在這個一定時間内會講來自同一使用者(根據ip來判斷的)route到同一個real

server。對于長連接配接類的應用,你肯定需要這麼做。配置值最好跟lvs的配置的timeout一緻。

舉例如下:

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 {

}

本文轉自 南非波波 51CTO部落格,原文連結:http://blog.51cto.com/nanfeibobo/1617110,如需轉載請自行聯系原作者