问题分析
-
在建立 tcp 连接之后,被心跳 reset 了而 tidb 不知道,客户端新请求发过来的时候会发现断了;
于是被 tidb 关闭心跳前的原有连接,报错 reset by peer;
-
RST 标识位说明 from https://blog.csdn.net/a_tu_/article/details/80389878:
RST表示复位,用来异常的关闭连接,在TCP的设计中它是不可或缺的。就像上面说的一样,发送RST包关闭连接时,不必等缓冲区的包都发出去(不像上面的FIN包),直接就丢弃缓存区的包发送RST包。而接收端收到RST包后,也不必发送ACK包来确认。
TCP处理程序会在自己认为的异常时刻发送RST包。例如,A向B发起连接,但B之上并未监听相应的端口,这时B操作系统上的TCP处理程序会发RST包。
又比如,AB正常建立连接了,正在通讯时,A向B发送了FIN包要求关连接,B发送ACK后,网断了,A通过若干原因放弃了这个连接(例如进程重启)。网通了后,B又开始发数据包,A收到后表示压力很大,不知道这野连接哪来的,就发了个RST包强制把连接关了,B收到后会出现connect reset by peer错误。
解决办法:
- 等新 PR 把这个报错降低成 debug 级别用新版;
- 写个 shell 定期 log 挪位置,制定个策略之类(暂时没太好直接规避问题的参数);
- 不用透传,感觉透传是个锦上添花的功能,没实际需求就没必要用;