keepalived+LVS超時設置產生的realserver的tcp連接不釋放問題

redis的集羣使用keepalived+LVS做的負載集羣

persistent時間設置爲30s

而ipvsadm的超時時間則爲900 120 300【使用ipvsadm -l --timeout】第一個爲tcp超時時間,第二個爲tcpfin超時時間,第三個爲udp超時時間

由於在這種設置下ActionConn的連接數在高頻訪問下總是不會釋放,恆定在100,【5個客戶端恆定TCP連接每臺10個】

決定設短ipvsadm的tcp超時時間爲5s,而tcpfin設置爲120,udp爲300

結果就悲催了

keepalived的ActionConn和InActConn的數量猛增猛降也還可以接受

realserver的tcp連接則出現了端口上連接堆積不釋放的情況,從1000多夢飆升到8000多

客戶端狂報遠程連接中斷的錯誤

 

仔細研讀了LVS的原理和TCP有限狀態機

發現了問題所在

tcp的連接超時時間嚴重小於tcpfin的時間,結果lvs就會每隔5s在即使tcp連接還健康存在的時候強制中斷

由於客戶端會恆定保持10個TCP連接,然後就不斷的被中斷,不斷的重新建立

realserver因爲tcp連接是被強制中斷的,有可能還沒有收到lvs轉發的tcp操作完成信號,就會在端口上繼續保持連接 ESTABLISHED

然後就悲催了

 

一個明顯的失誤就是tcp的連接超時時間遠小於tcp完成超時時間,真是的~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章