1. 程式人生 > >keepalived+LVS超時設定產生的realserver的tcp連線不釋放問題

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完成超時時間,真是的~~~