Communications link failure during rollback(). Transaction resolution unknown

本贴最后更新于 1001 天前,其中的信息可能已经斗转星移

  • 错误描述如图:

image.png

  • 错误背景:

使用 SpringBoot + Druid + myqsl 开发应用服务,使用 Nginx 做 4 层代理转发到 Mysql 服务端。服务启动后再 swagger 上第一次访问接口是正常的,但是过了几十秒后再访问就报错了,后面就再也发不通了。一直提示无法建立连接

image.png

Communications link failure. The last packet successfully received from the server was 177,731 milliseconds ago. The last packet sent successfully to the server was 177,735 milliseconds ago.

  • 初步分析:

作为一名合格的程序员,必须有独立解决问题的能力(当然在我们部门,我也没有可以求救的人了),遇到不认识的异常就要会百度、Google~ 但是我左搜右搜上搜下搜,都找不到正确的解决方案。无奈,只能靠自己了。仔细看了下异常信息,是从 com.alibaba.druid 里抛出来的,难道是连接池的问题?于是我把 Druid 连接池换成了 HikariCP,结果是可以正常访问数据库了,赶紧提交代码,别耽误其他同事的开发。

数据库不可访问的危机是解除了,但是日志里还是会打印一堆 warn 警告。如图:image.png

我是一个略有强迫症的程序员,解决问题必须要知其然且知其所以然,还有 warn 警告,说明问题并没有从根源上解决。于是我又仔细分析了下警告提示 从服务器成功接收到的最后一个数据包是177,731毫秒前。最后一个成功发送到服务器的数据包是177,735毫秒之前)。可以考虑使用更短的maxLifetime值,难道是配置有问题?我将 max-lifetime 值调小,发现并没有任何作用。

“Communications link failure 是通讯链路故障...接收数据包...发送数据包”,猜想问题可能出在通讯链路上。由于我的 mysql 是在内网服务器上的,没有直接将 msyql 服务器暴露到外网上,所以需要在 nginx 服务器做一个 4 层代理。我开始怀疑是不是 nginx 配置有问题呢,以下是我 nginx 的配置。image.png

proxy_connect_timeout 是 nginx 连接上游服务超时时间,如果配置多个上游服务节点,且 nginx 路由到的第一个上游服务不可用时,连接超过设置的超时时间,nginx 会自动将请求路由到其他上游服务节点。

proxy_timeout 是如果指定时间内,客户端没有请求发送过来,nginx 会断开与上游节点的链接,以节省资源(查了以后才知道的)。

Mysql 客户端与服务端之间是 TCP 长链接,在 Mysql 上是可以看到连接数的。于是我登录了 mysql,进行了连接数的查询。show status like 'Threads%';

image.png

当我服务停止时,连接数为 1,当我启动服务并进行一次接口调用后(会访问数据库),连接数变成了 6。说明数据库根据我代码里配置的 minimum-idel 为 5 初始化了 5 个连接。

image.png

10s 后再次查看连接数变成了 1,说明数据库认为客户端连接断开了,释放了 5 个连接。

image.png

再次访问接口变成了 6,说明 hikariCP 默认实现了自动重连,数据库根据配置又重新创建了 5 个连接。

image.png

停止服务又变成了 1,说明数据库识别到客户端断开后,释放了 5 个连接。

image.png

我们可以通过 show processlist; 命令看一下数据库进程信息的状态。

最开始连接数为 0,没有任何连接信息,只有执行 show processlist 命令的查询进程。

image.png

服务启动后,数据库不会立即创建连接进程,调用一次查询后出现了 5 个进程,并且可以看到用户及其 DB。Time 为进程存在时间

image.png

image.png

可以看到 Time 增长到 10s 后,会自动消失。

image.png

总结

经过上面验证过程后,确定连接断开时间是与 Nginx 的 proxy_timeout 保持一致的,于是我把 proxy_timeout 配置取消后,观察连接是正常的,可持续到我们配置的 interactive_timeout 值。

(1)interactive_timeout:
参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在 mysql_real_connect()中使用 CLIENT_INTERACTIVE 选项的客户端。
参数默认值:28800 秒(8 小时)

(2)wait_timeout:
参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局 wait_timeout 值或全局 interactive_timeout 值初始化会话 wait_timeout 值,取决于客户端类型(由 mysql_real_connect()的连接选项 CLIENT_INTERACTIVE 定义)。
参数默认值:28800 秒(8 小时)

  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    923 引用 • 936 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3169 引用 • 8208 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • OAuth

    OAuth 协议为用户资源的授权提供了一个安全的、开放而又简易的标准。与以往的授权方式不同之处是 oAuth 的授权不会使第三方触及到用户的帐号信息(如用户名与密码),即第三方无需使用用户的用户名与密码就可以申请获得该用户资源的授权,因此 oAuth 是安全的。oAuth 是 Open Authorization 的简写。

    36 引用 • 103 回帖 • 16 关注
  • golang

    Go 语言是 Google 推出的一种全新的编程语言,可以在不损失应用程序性能的情况下降低代码的复杂性。谷歌首席软件工程师罗布派克(Rob Pike)说:我们之所以开发 Go,是因为过去 10 多年间软件开发的难度令人沮丧。Go 是谷歌 2009 发布的第二款编程语言。

    495 引用 • 1386 回帖 • 329 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    77 引用 • 159 回帖
  • OpenStack

    OpenStack 是一个云操作系统,通过数据中心可控制大型的计算、存储、网络等资源池。所有的管理通过前端界面管理员就可以完成,同样也可以通过 Web 接口让最终用户部署资源。

    10 引用 • 5 关注
  • BND

    BND(Baidu Netdisk Downloader)是一款图形界面的百度网盘不限速下载器,支持 Windows、Linux 和 Mac,详细介绍请看这里

    107 引用 • 1281 回帖 • 29 关注
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 458 关注
  • SQLite

    SQLite 是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。SQLite 是全世界使用最为广泛的数据库引擎。

    4 引用 • 7 回帖
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 160 关注
  • 反馈

    Communication channel for makers and users.

    124 引用 • 907 回帖 • 223 关注
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 248 回帖 • 123 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • WiFiDog

    WiFiDog 是一套开源的无线热点认证管理工具,主要功能包括:位置相关的内容递送;用户认证和授权;集中式网络监控。

    1 引用 • 7 回帖 • 561 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 16 关注
  • 倾城之链
    23 引用 • 66 回帖 • 121 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 403 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    84 引用 • 139 回帖 • 1 关注
  • PHP

    PHP(Hypertext Preprocessor)是一种开源脚本语言。语法吸收了 C 语言、 Java 和 Perl 的特点,主要适用于 Web 开发领域,据说是世界上最好的编程语言。

    165 引用 • 407 回帖 • 509 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 724 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    165 引用 • 1474 回帖
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 3 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 149 关注
  • 酷鸟浏览器

    安全 · 稳定 · 快速
    为跨境从业人员提供专业的跨境浏览器

    3 引用 • 59 回帖 • 23 关注
  • InfluxDB

    InfluxDB 是一个开源的没有外部依赖的时间序列数据库。适用于记录度量,事件及实时分析。

    2 引用 • 55 关注
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    124 引用 • 580 回帖
  • 996
    13 引用 • 200 回帖 • 6 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 533 回帖 • 735 关注