ActiveMQ:Communications link failure问题以及解决办法

简介:
ActiveMQ版本:5.5.1
MQ 所使用的 MySQL 是 InnoDB存储引擎
记录人:@郑昀

现象:

业务表面现象:无。系统现象:无。
日志信息:业务系统发送 MQ 消息时,下面这种错误日志断断续续地一直都有:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
 
The last packet successfully received from the server was 60,001 milliseconds ago.  The last packet sent successfully to the server was 0 milliseconds ago.
 
原因:
ActiveMQ 持久化方案我们选的是 MySQL 。
MySQL 的全局变量 wait_timeout 默认是28800,单位是秒,即8小时。
运维部早先在测试 ActiveMQ 5.5 主从方案时,发现当 Master 宕机后,锁(数据库里的一个排他锁)有可能没有释放,导致 Slave 无法成为 Master( 这是 ActiveMQ 5.5 的 BUG,已在 5.6.0和5.7.0 修复)。
所以运维部将 wait_timeout 参数调短为了 60秒,希望能加速锁释放。
当业务不繁忙时,也许会有60秒既不生产也不消费,因此 MySQL 主动断开了 Connection 。此时,如果作为 MySQL Client 身份的 Broker Service,它的数据库连接池对  连接断开检测和自动重连 做得不好的话,那么 Broker 首次访问 DB 时 jdbc 就会报错。
 
短期解决办法:
将 ActiveMQ 所使用的 MySQL 的全局变量 wait_timeout 恢复为默认值 28800 。(已完成)
 
中期解决方法:
将 ActiveMQ 升级到 5.6.0或5.7.0 稳定版本。

相关的BUG:
ActiveMQ 的缺陷单  AMQ-1958 报告:

JDBC master/slave deadlock when connection is lost      

影响版本:  4.1.2, 5.0.0, 5.1.0, 5.2.0
Fix版本: 5.6.0
状态:2012年4月17日已修复
描述:
在一个纯 JDBC Failover 场景下( 1 Master+1 Slave):如果 Master 失去了数据库网络连接,数据库里的锁将不会释放。这样 Slave 不知道 Master 已不能执行任务,Slave 仍尝试不断获取锁;当 Master 重启后,它自己也无法获得锁,于是变身为 Slave;结果就是  0 Master+2 Slave 
环境:Oracle 10,MySQL 5
(这也就是运维部在 ActiveMQ 5.5.1 测试场景所遇到的)
 
AMQ-3654 也报告类似问题:

JDBC Master/Slave : Slave cannot acquire lock when the master loose database connection

影响版本: 5.5.0
Fix版本: 5.7.0
状态:2012年6月13日已修复
描述:与 AMQ-3654 描述一样。只不过报告的版本号不一样。
 
 

参考资源:
1)火丁老王, MySQL里的wait_timeout
『wait_timeout 过大有弊端,其体现就是 MySQL 里大量的 SLEEP 进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可能会遭遇到“MySQL has gone away”之类的问题。』
『在MySQL命令行里通过 SET来设置即可,避免服务重启:
mysql> set global wait_timeout=60;』
『查有无生效,用 show global variables 查全局变量:
mysql> show global variables like 'wait_timeout';
单纯使用 show variables 的话就等同于使用的是 show session variables,查询的是会话变量,你会误以为设置没有生效。
3) AMQ-1958
4)以前有人提议在数据库连接字符串中增加autoReconnect=true&failOverReadOnly=false,但这只对 MySQL 4.0 以前的版本有效,对 MySQL 5.0 以后无效。

Master failure

If the master looses connection to the database or looses the exclusive lock then it immediately shuts down. If a master shuts down or fails, one of the other slaves will grab the lock and so the topology switches to the following diagram
http://activemq.apache.org/jdbc-master-slave.data/MasterFailed.png
6)wait_timeout 参数说明
参数含义:服务器关闭非交互连接之前等待活动的秒数。

在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义) 

参数默认值:28800秒(8小时)
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
目录
相关文章
|
缓存 资源调度 区块链
Electron打包图标不显示解决方案
Electron打包图标不显示解决方案
3309 0
|
XML SQL Java
Mybatis之转义符的使用姿势
在 mybatis 的 xml 文件中直接写 sql 比较方便简洁,但是需要注意的是,在 xml 文件中,经常会遇到一些需要转义的场景,比如查询 id < xxx的数据,这个小于号就不能直接写在 sql 中,接下来我们将看一下,mybatis 中的有哪些转义符,可以怎么处理转义问题
1615 0
Mybatis之转义符的使用姿势
|
7月前
|
安全 Ubuntu 物联网
Debian 13.3 Trixie 发布 - 通用操作系统
Debian 13.3 “Trixie” 发布,包含 108 个错误修复和 37 个安全更新
805 0
Debian 13.3 Trixie 发布 - 通用操作系统
|
10月前
|
JSON API 数据处理
Swagger动态参数注解:使用@DynamicParameters实现JSON参数的灵活定义
总结起来,通过使用SpringFox提供给我们工具箱里面非常有力量但又不太显眼工具———即使面对复杂多变、非标准化数据格式也能轻松驾驭它们———从而大大增强我们系统与外界沟通交流能力同时也保证系统内部数据处理逻辑清晰明确易于维护升级.
548 10
|
Linux 数据安全/隐私保护 iOS开发
推荐Linux环境下效能优良的双向文件同步工具
综合上述条件,对于Linux环境下的双向文件同步需求,Unison 和 Syncthing 是两个非常出色的选择。它们都有良好的社区支持和文档资源,适用于不同规模的环境,从个人使用到商业部署。Unison 特别适合那些需要手动干预同步过程、需要处理文件冲突解决的场景。而 Syncthing 更加现代化,适合需要自动、实时的数据同步与备份的环境。对于选择哪一个,这将取决于个人的使用场景和具体需求。
1395 16
|
5G 网络架构
怎么区分5G卡片开启的网络类型是NSA(非独立组网)还是SA(独立组网)
要确定5G卡片开启的网络类型是NSA(非独立组网)还是SA(独立组网),你通常需要进行以下操作:
|
NoSQL Linux Shell
Linux MongoDB重启命令
【5月更文挑战第8天】
2003 6
|
JavaScript
Vue3描述列表(Descriptions)
该组件库包含 `Descriptions` 和 `DescriptionsItem` 两种组件,需配合使用。`Descriptions` 用于构建描述列表,提供标题、操作区、边框、垂直布局等配置;`DescriptionsItem` 作为列表项,可自定义标签和内容样式。支持响应式布局,并集成了多个实用工具函数,如节流、事件监听等。可通过属性灵活调整列表样式与布局。
1096 3
Vue3描述列表(Descriptions)
|
Java 数据库 关系型数据库
优秀的代码都是如何分层的?
好的应用分层应该做到1.方便后续代码进行维护扩展;2.分层的效果需要让整个团队都接受;3.各个层职责边界清晰。本文针对controller,service, mapper三个维度的应用分层进行整理,以优化后续代码的维护
10889 0
|
数据采集 SQL 分布式计算

热门文章

最新文章