keepalived+LVS超時設定產生的realserver的tcp連線不釋放問題
阿新 • • 發佈:2019-02-08
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完成超時時間,真是的~~~