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