当前位置: 首页 > 知识库问答 >
问题:

activemq - ActiveMQ集群使用MySQL8.0数据库连接问题排查?

吕英才
2024-12-11

ActiveMQ连接至MySQL8.0后定期异常重启问题

我部署了一个ActiveMQ集群,通过争用MySQL锁来竞选主节点。此前链接的是MySQL 5.7数据库,最近更新连到了MySQL8.0。使用中发现,大约每3-4天,后台服务都会报错,手动重启后又正常。
报错信息:
image.png
activemq.xml中关于持久化的配置:

       <persistenceAdapter>
          <!-- <kahaDB directory="${activemq.base}/data/kahadb"/>useDatabaseLock="true" createTablesOnStartup="false"   -->
               <jdbcPersistenceAdapter dataDirectory="${activemq.base}/data" dataSource="#mysql-ds" useDatabaseLock="true" createTablesOnStartup="false"/>
       </persistenceAdapter>

数据库连接的配置修改了红框的部分(从dbcp修改为dbcp2,driver换成cj)
image.png
这些数据库的jar包是新替换进去的
image.png

测试环境生产环境都有类似现象,3-4天当前的主机就会down调然后手动重启恢复正常。看报错感觉是连数据库的时候连接释放相关的问题,但是没分析出来原因。

共有1个答案

葛安和
2024-12-11

回答

可能的原因及排查步骤

  1. JDBC驱动版本

    • 确保你使用的MySQL JDBC驱动(如mysql-connector-java-8.x.x.jar)与MySQL 8.0服务器兼容。不兼容的驱动可能会导致连接问题或资源泄露。
  2. 连接池配置

    • 检查并优化dbcp2连接池的配置。特别是以下参数:

      • maxTotal: 连接池中最大连接数。
      • maxIdle: 连接池中最大空闲连接数。
      • minIdle: 连接池中最小空闲连接数。
      • maxWaitMillis: 获取连接时的最大等待时间。
    • 确保这些参数适合你的应用负载和数据库服务器的性能。
  3. 连接释放问题

    • 检查代码中是否正确地关闭了所有数据库连接。未关闭的连接可能会导致连接池耗尽,最终导致服务崩溃。
    • 使用连接池时,确保所有使用连接的代码块都使用try-with-resources语句或确保在finally块中关闭连接。
  4. MySQL 8.0特性变更

    • MySQL 8.0引入了一些新特性和变更,如默认的身份验证插件(caching_sha2_password)和SSL要求。
    • 确认你的连接字符串是否包含正确的身份验证插件和SSL参数。例如,如果你不使用SSL,可以在连接字符串中添加useSSL=false
    • 如果使用默认的身份验证插件,确保你的MySQL用户账户已正确配置。
  5. 日志和监控

    • 增加日志记录的详细程度,以便捕获更多关于连接失败和释放的信息。
    • 监控数据库连接池的状态,包括活动连接数、空闲连接数和等待连接数。
  6. ActiveMQ配置

    • 检查<jdbcPersistenceAdapter>的其他配置选项,如lockKeepAlivePeriod,确保它适合你的集群环境。
    • 如果可能,尝试回滚到MySQL 5.7以确认问题是否与MySQL 8.0相关。
  7. 系统资源

    • 检查服务器的CPU、内存和磁盘使用情况,以确保资源不是导致问题的原因。
  8. 网络问题

    • 检查网络配置和稳定性,确保没有网络故障导致连接中断。

结论

问题可能与JDBC驱动版本、连接池配置、连接释放、MySQL 8.0特性变更、日志和监控不足、ActiveMQ配置不当或系统资源限制有关。建议逐一排查上述可能的原因,并根据需要调整配置或代码。如果问题依旧存在,可能需要更详细的日志信息或进一步的系统监控来诊断问题。

 类似资料:
  • 我有两个ActiveMQ Artemis实例,只需使用命令/.Artemis创建Artemis/server1和 /.Artemis创建Artemis/server2 以下是服务器1的broker.xml: 下面是服务器2的broker.xml: 同样在server2中,Bootstrap.xml中的更改更改了web绑定端口 我正在用StaticClusteredQueueExample和这个示例

  • 我注意到,当连接的Artemis节点宕机时,连接到节点2-4的客户机不会故障转移到其他3个可用的主节点,基本上不会发现其他节点。即使在原始节点恢复之后,客户端仍然无法建立连接。我从一个单独的堆栈溢出帖子中看到,不支持主到主故障转移。这是否意味着对于每个主节点,我也需要创建一个从节点来处理故障转移?这是否会导致两个实例点失败,而不是集群中有许多节点? 在一个单独的基本测试中,使用一个主从两个节点的集

  • 我已经尝试只使用一个节点,它正在工作。现在我必须修改代码中的,以便它能够与集群连接。 在ActiveMQ Artemis文档中,我发现了如下内容: JavaDoc表示:

  • 我是ActiveMQ Artemis新手, 我试图理解ActiveMQ Artemis中的对称集群。 这里是我试图理解的例子。 我正在从集群节点获取正在使用的主题消息和队列消息列表,如何获取关于节点的信息意味着哪个节点正在返回这些信息(队列消息/主题消息)

  • 从服务器1的web控制台创建的消息在服务器2的web控制台中不可见。这种配置有什么问题? web控制台中的状态:

  • 我可以成功地ping系统。防火墙未启用,我可以到达web控制台。我遵循了这个指南来设置它,但我想我遗漏了一些东西。QueueExplorer需要Jolokia和OpenWire。web控制台使用Jolokia,但QueueExplorer中的错误会对此进行投诉。 当使用QueueExplorer连接到ActiveMQ时,我不需要进行任何配置更改。在Artemis中是否有允许客户端连接的附加步骤?

  • 我使用spring boot data redis连接到redis群集,使用版本2.1.3,配置如下: 但是,在操作过程中,始终会收到警告异常消息,如下所示: 这似乎是莴苣的问题,如何映射远程主机

  • 我知道这个问题在这里被问了很多次,我也听了很多对话,但我运气不好。ActiveMQ浏览器和ActiveMQ无法连接。 所以我在这里再次询问,并附上我在当地掌握的全部信息。 JDK 1.8 服务:jmx:rmi:///jndi/rmi://E105756:1616/jmxrmi角色:管理员密码:activemq 无法启动QBrowserV2无法连接到ActiveMQ JMX服务器。 请确保JMX服务