阿里云負(fù)載均衡服務(wù)TCP端口健康檢查成功,為什么在后端業(yè)務(wù)日志中出現(xiàn)網(wǎng)絡(luò)連接異常信息?
問題現(xiàn)象:
負(fù)載均衡后端配置TCP服務(wù)端口后,后端業(yè)務(wù)日志中頻繁出現(xiàn)類似如下網(wǎng)絡(luò)連接異常錯誤信息。經(jīng)進(jìn)抓包分析,發(fā)現(xiàn)相關(guān)請求來自負(fù)載均衡服務(wù)器,同時負(fù)載均衡主動向服務(wù)器發(fā)送了RST數(shù)據(jù)包。
問題原因:
該問題和負(fù)載均衡的健康檢查機制有關(guān)。
由于TCP對上層業(yè)務(wù)狀態(tài)無感知,同時,為了降低負(fù)載均衡健康檢查成本和對后端業(yè)務(wù)的沖擊,當(dāng)前負(fù)載均衡針對TCP協(xié)議服務(wù)端口的健康檢查只會做簡單的TCP三次握手,而后直接發(fā)送RST包斷開TCP連接。數(shù)據(jù)交互流程如下:
-
負(fù)載均衡服務(wù)器向后端負(fù)載均衡服務(wù)端口發(fā)送SYN請求包;
-
后端服務(wù)器收到請求后,如果端口狀態(tài)正常,則按照正常的TCP機制返回相應(yīng)的SYN+ACK應(yīng)答包;
-
負(fù)載均衡服務(wù)器成功收到后端服務(wù)端口應(yīng)答后,則認(rèn)為端口監(jiān)聽是正常的,判定健康檢查成功;
-
負(fù)載均衡服務(wù)器向相應(yīng)TCP服務(wù)端口直接發(fā)送RST包主動關(guān)閉連接,結(jié)束本次健康檢查操作,且沒有繼續(xù)發(fā)送業(yè)務(wù)數(shù)據(jù)。
如上所述,由于健康檢查成功后,負(fù)載均衡服務(wù)器直接發(fā)送TCP RST包中斷了連接,并沒有做進(jìn)一步的業(yè)務(wù)數(shù)據(jù)交互,導(dǎo)致上層業(yè)務(wù)(比如Java連接池等)認(rèn)為相應(yīng)的連接是異常的,所以會出現(xiàn)Connection reset by peer等錯誤信息。
解決方案:
-
更換TCP協(xié)議為HTTP協(xié)議。
-
在業(yè)務(wù)層面,對來自SLB服務(wù)器IP地址段的相關(guān)請求做日志過濾,忽略相關(guān)錯誤信息。