zoukankan      html  css  js  c++  java
  • MQ:Communications link failure

    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,查询的是会话变量,你会误以为设置没有生效。
    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小时)』
     
    本文引自:http://www.cnblogs.com/zhengyun_ustc/archive/2012/11/10/activemq_wait_timeout.html
  • 相关阅读:
    Hybrid APP基础篇(四)->JSBridge的原理
    剑指offer
    剑指offer
    如何在HTML中设置文本的大小写
    如何给HTML标签中的文本设置修饰线
    CSS设置文本的水平对齐方向
    如何在HTML中设置字体颜色,你知道这几种方式吗?
    CSS尺寸样式属性
    CSS基本选择器是什么?基本选择器是如何工作
    如何创建 CSS
  • 原文地址:https://www.cnblogs.com/guohui-y/p/5230728.html
Copyright © 2011-2022 走看看