开启传统型负载均衡CLB的健康检查后业务日志中出现“Connection reset by peer”的错误

问题描述

传统型负载均衡CLB实例中开启TCP监听的健康检查功能后,后端服务器的业务日志中频繁出现类似Connection reset by peer的网络连接错误。经网络抓包分析,发现相关请求来自CLB实例,同时CLB实例主动向后端服务器发送了RST数据包中断连接。业务日志中的错误信息类似如下。

问题原因

该问题和CLB的健康检查机制有关。由于TCP协议对上层业务的状态无感知,同时,为了降低健康检查成本以及对后端服务的冲击,CLB针对TCP监听的健康检查只进行简单的TCP三次握手,而后直接发送RST数据包断开TCP连接,没有进一步的业务数据交互,导致上层业务认为连接异常,如Java连接池等,所以抛出Connection reset by peer异常。详细的数据交互过程如下:

  1. CLB实例向后端服务端口发送SYN请求包。

  2. 后端服务器收到请求后,如果端口状态正常,则按照正常的TCP协议机制返回相应的SYN和ACK应答包。

  3. CLB实例成功收到后端服务端口的应答,则认为端口监听是正常的,判定健康检查成功。

  4. CLB实例向后端服务端口直接发送RST数据包主动关闭连接,结束本次健康检查操作,并且不发送业务数据。

解决方案

针对该问题,请结合业务的需求和实际情况,从下列两种解决方案中选择适合您的方案:

  • 方案一:更换监听类型更换CLB的TCP监听为HTTP监听或HTTPS监听,详情请参见添加HTTP监听添加HTTPS监听

  • 方案二:日志过滤在上层业务的层面,对CLB健康检查的IP地址段做日志过滤,忽略相关错误信息。

    说明

    CLB的健康检查地址段为100.64.0.0/10。

适用于

  • 传统型负载均衡CLB