文档章节

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

旁观者-郑昀
 旁观者-郑昀
发布于 2012/11/10 00:17
字数 927
阅读 497
收藏 2
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小时)

© 著作权归作者所有

旁观者-郑昀
粉丝 101
博文 77
码字总数 162785
作品 0
朝阳
私信 提问
ActiveMQ:No operations allowed after statement ...

ActiveMQ版本:5.5.1 记录人:@郑昀现象: 系统现象:部分消息发送失败,失败频率不正常。 日志信息:activemq.log 中一直有这样的错误日志: 看上去又是 mq broker 失去了数据库连接,但代码...

旁观者-郑昀
2012/11/10
191
0
构建ActiveMQ源代码报IOException

使用NetBeans构建activemq-parent-5.14.5-source-release的时候报错: testRecoveryOnArchiveFailure(org.apache.activemq.store.kahadb.JournalArchiveTest) Time elapsed: 3.444 sec <<< ......

kaiyuancn
2017/05/23
113
0
Zabbix监控ActiveMQ

当我们在线上使用了ActiveMQ 后,我们需要对一些参数进行监控,比如 消息是否有阻塞,哪个消息队列阻塞了,总的消息数是多少等等。下面我们就通过 Zabbix 结合 Python 脚本来实现对 ActiveMQ...

SEOwhywhy
2019/06/26
34
0
SpringBoot集成ActiveMQ抛出java.lang.NoClassDefFoundError异常

版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82732127 SpringBoot集成ActiveMQ抛出java.lang.NoClassDefFoundError异......

asing1elife
2018/09/17
0
0
ActiveMQ集群方案(下)

版权声明:欢迎转载,但是看在我辛勤劳动的份上,请注明来源:http://blog.csdn.net/yinwenjie(未经允许严禁用于商业用途!) https://blog.csdn.net/yinwenjie/article/details/51205822 目...

yunlielai
2018/04/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

用Markdown编程之类型

类型就是约定。而现有的类型是单纬度的。用标注法编程好处就是可以多维度。 类型基础分为: 虚 实 在此之上分为: 根 寄存器级 联 内存级 外 网络级 虚:说白了就是指针或索引之类的概念。之...

dwcz
7分钟前
21
0
WPF中的StaticResource和DynamicResource有什么区别?

在WPF中使用画笔,模板和样式等资源时,可以将它们指定为StaticResources <Rectangle Fill="{StaticResource MyBrush}" /> 或者作为DynamicResource <ItemsControl ItemTemplate="{DynamicR......

javail
33分钟前
49
0
Day07继承中的面试题 答案

1. 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。 class Zi extends Fu{ public int num = 20; public Zi(){ //super(); System.out.println("zi"); } 2.class Test......

Lao鹰
38分钟前
46
0
每天AC系列(四):四数之和

1 题目 Leetcode第18题,给定一个数组与一个target,找出数组中的四个数之和为target的不重复的所有四个数. 2 暴力 List<List<Integer>> result = new ArrayList<>();if (nums.length == 4 &......

Blueeeeeee
48分钟前
54
0
git clone --mirror和git clone --bare有什么区别

git clone帮助页面上有关于--mirror : 设置远程存储库的镜像。 这意味着--bare 。 但没有详细介绍--mirror克隆与--bare克隆--mirror不同。 #1楼 克隆将从远程服务器复制参考,并将其填充到名...

技术盛宴
今天
72
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部